2016年12月29日木曜日

DLGINIT とは

 今さら COM とか古の技術を掘り起こすのも大変な話です…

/////////////////////////////////////////////////////////////////////////////
//
// Dialog Info
//

IDD_TOACROPDF2 DLGINIT
BEGIN
    IDC_PDF1, 0x376, 16, 0
0x0000, 0x0000, 0x0c00, 0x0000, 0x20f8, 0x0000, 0x19f1, 0x0000,
    0
END

構造:

WORD nIDC;
WORD nMsg;
DWORD dwLen;
BYTE data[dwLen];

// nMsg:
//  ATL_WM_OCC_LOADFROMSTREAM = 0x0376,
//  ATL_WM_OCC_LOADFROMSTORAGE = 0x0377,
//  ATL_WM_OCC_INITNEW = 0x0378,
//  ATL_WM_OCC_LOADFROMSTREAM_EX = 0x037A,
//  ATL_WM_OCC_LOADFROMSTORAGE_EX = 0x037B,
//  ATL_DISPID_DATASOURCE = 0x80010001,
//  ATL_DISPID_DATAFIELD = 0x80010002,

出典 (atlwin.h) より:

    // Find the initialization data (Stream) for the control specified by the ID
    // If found, return the pointer into the data and the length of the data
    static DWORD FindCreateData(DWORD dwID, BYTE* pInitData, BYTE** pData)
    {
        while (pInitData)
        {
            // Read the DLGINIT header
            WORD nIDC = *((UNALIGNED WORD*)pInitData);
            pInitData += sizeof(WORD);
            BYTE* pTemp = pInitData;
            WORD nMsg = *((UNALIGNED WORD*)pInitData);
            pInitData += sizeof(WORD);
            DWORD dwLen = *((UNALIGNED DWORD*)pInitData);
            pInitData += sizeof(DWORD);

LOADFROMSTREAM が嫌で INITNEW にしたい場合は、つぎのようにしたら良いようです。

/////////////////////////////////////////////////////////////////////////////
//
// Dialog Info
//

IDD_TOACROPDF2 DLGINIT
BEGIN
    IDC_PDF1, 0x378, 0, 0,
    0
END

0 件のコメント:

コメントを投稿