Condividi tramite


Monitoraggio di applicazioni

Gli elementi API della libreria DDEML (Dynamic Data Exchange Management Library) possono essere usati per creare un'applicazione che monitora l'attività DDE (Dynamic Data Exchange) nel sistema. Come qualsiasi applicazione DDEML, un'applicazione di monitoraggio DDE contiene una funzione di callback DDE. DDEML invia una notifica alla funzione di callback DDE di un'applicazione di monitoraggio ogni volta che si verifica un evento DDE, passando informazioni sull'evento alla funzione di callback. L'applicazione visualizza in genere le informazioni in una finestra o le scrive in un file.

Per ricevere notifiche da DDEML, è necessario che un'applicazione sia registrata come monitor DDE specificando il flag APPCLASS_MONITOR in una chiamata alla funzione DdeInitialize. In questa stessa chiamata, l'applicazione può specificare uno o più flag di monitoraggio per indicare i tipi di eventi per cui dDEML deve notificare alla funzione di callback dell'applicazione. I flag di monitoraggio seguenti possono essere specificati da un'applicazione:

Flag Descrizione
MF_CALLBACKS Notifica alla funzione di callback ogni volta che una transazione viene inviata a qualsiasi funzione di callback DDE nel sistema.
MF_CONV Notifica alla funzione di callback ogni volta che viene stabilita o terminata una conversazione.
MF_ERRORS Notifica alla funzione di callback ogni volta che si verifica un errore DDEML.
MF_HSZ_INFO Notifica alla funzione di callback ogni volta che un'applicazione DDEML crea, libera o incrementa il numero di utilizzo di un handle stringa o ogni volta che un handle stringa viene liberato in seguito a una chiamata alla funzione DdeUninitialize.
MF_LINKS Notifica alla funzione di callback ogni volta che viene avviato o terminato un ciclo di avviso.
MF_POSTMSGS Notifica alla funzione di callback ogni volta che il sistema o un'applicazione pubblica un messaggio DDE.
MF_edizione Standard NDMSGS Notifica alla funzione di callback ogni volta che il sistema o un'applicazione invia un messaggio DDE.

 

L'esempio seguente illustra come registrare un'applicazione di monitoraggio DDE in modo che la relativa funzione di callback DDE riceva le notifiche di tutti gli eventi 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 informa un'applicazione di monitoraggio di un evento DDE inviando una transazione XTYP_MONITOR alla funzione di callback DDE dell'applicazione. Durante questa transazione, DDEML passa un flag di monitoraggio che specifica il tipo di evento DDE che si è verificato e un handle a un oggetto DDE che contiene informazioni dettagliate sull'evento. DDEML fornisce un set di strutture che l'applicazione può usare per estrarre le informazioni dall'oggetto DDE. Esiste una struttura corrispondente per ogni tipo di evento DDE.

Struttura Descrizione
TYPEBSTRUCT Contiene informazioni su una transazione.
MONCONVSTRUCT Contiene informazioni su una conversazione.
MONERRSTRUCT Contiene informazioni sull'errore DDE più recente.
MONLINKSTRUCT Contiene informazioni su un ciclo di consigli.
MONHSZSTRUCT Contiene informazioni su un handle di stringa.
MONMSGSTRUCT Contiene informazioni su un messaggio DDE inviato o pubblicato.

 

Nell'esempio seguente viene illustrata la funzione di callback DDE di un'applicazione di monitoraggio DDE che formatta informazioni su ogni evento di handle di stringa e quindi visualizza le informazioni in una finestra. La funzione usa la struttura MONHSZSTRUCT per estrarre le informazioni dall'oggetto 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; 
}