애플리케이션 모니터링
DDEML(동적 데이터 교환 관리 라이브러리)의 API 요소를 사용하여 시스템에서 DDE(동적 데이터 교환) 작업을 모니터링하는 애플리케이션을 만들 수 있습니다. DDEML 애플리케이션과 마찬가지로 DDE 모니터링 애플리케이션에는 DDE 콜백 함수가 포함되어 있습니다. DDEML은 DDE 이벤트가 발생할 때마다 모니터링 애플리케이션의 DDE 콜백 함수에 알리고 이벤트에 대한 정보를 콜백 함수에 전달합니다. 애플리케이션은 일반적으로 창에 정보를 표시하거나 파일에 씁니다.
DDEML에서 알림을 받으려면 DdeInitialize 함수 호출에서 APPCLASS_MONITOR 플래그를 지정하여 애플리케이션이 DDE 모니터로 등록되어 있어야 합니다. 동일한 호출에서 애플리케이션은 하나 이상의 모니터 플래그를 지정하여 DDEML이 애플리케이션의 콜백 함수에 알리는 이벤트 유형을 나타낼 수 있습니다. 애플리케이션에서 다음 모니터 플래그를 지정할 수 있습니다.
플래그 | 설명 |
---|---|
MF_CALLBACKS | 트랜잭션이 시스템의 DDE 콜백 함수로 전송 될 때마다 콜백 함수를 알 수 있습니다. |
MF_CONV | 대화가 설정되거나 종료될 때마다 콜백 함수에 알 수 있습니다. |
MF_ERRORS | DDEML 오류가 발생할 때마다 콜백 함수에 알린 것입니다. |
MF_HSZ_INFO | DDEML 애플리케이션이 문자열 핸들의 사용 횟수를 생성, 해제 또는 증가하거나 DdeUninitialize 함수 호출의 결과로 문자열 핸들이 해제 될 때마다 콜백 함수에 알려줍니다. |
MF_LINKS | advise 루프가 시작되거나 종료될 때마다 콜백 함수에 알 수 있습니다. |
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 | advise 루프에 대한 정보를 포함합니다. |
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;
}