客户端通过发布WM_DDE_ADVISE消息来发起数据链接,如以下示例所示。
if (!(hOptions = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,
sizeof(DDEADVISE))))
return;
if (!(lpOptions = (DDEADVISE FAR*) GlobalLock(hOptions))) {
GlobalFree(hOptions);
return;
}
lpOptions->cfFormat = CF_TEXT;
lpOptions->fAckReq = TRUE;
lpOptions->fDeferUpd = FALSE;
GlobalUnlock(hOptions);
if ((atomItem = GlobalAddAtom(szItemName)) != 0) {
if(!(PostMessage(hwndServerDDE,
WM_DDE_ADVISE,
(WPARAM)hwndClientDDE,
PackDDElParam(WM_DDE_ADVISE,(UINT)hOptions,
atomItem)))){
GlobalDeleteAtom(atomItem);
GlobalFree(hOptions);
FreeDDElParam(WM_DDE_ADVISE, lParam);
}
}
if (atomItem == 0) {
.
./ *错误处理* /
.
}
在此示例中,客户端应用程序将WM_DDE_ADVISE消息的fDeferUpd标志设置为FALSE。这将指示服务器应用程序在数据更改时将数据发送到客户端。
如果服务器无法服务WM_DDE_ADVISE请求,它将向客户端发送否定的消息(989796046)。但是如果服务器可以访问该项目并且可以以请求的格式呈现它,服务器将注意到新的链接(调用【hOptions】参数中指定的标志),并向客户端发送一个正的WM_DDE_ACK消息。从那时起,直到客户端发出匹配的WM_DDE_UNADVISE消息,服务器每次在服务器中更改项的值时,将新数据发送给客户端。
WM_DDE_ADVISE消息建立链接期间要交换的数据的格式。如果客户端尝试使用相同的项目建立另一个链接但使用不同的数据格式,则服务器可以选择拒绝第二个数据格式或尝试支持它。如果为任何数据项建立了热链接,则服务器一次只能支持一种数据格式。这是因为热门链接的WM_DDE_DATA消息具有NULL数据句柄,否则包含格式信息。因此,服务器必须拒绝已链接的项目的所有热链接,并且必须拒绝具有热链接的项目的所有链接。另一种解释可能是当为同一数据项请求第二个链接时,服务器会更改链接的格式和热或暖状态。
通常,客户端应用程序不应该一次尝试为数据项建立多个链接。