通知客户数据已更改

【勇芳软件工作室】汉化HomePreviousNext

当客户端使用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消息。