Мониторинг приложений
Элементы API библиотеки управления Динамическими данными Exchange (DDEML) можно использовать для создания приложения, которое отслеживает действие Динамического обмена данными (DDE) в системе. Как и любое приложение DDEML, приложение мониторинга DDE содержит функцию обратного вызова DDE. DDEML уведомляет функцию обратного вызова DDE приложения мониторинга при каждом возникновении события DDE, передавая сведения о событии в функцию обратного вызова. Приложение обычно отображает сведения в окне или записывает его в файл.
Чтобы получать уведомления от DDEML, приложение должно быть зарегистрировано в качестве монитора DDE, указав флаг APPCLASS_MONITOR в вызове функции DdeInitialize . В этом же вызове приложение может указать один или несколько флагов монитора, чтобы указать типы событий, для которых DDEML будет уведомлять функцию обратного вызова приложения. Следующие флаги монитора можно указать приложением:
Флаг | Description |
---|---|
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.
Структура | Description |
---|---|
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;
}