DDEML的应用程序编程接口(API)元素可用于创建一个监视系统中DDE活动的应用程序。像任何DDEML应用程序一样,DDE监视应用程序包含一个DDE回调函数。当DDE事件发生时,DDEML会通知监视应用程序的DDE回调函数,将关于事件的信息传递给回调函数。应用程序通常在窗口中显示信息或将其写入文件。
要从DDEML接收通知,应用程序必须通过在调用DdeInitialize函数中指定APPCLASS_MONITOR标志来注册为DDE监视器。在同一个调用中,应用程序可以指定一个或多个监视器标志,以指示DDEML要通知应用程序的回调函数的事件类型。应用程序可以指定以下监视器标志:
旗 | 描述 |
MF_CALLBACKS | 当事务发送到系统中的任何DDE回调函数时通知回调函数。 |
MF_CONV | 通话建立或终止时通知回调功能。 |
MF_ERRORS | 当发生DDEML错误时通知回调函数。 |
MF_HSZ_INFO | 当DDEML应用程序创建,释放或增加字符串句柄的使用次数时,或者当调用DdeUninitialize函数的结果释放字符串句柄时,通知回调函数。 |
MF_LINKS | 每当建议循环启动或结束时通知回调函数。 |
MF_POSTMSGS | 系统或应用程序发布DDE消息时通知回调函数。 |
MF_SENDMSGS | 系统或应用程序发送DDE消息时通知回调函数。 |
以下示例显示如何注册DDE监视应用程序,使其DDE回调函数接收到所有DDE事件的通知。
DWORD idInst;
PFNCALLBACK lpDdeProc;
hInst = hInstance;
if(DdeInitialize(
(LPDWORD)& idInst,/ *实例标识符* /en
DDECallback,/ *指向回调函数* /
APPCLASS_MONITOR | / *这是一个监控应用程序* /
MF_CALLBACKS | / *监听回调函数* /
MF_CONV | / *监控对话数据* /
MF_ERRORS | / *监视DDEML错误* /
MF_HSZ_INFO | / *监控数据处理活动* /
MF_LINKS | / *监控建议循环* /
MF_POSTMSGS | / *监控发布的DDE消息* /
MF_SENDMSGS,/ *监控发送DDE消息* /
0))/ *保留* /
return FALSE;
DDEML通过向应用程序的DDE回调函数发送一个XTYP_MONITOR事务来通知一个DDE事件的监视应用程序。在此事务期间,DDEML传递一个监视器标志,该标志指定发生的DDE事件的类型以及包含有关该事件的详细信息的DDE对象的句柄。DDEML提供了一组应用程序可以从DDE对象中提取信息的结构。每种类型的DDE事件都有相应的结构。
结构体 | 描述 |
MONCBSTRUCT | 包含有关交易的信息。 |
MONCONVSTRUCT | 包含有关对话的信息。 |
MONERRSTRUCT | 包含有关最新DDE错误的信息。 |
MONLINKSTRUCT | 包含有关建议循环的信息。 |
MONHSZSTRUCT | 包含有关字符串句柄的信息。 |
MONMSGSTRUCT | 包含有关发送或发布的DDE消息的信息。 |
以下示例显示DDE监视应用程序的DDE回调函数,用于格式化有关每个字符串句柄事件的信息,然后在窗口中显示信息。该函数使用MONHSZSTRUCT结构从DDE对象中提取信息。
HDDEDATA CALLBACK DDECallback(uType,uFmt,hconv,hsz1,hsz2,
-ruleHData,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;
switch(uType){
case XTYP_MONITOR:
/ *获取指向全局内存对象的指针。*/
if (lpData = DdeAccessData(hdata, &cb)) {
/ *检查监视器标志。*/
switch(dwData2){
case MF_HSZ_INFO:
#define PHSZS((MONHSZSTRUCT FAR *)lpData)
/*
*全局内存对象包含
*字符串句柄数据。使用MONHSZSTRUCT
*结构访问数据。
*/
开关(PHSZS- > fsAction){
/*
*检查动作标志
*确定执行的操作
* 手柄。
*/
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;
默认:
DdeUnaccessData(hdata);
return (HDDEDATA) 0;
}
/ *将格式化的输出写入缓冲区。*/
wsprintf(szBuf,
“处理%s,任务:%x,Hsz:%lx(%s)”,
(LPSTR)szAction,PHSZS- {989 796 004} hTask,
PHSZS->hsz, (LPSTR) PHSZS->str);
.
./ *显示文本或写入文件。*/
.
break;
#undef PHSZS
.
./ *处理其他MF_ *标志。*/
.
默认:
break;
}
}
/ *释放全局内存对象。*/
DdeUnaccessData(hdata);
break;
默认:
break;
}
return (HDDEDATA) 0;
}