アプリケーションの監視
動的データ交換管理ライブラリ (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;
}