客户端可以使用WM_DDE_POKE消息将项目值发送到服务器。客户端呈现要发送的项目并发送WM_DDE_POKE消息,如以下示例所示。
if (!(hPokeData = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,
(LONG)sizeof(DDEPOKE)+ lstrlen(szValue)+ 2)))
return;
if (!(lpPokeData = (DDEPOKE FAR*) GlobalLock(hPokeData))) {
GlobalFree(hPokeData);
return;
}
lpPokeData->fRelease = TRUE;
lpPokeData->cfFormat = CF_TEXT;
lstrcpy((LPSTR) lpPokeData->Value, (LPSTR) szValue);
/ * CF_TEXT数据的每一行都由CR / LF终止。*/
lstrcat((LPSTR) lpPokeData->Value, (LPSTR) "\r\n");
GlobalUnlock(hPokeData);
if ((atomItem = GlobalAddAtom((LPSTR) szItem)) != 0) {
.
.
.
if(!PostMessage(hwndServerDDE,
WM_DDE_POKE,
(WPARAM)hwndClientDDE,
PackDDElParam(WM_DDE_POKE,(UINT)hPokeData,
atomItem))){
GlobalDeleteAtom(atomItem);
GlobalFree(hPokeData);
}
}
if (atomItem == 0) {
.
./ *错误处理* /
.
}
请注意,使用WM_DDE_POKE消息发送数据基本上与通过使用WM_DDE_DATA发送数据相同,只是WM_DDE_POKE从客户机发送到服务器。
如果服务器能够以客户端呈现的格式接受数据项目值,则服务器根据需要处理项目值,并向客户端发送肯定的WM_DDE_ACK消息。如果无法处理项目值,由于其格式或其他原因,服务器会向客户端发送否定的WM_DDE_ACK消息。
UnpackDDElParam(WM_DDE_POKE,lParam,(PUINT)& hPokeData,
(PUINT) &atomItem);
GlobalGetAtomName(atomItem, szItemName, ITEM_NAME_MAX_SIZE);
if (!(lpPokeData = (DDEPOKE FAR*) GlobalLock(hPokeData))
|| lpPokeData->cfFormat != CF_TEXT
|| !IsItemSupportedByServer(szItemName)){
PostMessage(hwndClientDDE,
WM_DDE_ACK,
(WPARAM)hwndServerDDE,
PackDDElParam(WM_DDE_ACK, 0, atomItem)); /* negative ACK */
}
lstrcpy(szItemValue, lpPokeData->Value); /* copies value */
bRelease = lpPokeData->fRelease;
GlobalUnlock(hPokeData);
if(bRelease){
GlobalFree(hPokeData);
}
PostMessage(hwndClientDDE,
WM_DDE_ACK,
(WPARAM)hwndServerDDE,
PackDDElParam(WM_DDE_ACK,
0x8000, atomItem)); /* positive ACK */
在此示例中,服务器调用GlobalGetAtomName以检索客户端发送的项目的名称。然后,服务器确定它是否支持该项目以及该项目是否以正确的格式呈现(即,CF_TEXT)。如果不支持该项目并且未以正确的格式呈现该项目,或者如果服务器无法锁定数据的内存,则服务器将向客户端应用程序发送否定确认。请注意,在这种情况下,发送否定确认是正确的,因为WM_DDE_POKE消息总是假定拥有fAckReq成员集。服务器应该忽略该成员。
如果服务器响应于WM_DDE_POKE消息发送否定确认,则客户端负责释放与否定确认关联的WM_DDE_POKE消息引用的内存(但不是【lParam的】参数)。