VC下动态数据交换技术

DDE客户端的命令传递

  DDE除可在应用程序之间传送信息之外,也允许从客户向服务器传送可执行命令。客户可通过向服务器邮寄WM_DDE_EXECUTE消息来为其传递命令。消息参数lParam的高字包含了命令字符串的全局共享内存块句柄:

 1 // 服务器数据项内容
 2 CString sCommand = "COMMAND A";
 3 // 分配DDEDATA格式化的全局共享内存块
 4 HGLOBAL hCommand = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, (LONG)sCommand.GetLength() + 1);
 5 // 锁定内存块地址
 6 LPSTR lpCommand = (LPSTR)GlobalLock(hCommand);
 7 // 填充数据项内容
 8 ::strcpy(lpCommand, sCommand);
 9 // 解锁内存块
10 GlobalUnlock(hCommand);
11 // 获取当前窗口的安全句柄
12 HWND hwndClient = GetSafeHwnd();
13 // 组合消息参数lParam
14 LONG lDataPack = PackDDElParam(WM_DDE_EXECUTE, 0, (UINT)hCommand);
15 // 发出远程命令消息
16 ::PostMessage(m_hwndServer, WM_DDE_EXECUTE, (WPARAM)hwndClient, (LPARAM)lDataPack);
17 // 释放内存
18 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编译通过。

转载于:https://www.cnblogs.com/h2co3orange/archive/2013/01/14/2859912.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值