Partager via


Surveillance des applications de

Les éléments API de la bibliothèque de gestion DDEML (Dynamic Data Exchange Management Library) peuvent être utilisés pour créer une application qui surveille l’activité DDE (Dynamic Data Exchange) dans le système. Comme toute application DDEML, une application de supervision DDE contient une fonction de rappel DDE. Le DDEML notifie la fonction de rappel DDE d’une application de surveillance chaque fois qu’un événement DDE se produit, en transmettant des informations sur l’événement à la fonction de rappel. L’application affiche généralement les informations dans une fenêtre ou les écrit dans un fichier.

Pour recevoir des notifications du DDEML, une application doit s’être inscrite en tant que moniteur DDE en spécifiant l’indicateur APPCLASS_MONITOR dans un appel à la fonction DdeInitialize . Dans ce même appel, l’application peut spécifier un ou plusieurs indicateurs de surveillance pour indiquer les types d’événements pour lesquels le DDEML doit notifier la fonction de rappel de l’application. Les indicateurs de surveillance suivants peuvent être spécifiés par une application :

Indicateur Description
MF_CALLBACKS Notifie la fonction de rappel chaque fois qu’une transaction est envoyée à une fonction de rappel DDE dans le système.
MF_CONV Notifie la fonction de rappel chaque fois qu’une conversation est établie ou terminée.
MF_ERRORS Notifie la fonction de rappel chaque fois qu’une erreur DDEML se produit.
MF_HSZ_INFO Notifie la fonction de rappel chaque fois qu’une application DDEML crée, libère ou incrémente le nombre d’utilisations d’un handle de chaîne ou chaque fois qu’un handle de chaîne est libéré à la suite d’un appel à la fonction DdeUninitialize .
MF_LINKS Notifie la fonction de rappel chaque fois qu’une boucle d’avertissement est démarrée ou terminée.
MF_POSTMSGS Notifie la fonction de rappel chaque fois que le système ou une application publie un message DDE.
MF_SENDMSGS Notifie la fonction de rappel chaque fois que le système ou une application envoie un message DDE.

 

L’exemple suivant montre comment inscrire une application de supervision DDE afin que sa fonction de rappel DDE reçoive des notifications de tous les événements 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; 
}

Le DDEML informe une application de surveillance d’un événement DDE en envoyant une transaction XTYP_MONITOR à la fonction de rappel DDE de l’application. Pendant cette transaction, le DDEML transmet un indicateur de surveillance qui spécifie le type d’événement DDE qui s’est produit et un handle à un objet DDE qui contient des informations détaillées sur l’événement. DDEML fournit un ensemble de structures que l’application peut utiliser pour extraire les informations de l’objet DDE. Il existe une structure correspondante pour chaque type d’événement DDE.

Structure Description
MONCBSTRUCT Contient des informations sur une transaction.
MONCONVSTRUCT Contient des informations sur une conversation.
MONERRSTRUCT Contient des informations sur la dernière erreur DDE.
MONLINKSTRUCT Contient des informations sur une boucle de conseil.
MONHSZSTRUCT Contient des informations sur un handle de chaîne.
MONMSGSTRUCT Contient des informations sur un message DDE qui a été envoyé ou publié.

 

L’exemple suivant montre la fonction de rappel DDE d’une application de supervision DDE qui met en forme des informations sur chaque événement de handle de chaîne, puis affiche les informations dans une fenêtre. La fonction utilise la structure MONHSZSTRUCT pour extraire les informations de l’objet 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; 
}