DDE客戶端的命令傳遞
DDE除可在應用程序之間傳送信息之外,也允許從客戶向服務器傳送可執行命令?蛻艨赏ㄟ^向服務器郵寄WM_DDE_EXECUTE消息來為其傳遞命令。消息參數lParam的高字包含了命令字符串的全局共享內存塊句柄:
// 服務器數據項內容 CString sCommand = "COMMAND A"; // 分配DDEDATA格式化的全局共享內存塊 HGLOBAL hCommand = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, (LONG)sCommand.GetLength() + 1); // 鎖定內存塊地址 LPSTR lpCommand = (LPSTR)GlobalLock(hCommand); // 填充數據項內容 ::strcpy(lpCommand, sCommand); // 解鎖內存塊 GlobalUnlock(hCommand); // 獲取當前窗口的安全句柄 HWND hwndClient = GetSafeHwnd(); // 組合消息參數lParam LONG lDataPack = PackDDElParam(WM_DDE_EXECUTE, 0, (UINT)hCommand); // 發出遠程命令消息 ::PostMessage(m_hwndServer, WM_DDE_EXECUTE, (WPARAM)hwndClient, (LPARAM)lDataPack); // 釋放內存 GlobalFree(hCommand); |
DDE服務器對遠程命令的執行
按照DDE協議規定,服務器窗口在收到WM_DDE_EXECUTE消息后要對命令字符串進行分析,然后再執行之。服務器還要將根據指定命令串的執行結果向客戶返回WM_DDE_ACK應答消息。這里與前面的應答消息不同,在郵寄WM_DDE_ACK消息時要再次使用從WM_DDE_EXECUTE消息中傳遞過來的全局共享內存塊句柄。下面給出服務器窗口對WM_DDE_EXECUTE消息的響應代碼:
// lParam消息的低、高字 UINT uLo, uHi; // 對消息參數lParam進行解包 UnpackDDElParam(WM_DDE_EXECUTE, lParam, &uLo, &uHi); // 恢復出全局共享內存塊句炳 HGLOBAL hCommand = (HGLOBAL)uHi; // 鎖定內存 LPSTR lpCommand = (LPSTR)GlobalLock(hCommand); // 解鎖內存 GlobalUnlock(hCommand); if (CString(lpCommand) == "COMMAND A") { // 執行命令A的相關操作 AfxMessageBox("命令A被執行"); // 組合消息參數lParam LONG lDataPack = PackDDElParam(WM_DDE_ACK, 0x8000, (UINT)hCommand); // 發出遠程命令消息 ::PostMessage((HWND)wParam, WM_DDE_ACK, (WPARAM)m_hwndServer, (LPARAM)lDataPack); } else { // 組合消息參數lParam LONG lDataPack = PackDDElParam(WM_DDE_ACK, 0, (UINT)hCommand); // 發出遠程命令消息 ::PostMessage((HWND)wParam, WM_DDE_ACK, (WPARAM)m_hwndServer, (LPARAM)lDataPack); } // 釋放內存 GlobalFree(hCommand); |
小結
動態數據交換對遠程命令的執行比其在應用程序間傳送數據的應用更為重要,Windows操作系統及不少軟件均留有此類接口(作為DDE服務器),在應用程序中可以通過從DDE客戶端發出遠程命令而可以非常方便的執行外部軟件的相關命令和功能,比如可以命令Word新建一個文檔窗口等。本文所述代碼在Windows 2000 Professional下由Microsoft Visual C++ 6.0編譯通過。
|