支持热或热数据链接的应用程序通常支持名为Link的注册剪贴板格式。当与应用程序的复制和粘贴链接命令相关联时,此剪贴板格式使用户能够通过复制服务器应用程序中的数据项并将其粘贴到客户端应用程序中,在应用程序之间建立DDE对话。
当用户从“编辑”菜单中选择“复制”命令时,服务器应用程序通过将剪贴板放入包含应用程序,主题和项目名称的字符串来支持链接剪贴板格式。以下是标准的链接格式:
【应用】\0【话题】\0【项目】\0\0
单个空字符分隔名称,两个空字符终止整个字符串。
客户端和服务器应用程序都必须注册Link剪贴板格式,如图所示:
cfLink = RegisterClipboardFormat("Link");
客户端应用程序通过“编辑”菜单上的“粘贴链接”命令支持链接剪贴板格式。当用户选择此命令时,客户端应用程序将从链接格式剪贴板数据中分析应用程序,主题和项目名称。使用这些名称,如果此类会话不存在,则客户端应用程序会为应用程序和主题启动会话。然后,客户端应用程序向服务器应用程序发送一条消息,指定链接格式剪贴板数据中包含的项目名称。
以下是用户选择粘贴链接命令时客户端应用程序响应的示例。
空隙DoPasteLink(hwndClientDDE)
HWND hwndClientDDE;
{
HANDLE hData;
LPSTR lpData;
HWND hwndServerDDE;
CHAR szApplication[APP_MAX_SIZE + 1];
CHAR szTopic[TOPIC_MAX_SIZE + 1];
CHAR szItem[ITEM_MAX_SIZE + 1];
int nBufLen;
if(OpenClipboard(hwndClientDDE)){
if (!(hData = GetClipboardData(cfLink)) ||
!(lpData = GlobalLock(hData))) {
CloseClipboard();
return;
}
/ *解析剪贴板数据。*/
if ((nBufLen = lstrlen(lpData)) >= APP_MAX_SIZE) {
CloseClipboard();
GlobalUnlock(hData);
return;
}
lstrcpy(szApplication, lpData);
lpData += (nBufLen + 1); /* skips over null */
if ((nBufLen = lstrlen(lpData)) >= TOPIC_MAX_SIZE) {
CloseClipboard();
GlobalUnlock(hData);
return;
}
lstrcpy(szTopic, lpData);
lpData += (nBufLen + 1); /* skips over null */
if ((nBufLen = lstrlen(lpData)) >= ITEM_MAX_SIZE) {
CloseClipboard();
GlobalUnlock(hData);
return;
}
lstrcpy(szItem, lpData);
GlobalUnlock(hData);
CloseClipboard();
if (hwndServerDDE =
FindServerGivenAppTopic(szApplication,szTopic)){
/ *应用/主题会话已经开始。*/
if(DoesAdviseAlreadyExist(hwndServerDDE,szItem))
MessageBox(hwndMain,
“咨询已经建立”,
"Client", MB_ICONEXCLAMATION | MB_OK);
其他
SendAdvise(hwndClientDDE, hwndServerDDE, szItem);
}
else {
/ *客户端必须首先发起新的对话。*/
SendInitiate(szApplication, szTopic);
if (hwndServerDDE =
FindServerGivenAppTopic(szApplication,
szTopic))
SendAdvise(hwndClientDDE, hwndServerDDE, szItem);
}
}
return;
}
在此示例中,客户端应用程序打开剪贴板,并确定它是否包含之前已注册的链接格式(即cfLink)的数据。如果没有,或者如果无法锁定剪贴板中的数据,则客户端返回。
客户端应用程序检索剪贴板数据的指针后,解析数据以提取应用程序,主题和项目名称。
客户端应用程序确定该主题之间的会话是否已经存在于该服务器应用程序之间。如果对话确实存在,则客户端检查数据项是否已存在链接。如果存在这样的链接,则客户端向用户显示一个消息框;否则,它调用其自己的SendAdvise功能来向服务器发送一个WM_DDE_ADVISE消息。
如果客户端和服务器之间的主题对话不存在,客户端首先调用自己的SendInitiate函数来广播WM_DDE_INITIATE消息以请求对话,其次调用自己的FindServerGivenAppTopic函数来建立对话代表服务器应用程序响应的窗口。会话开始后,客户端应用程序调用SendAdvise请求链接。