監視應用程式

動態數據交換管理連結庫 (DDEML) 的 API 元素可用來建立應用程式,以監視系統中的動態數據交換 (DDE) 活動。 如同任何 DDEML 應用程式,DDE 監視應用程式包含 DDE 回呼函式。 每當發生 DDE 事件時,DDEML 就會通知監視應用程式的 DDE 回呼函式,將事件的相關信息傳遞至回呼函式。 應用程式通常會在視窗中顯示資訊,或將它寫入檔案。

若要從 DDEML 接收通知,應用程式必須在呼叫 DdeInitialize 函式時指定APPCLASS_MONITOR旗標,以註冊為 DDE 監視器。 在這個相同的呼叫中,應用程式可以指定一或多個監視旗標,以指出 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 會將XTYP_MONITOR交易傳送至應用程式的 DDE 回呼函式,以通知 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; 
}