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