Notifying the Client that Data Has Changed

When the client establishes a link by using the WM_DDE_ADVISE message, with the fDeferUpd member not set (that is, equal to zero) in the DDEDATA structure, the client has requested the server send the data item each time the item's value changes. In such cases, the server renders the new value of the data item in the previously specified format and sends the client a WM_DDE_DATA message, as shown in the following example.

/*

* Allocate the size of a DDE data header, plus data (a string),

* plus a <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 message */

lpData->cfFormat = CF_TEXT;

lstrcpy(lpData->Value, szItemValue); /* copies value to be sent */

lstrcat(lpData->Value, "\r\n"); /* CR/LF for CF_TEXT format */

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) {

.

. /* error handling */

.

}

In this example, the client processes the item value as appropriate. If the fAckReq flag for the item is set, the client sends the server a positive WM_DDE_ACK message.

When the client establishes the link, with the fDeferUpd member set (that is, equal to 1), the client has requested that only a notification, not the data itself, be sent each time the data changes. In such cases, when the item value changes, the server does not render the value but simply sends the client a WM_DDE_DATA message with a null data handle, as illustrated in the following example.

if (bDeferUpd) { /* checking whether the flag was originally */

/* set in the WM_DDE_ADVISE message */

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) {

.

. /* error handling */

.

}

As necessary, the client can request the latest value of the data item by issuing a normal WM_DDE_REQUEST message, or it can simply ignore the notice from the server that the data has changed. In either case, if fAckReq is equal to 1, the client is expected to send a positive WM_DDE_ACK message to the server.

Software for developers
Delphi Components
.Net Components
Software for Android Developers
More information resources
MegaDetailed.Net
Unix Manual Pages
Delphi Examples
Databases for Amazon shops developers
Amazon Categories Database
Browse Nodes Database