Freigeben über


Überwachen von Anwendungen

Die API-Elemente der Dynamic Data Exchange Management Library (DDEML) können verwendet werden, um eine Anwendung zu erstellen, die DDE-Aktivitäten (Dynamic Data Exchange) im System überwacht. Wie jede DDEML-Anwendung enthält auch eine DDE-Überwachungsanwendung eine DDE-Rückruffunktion. Die DDEML benachrichtigt die DDE-Rückruffunktion einer Überwachungsanwendung, wenn ein DDE-Ereignis auftritt, und übergibt Informationen zum Ereignis an die Rückruffunktion. Die Anwendung zeigt die Informationen in der Regel in einem Fenster an oder schreibt sie in eine Datei.

Um Benachrichtigungen von der DDEML zu erhalten, muss eine Anwendung als DDE-Monitor registriert sein, indem sie das flag APPCLASS_MONITOR in einem Aufruf der DdeInitialize-Funktion angibt. In diesem Aufruf kann die Anwendung ein oder mehrere Monitorflags angeben, um die Ereignistypen anzugeben, für die die DDEML die Rückruffunktion der Anwendung benachrichtigen soll. Die folgenden Monitorflags können von einer Anwendung angegeben werden:

Flag Beschreibung
MF_CALLBACKS Benachrichtigt die Rückruffunktion, wenn eine Transaktion an eine DDE-Rückruffunktion im System gesendet wird.
MF_CONV Benachrichtigt die Rückruffunktion, wenn eine Konversation eingerichtet oder beendet wird.
MF_ERRORS Benachrichtigt die Rückruffunktion, wenn ein DDEML-Fehler auftritt.
MF_HSZ_INFO Benachrichtigt die Rückruffunktion, wenn eine DDEML-Anwendung die Nutzungsanzahl eines Zeichenfolgenhandles erstellt, freigibt oder erhöht oder wenn ein Zeichenfolgenhandle als Ergebnis eines Aufrufs der DdeUninitialize-Funktion freigegeben wird.
MF_LINKS Benachrichtigt die Rückruffunktion, wenn eine Empfehlungsschleife gestartet oder beendet wird.
MF_POSTMSGS Benachrichtigt die Rückruffunktion, wenn das System oder eine Anwendung eine DDE-Nachricht sendet.
MF_SENDMSGS Benachrichtigt die Rückruffunktion, wenn das System oder eine Anwendung eine DDE-Nachricht sendet.

 

Das folgende Beispiel zeigt, wie Sie eine DDE-Überwachungsanwendung registrieren, damit die DDE-Rückruffunktion Benachrichtigungen zu allen DDE-Ereignissen empfängt.

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; 
}

Die DDEML informiert eine Überwachungsanwendung über ein DDE-Ereignis, indem eine XTYP_MONITOR Transaktion an die DDE-Rückruffunktion der Anwendung gesendet wird. Während dieser Transaktion übergibt die DDEML ein Monitorflag, das den Typ des aufgetretenen DDE-Ereignisses angibt, sowie ein Handle an ein DDE-Objekt, das detaillierte Informationen zum Ereignis enthält. Die DDEML stellt eine Reihe von Strukturen bereit, die die Anwendung verwenden kann, um die Informationen aus dem DDE-Objekt zu extrahieren. Für jeden DDE-Ereignistyp gibt es eine entsprechende Struktur.

Struktur Beschreibung
MONCBSTRUCT Enthält Informationen zu einer Transaktion.
MONCONVSTRUCT Enthält Informationen zu einer Unterhaltung.
MONERRSTRUCT Enthält Informationen zum aktuellen DDE-Fehler.
MONLINKSTRUCT Enthält Informationen zu einer Empfehlungsschleife.
MONHSZSTRUCT Enthält Informationen zu einem Zeichenfolgenhandle.
MONMSGSTRUCT Enthält Informationen zu einer DDE-Nachricht, die gesendet oder gepostet wurde.

 

Das folgende Beispiel zeigt die DDE-Rückruffunktion einer DDE-Überwachungsanwendung, die Informationen zu jedem Zeichenfolgenhandleereignis formatiert und dann die Informationen in einem Fenster anzeigt. Die Funktion verwendet die MONHSZSTRUCT-Struktur , um die Informationen aus dem DDE-Objekt zu extrahieren.

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; 
}