永久数据链路的撤消
永久链路的撤消也是由客户发出,通过向服务器窗口发出WM_DDE_UNADVISE消息通知服务器。服务器首先检查当前对话中是否有与特定项目相对应的链路。如果存在就返回一个WM_DDE_ACK的肯定应答,否则返回否定应答(具体流程参见图1)。对于此永久链路的撤消,首先由客户发出WM_DDE_UNADVISE消息:
ATOM atomItem = GlobalAddAtom("Item C"); // 得到数据项原子标识值 HWND hwndClient = GetSafeHwnd(); // 获取当前窗口的安全句柄 ::PostMessage(m_hwndServer, WM_DDE_UNADVISE, (WPARAM)hwndClient, (LPARAM)MAKELONG(0, atomItem)); // 向服务器发送WM_DDE_ADVISE消息 GlobalDeleteAtom(atomItem); // 删除原子 |
服务器窗口在收到此消息后,首先检查在当前对话中是否有与特定项目相对应的链路,如果存在,在撤消此链路的同时向客户返回肯定的WM_DDE_ACK应答;如果请求撤消的链路已经不存在了,则返回否定应答:
AfxMessageBox("客户请求撤消此永久链路!"); // 反馈信息 // 锁定内存 SERVERADVISE* lpServerAdvise = (SERVERADVISE*)GlobalLock(m_hServerAdvise); lpServerAdvise->fAdvise = FALSE; // 撤消数据项连接 GlobalUnlock(m_hServerAdvise); // 解锁内存 if (m_bHaveALink == TRUE) { // 返回应答 LONG lDataPack = PackDDElParam(WM_DDE_ACK, (UINT)0x8000, HIWORD(lParam)); // 组合消息参数lParam ::PostMessage((HWND)wParam, WM_DDE_ACK, (WPARAM)m_hwndServer, (LPARAM)lDataPack); // 向客户发送肯定应答 } else { // 组合消息参数lParam LONG lDataPack = PackDDElParam(WM_DDE_ACK, (UINT)0, HIWORD(lParam)); ::PostMessage((HWND)wParam, WM_DDE_ACK, (WPARAM)m_hwndServer, (LPARAM)lDataPack); // 向客户发送肯定应答 } |
小结
本文对动态数据交换技术中的永久数据链路的建立和撤消处理方法作了较为详细的介绍,并给出了具体实现代码。通过本文读者可以掌握温数据链路和热数据链路两种永久数据链路的创建和撤消方法。本文所述代码在Windows 2000 Professional下由Microsoft Visual C++(www.cppentry.com) 6.0编译通过。 |