Мониторинг приложений

Элементы 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; 
}