Aplikasi Pemantauan

Elemen API dari Dynamic Data Exchange Management Library (DDEML) dapat digunakan untuk membuat aplikasi yang memantau aktivitas Dynamic Data Exchange (DDE) dalam sistem. Seperti aplikasi DDEML apa pun, aplikasi pemantauan DDE berisi fungsi panggilan balik DDE. DDEML memberi tahu fungsi panggilan balik DDE aplikasi pemantauan setiap kali peristiwa DDE terjadi, meneruskan informasi tentang peristiwa ke fungsi panggilan balik. Aplikasi biasanya menampilkan informasi di jendela atau menulisnya ke file.

Untuk menerima pemberitahuan dari DDEML, aplikasi harus terdaftar sebagai monitor DDE dengan menentukan bendera APPCLASS_MONITOR dalam panggilan ke fungsi DdeInitialize. Dalam panggilan yang sama ini, aplikasi dapat menentukan satu atau beberapa bendera monitor untuk menunjukkan jenis peristiwa di mana DDEML akan memberi tahu fungsi panggilan balik aplikasi. Bendera monitor berikut dapat ditentukan oleh aplikasi:

Bendera Deskripsi
MF_CALLBACKS Memberi tahu fungsi panggilan balik setiap kali transaksi dikirim ke fungsi panggilan balik DDE apa pun dalam sistem.
MF_CONV Memberi tahu fungsi panggilan balik setiap kali percakapan dibuat atau dihentikan.
MF_ERRORS Memberi tahu fungsi panggilan balik setiap kali terjadi kesalahan DDEML.
MF_HSZ_INFO Memberi tahu fungsi panggilan balik setiap kali aplikasi DDEML membuat, membebaskan, atau menaikkan jumlah penggunaan handel string atau setiap kali handel string dibebaskan sebagai akibat dari panggilan ke fungsi DdeUninitialize.
MF_LINKS Memberi tahu fungsi panggilan balik setiap kali perulangan saran dimulai atau berakhir.
MF_POSTMSGS Memberi tahu fungsi panggilan balik setiap kali sistem atau aplikasi memposting pesan DDE.
MF_SENDMSGS Memberi tahu fungsi panggilan balik setiap kali sistem atau aplikasi mengirim pesan DDE.

 

Contoh berikut menunjukkan cara mendaftarkan aplikasi pemantauan DDE sehingga fungsi panggilan balik DDE-nya menerima pemberitahuan semua peristiwa 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 menginformasikan aplikasi pemantauan peristiwa DDE dengan mengirim transaksi XTYP_MONITOR ke fungsi panggilan balik DDE aplikasi. Selama transaksi ini, DDEML meneruskan bendera monitor yang menentukan jenis peristiwa DDE yang telah terjadi dan handel ke objek DDE yang berisi informasi terperinci tentang peristiwa tersebut. DDEML menyediakan serangkaian struktur yang dapat digunakan aplikasi untuk mengekstrak informasi dari objek DDE. Ada struktur yang sesuai untuk setiap jenis peristiwa DDE.

Struktur Deskripsi
MONCBSTRUCT Berisi informasi tentang transaksi.
MONCONVSTRUCT Berisi informasi tentang percakapan.
MONERRSTRUCT Berisi informasi tentang kesalahan DDE terbaru.
MONLINKSTRUCT Berisi informasi tentang perulangan saran.
MONHSZSTRUCT Berisi informasi tentang handel string.
MONMSGSTRUCT Berisi informasi tentang pesan DDE yang dikirim atau diposting.

 

Contoh berikut menunjukkan fungsi panggilan balik DDE dari aplikasi pemantauan DDE yang memformat informasi tentang setiap peristiwa handel string lalu menampilkan informasi di jendela. Fungsi ini menggunakan struktur MONHSZSTRUCT untuk mengekstrak informasi dari objek 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; 
}