Share via


アプリケーションの監視

動的データ交換管理ライブラリ (DDEML) の API 要素を使用して、システム内の動的データ交換 (DDE) アクティビティを監視するアプリケーションを作成できます。 DDEML アプリケーションと同様に、DDE 監視アプリケーションには DDE コールバック関数が含まれています。 DDEML は、DDE イベントが発生するたびに監視アプリケーションの DDE コールバック関数に通知し、イベントに関する情報をコールバック関数に渡します。 通常、アプリケーションはウィンドウに情報を表示するか、ファイルに書き込みます。

DDEML から通知を受信するには、 DdeInitialize 関数の呼び出しで APPCLASS_MONITOR フラグを指定することによって、アプリケーションが DDE モニターとして登録されている必要があります。 この同じ呼び出しでは、アプリケーションは 1 つ以上のモニター フラグを指定して、DDEML がアプリケーションのコールバック関数に通知するイベントの種類を示すことができます。 アプリケーションでは、次のモニター フラグを指定できます。

フラグ 説明
MF_CALLBACKS トランザクションがシステム内の任意の DDE コールバック関数に送信されるたびにコールバック関数に通知します。
MF_CONV 会話が確立または終了されるたびにコールバック関数に通知します。
MF_ERRORS DDEML エラーが発生するたびにコールバック関数に通知します。
MF_HSZ_INFO DDEML アプリケーションが文字列ハンドルの使用カウントを作成、解放、またはインクリメントするたびに、または DdeUninitialize 関数の呼び出しの結果として文字列ハンドルが解放されるたびに、コールバック関数に通知します。
MF_LINKS アドバイズ ループが開始または終了するたびにコールバック関数に通知します。
MF_POSTMSGS システムまたはアプリケーションが DDE メッセージをポストするたびにコールバック関数に通知します。
MF_SENDMSGS システムまたはアプリケーションが DDE メッセージを送信するたびにコールバック関数に通知します。

 

次の例は、DDE コールバック関数がすべての DDE イベントの通知を受信するように DDE 監視アプリケーションを登録する方法を示しています。

DWORD idInst; 
PFNCALLBACK lpDdeProc; 
hInst = hInstance; 
 
if (DdeInitialize( 
        (LPDWORD) &idInst,  // instance identifier 
        DDECallback,        // pointer to callback function 
        APPCLASS_MONITOR |  // this is a monitoring application 
        MF_CALLBACKS     |  // monitor callback functions 
        MF_CONV          |  // monitor conversation data 
        MF_ERRORS        |  // monitor DDEML errors 
        MF_HSZ_INFO      |  // monitor data handle activity 
        MF_LINKS         |  // monitor advise loops 
        MF_POSTMSGS      |  // monitor posted DDE messages 
        MF_SENDMSGS,        // monitor sent DDE messages 
        0))                 // reserved 
{
    return FALSE; 
}

DDEML は、アプリケーションの DDE コールバック関数に XTYP_MONITOR トランザクションを送信することによって、DDE イベントを監視アプリケーションに通知します。 このトランザクションの間、DDEML は、発生した DDE イベントの種類と、イベントに関する詳細情報を含む DDE オブジェクトへのハンドルを指定するモニター フラグを渡します。 DDEML は、アプリケーションが DDE オブジェクトから情報を抽出するために使用できる一連の構造体を提供します。 DDE イベントの種類ごとに対応する構造があります。

構造体 説明
MONCBSTRUCT トランザクションに関する情報を格納します。
MONCONVSTRUCT 会話に関する情報が含まれます。
MONERRSTRUCT 直近のDDE エラーに関する情報が含まれています。
MONLINKSTRUCT アドバイズ ループに関する情報が含まれています。
MONHSZSTRUCT 文字列ハンドルに関する情報を格納します。
MONMSGSTRUCT 送信または投稿された DDE メッセージに関する情報が含まれます。

 

次の例は、各文字列ハンドル イベントに関する情報を書式設定し、ウィンドウに情報を表示する DDE 監視アプリケーションの DDE コールバック関数を示しています。 この関数は、 MONHSZSTRUCT 構造体を使用して DDE オブジェクトから情報を抽出します。

HDDEDATA CALLBACK DDECallback(uType, uFmt, hconv, hsz1, hsz2, 
    hdata, dwData1, dwData2) 
UINT uType; 
UINT uFmt; 
HCONV hconv; 
HSZ hsz1; 
HSZ hsz2; 
HDDEDATA hdata; 
DWORD dwData1; 
DWORD dwData2; 
{ 
    LPVOID lpData; 
    CHAR *szAction; 
    CHAR szBuf[256]; 
    DWORD cb;
    HRESULT hResult; 
 
    switch (uType) 
    { 
        case XTYP_MONITOR: 
            // Obtain a pointer to the global memory object. 
 
            if (lpData = DdeAccessData(hdata, &cb)) 
            { 
                // Examine the monitor flag. 
 
                switch (dwData2) 
                { 
                    case MF_HSZ_INFO: 
 
#define PHSZS ((MONHSZSTRUCT *)lpData) 
 
                        // The global memory object contains 
                        // string handle data. Use the MONHSZSTRUCT 
                        // structure to access the data. 
 
                        switch (PHSZS->fsAction) 
                        { 
                            // Examine the action flags to determine
                            // the action performed on the handle.
 
                            case MH_CREATE: 
                                szAction = "Created"; 
                                break; 
 
                            case MH_KEEP: 
                                szAction = "Incremented"; 
                                break; 
 
                            case MH_DELETE: 
                                szAction = "Deleted"; 
                                break; 
 
                            case MH_CLEANUP: 
                                szAction = "Cleaned up"; 
                                break; 
 
                            default: 
                                DdeUnaccessData(hdata); 
                                return (HDDEDATA) 0; 
                        } 
 
                        // Write formatted output to a buffer. 
                        hResult = StringCchPrintf(szBuf, 256/sizeof(TCHAR),
                            "Handle %s, Task: %x, Hsz: %lx(%s)", 
                            (LPSTR) szAction, PHSZS->hTask, 
                            PHSZS->hsz, (LPSTR) PHSZS->str);
                        if (FAILED(hResult))
                        {
                        // TO DO: Write error handler.
                            return;
                        } 
                        // Display text or write to a file. 
 
                        break; 
 
#undef PHSZS 
 
                    // Process other MF_* flags. 
 
                    default: 
                        break; 
                } 
            } 
 
            // Free the global memory object. 
 
            DdeUnaccessData(hdata); 
            break; 
 
        default: 
            break; 
    } 
    return (HDDEDATA) 0; 
}