監視應用程式
動態數據交換管理連結庫 (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;
}