将项目提交到服务器

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

客户端可以使用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的】参数)。