Aplicativos de monitoramento

Os elementos de API da Biblioteca de Gerenciamento de Intercâmbio de Dados Dinâmicos (DDEML) podem ser usados para criar um aplicativo que monitora a atividade de Intercâmbio Dinâmico de Dados (DDE) no sistema. Como qualquer aplicativo DDEML, um aplicativo de monitoramento DDE contém uma função de retorno de chamada DDE. O DDEML notifica a função de retorno de chamada DDE de um aplicativo de monitoramento sempre que ocorre um evento DDE, passando informações sobre o evento para a função de retorno de chamada. O aplicativo normalmente exibe as informações em uma janela ou as grava em um arquivo.

Para receber notificações do DDEML, um aplicativo deve ter sido registrado como um monitor DDE especificando o sinalizador APPCLASS_MONITOR em uma chamada para a função DdeInitialize. Nessa mesma chamada, o aplicativo pode especificar um ou mais sinalizadores de monitor para indicar os tipos de eventos para os quais o DDEML deve notificar a função de retorno de chamada do aplicativo. Os seguintes sinalizadores de monitor podem ser especificados por um aplicativo:

Sinalizador Descrição
MF_CALLBACKS Notifica a função de retorno de chamada sempre que uma transação é enviada para qualquer função de retorno de chamada DDE no sistema.
MF_CONV Notifica a função de retorno de chamada sempre que uma conversa é estabelecida ou encerrada.
MF_ERRORS Notifica a função de retorno de chamada sempre que ocorre um erro DDEML.
MF_HSZ_INFO Notifica a função de retorno de chamada sempre que um aplicativo DDEML cria, libera ou incrementa a contagem de uso de um identificador de cadeia de caracteres ou sempre que um identificador de cadeia de caracteres é liberado como resultado de uma chamada para a função DdeUninitialize.
MF_LINKS Notifica a função de retorno de chamada sempre que um loop de aviso é iniciado ou encerrado.
MF_POSTMSGS Notifica a função de retorno de chamada sempre que o sistema ou um aplicativo posta uma mensagem DDE.
MF_SENDMSGS Notifica a função de retorno de chamada sempre que o sistema ou um aplicativo envia uma mensagem DDE.

 

O exemplo a seguir mostra como registrar um aplicativo de monitoramento DDE para que sua função de retorno de chamada DDE receba notificações de todos os eventos 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; 
}

O DDEML informa um aplicativo de monitoramento de um evento DDE enviando uma transação XTYP_MONITOR para a função de retorno de chamada DDE do aplicativo. Durante essa transação, o DDEML passa um sinalizador de monitor que especifica o tipo de evento DDE que ocorreu e um identificador para um objeto DDE que contém informações detalhadas sobre o evento. O DDEML fornece um conjunto de estruturas que o aplicativo pode usar para extrair as informações do objeto DDE. Há uma estrutura correspondente para cada tipo de evento DDE.

Estrutura Descrição
MONCBSTRUCT Contém informações sobre uma transação.
MONCONVSTRUCT Contém informações sobre uma conversa.
MONERRSTRUCT Contém informações sobre o erro DDE mais recente.
MONLINKSTRUCT Contém informações sobre um loop de aconselhamento.
MONHSZSTRUCT Contém informações sobre um identificador de cadeia de caracteres.
MONMSGSTRUCT Contém informações sobre uma mensagem DDE que foi enviada ou postada.

 

O exemplo a seguir mostra a função de retorno de chamada DDE de um aplicativo de monitoramento DDE que formata informações sobre cada evento de identificador de cadeia de caracteres e, em seguida, exibe as informações em uma janela. A função usa a estrutura MONHSZSTRUCT para extrair as informações do objeto 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; 
}