当客户端使用WM_DDE_ADVISE消息建立链接时,在DDEDATA结构中fDeferUpd成员未设置(即等于零),客户端已经请求服务器每次发送数据项项目的价值变化。在这种情况下,服务器将以先前指定的格式呈现数据项的新值,并向客户端发送WM_DDE_DATA消息,如以下示例所示。
/*
*分配DDE数据头的大小,加上数据(字符串),
*加上< CR > < LF > < NULL >
*/
if (!(hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,
sizeof(DDEDATA)+ lstrlen(szItemValue)+ 3)))
return;
if (!(lpData = (DDEDATA FAR*) GlobalLock(hData))) {
GlobalFree(hData);
return;
}
lpData->fAckReq = bAckRequest; /* as specified in original */
/ * WM_DDE_ADVISE消息* /
lpData->cfFormat = CF_TEXT;
lstrcpy(lpData- > Value,szItemValue); / *复制要发送的值* /
lstrcat(lpData- >值,“\\ r \\ n”); / * CR / LF为CF_TEXT格式* /
GlobalUnlock(hData);
if ((atomItem = GlobalAddAtom(szItemName)) != 0) {
if(!PostMessage(hwndClientDDE,
WM_DDE_DATA,
(WPARAM)hwndServerDDE,
PackDDElParam(WM_DDE_DATA,(UINT)hData,atomItem))){
GlobalFree(hData);
GlobalDeleteAtom(atomItem);
FreeDDElParam(WM_DDE_DATA, lParam);
}
}
if (atomItem == 0) {
.
./ *错误处理* /
.
}
在此示例中,客户端适当处理项目值。如果设置了该项目的fAckReq标志,则客户端向服务器发送肯定的WM_DDE_ACK消息。
当客户端建立链接时,使用fDeferUpd成员集(即等于1),客户端已经请求每次数据更改时只发送通知,而不是数据本身。在这种情况下,当项目值更改时,服务器不会呈现该值,而只是向客户端发送一个空数据句柄的WM_DDE_DATA消息,如以下示例所示。
if(bDeferUpd){/ *检查标志是否原来是* /
/ *设置在WM_DDE_ADVISE消息* /
if ((atomItem = GlobalAddAtom(szItemName)) != 0) {
if(!PostMessage(hwndClientDDE,
WM_DDE_DATA,
(WPARAM)hwndServerDDE,
PackDDElParam(WM_DDE_DATA,0,
atomItem))){/ * NULL data * /
GlobalDeleteAtom(atomItem);
FreeDDElParam(WM_DDE_DATA, lParam);
}
}
}
if (atomItem == 0) {
.
./ *错误处理* /
.
}
根据需要,客户端可以通过发出正常的WM_DDE_REQUEST消息来请求数据项的最新值,或者可以简单地忽略来自服务器的数据已更改的通知。在这两种情况下,如果fAckReq等于1,则客户端应向服务器发送肯定的WM_DDE_ACK消息。