【问题标题】:how to create custom wm_copydata in mfc c++如何在 mfc c++ 中创建自定义 wm_copydata
【发布时间】:2011-03-08 17:52:53
【问题描述】:

如何创建将任何数据传递给不同程序的自定义 Windows 消息。

我在 GUI 程序和服务器程序之间进行消息传递。我的背景是 *nix 编程,我有点迷失在 windows 世界中。

目前这两个程序都是由 Visual Studio 的向导通过选择“MFC 窗口应用程序”创建的。现在我想要一种优雅的方式在程序之间进行通信。 Google 给了我 Cwnd->sendmessage + 注册您自己的消息等。但是,我不能将 char 指针传递给具有标准自定义消息的不同程序(好吧,我可以,但内存区域错误,并且程序段错误)。所以,谷歌再次给我发送消息(WM_COPYDATA,hparam,lparam)这是编组的。在谷歌搜索编组时......我撞到了一堵墙。

我假设编组的消息(或它们的数据)被传递到一个共享内存区域,该区域只能由发送方和接收方程序读取(对吗?)。通过创建一个自定义消息,该消息将编组数据的指针作为 lparam,我可以将任何对象传递给另一个程序(对吗?)。我如何在实践中做到这一点?我尝试了以下方法:

pWin->SendMessage(pTargetWin, WM_CUSTOM_MESSAGE, pSourceWin, pData);

如果 pData 是整数,上述方法有效。如果 pData 是指向对象的指针,则由于缺少编组,我无法使用该对象。我知道我可以对 pData 进行包装 COPYDATASTRUCT 包装并更改为 WM_COPYDATA。我应该这样做吗?

br, 朱哈

【问题讨论】:

    标签: c++ windows marshalling messaging


    【解决方案1】:

    WM_COPYDATA 为您进行编组,前提是您已正确初始化作为 LPARAM 传递的 COPYDATASTRUCT(lpData 是指针,而不是 dwData)。自定义消息不会这样做,并且您不想手动重新实现编组。如果需要编组,请使用 WM_COPYDATA。你问的是这个吗?听起来你已经知道答案了。

    如果您需要支持多种不同类型的消息,您可以在 COPYDATASTRUCT.dwData 中填充一个枚举来指定其余数据的含义。如果四个字节还不够,您可以在编组数据上定义一个标头。

    不管怎样,只要你能传递一大堆零和一,你就可以交流任何你喜欢的东西。

    【讨论】:

    • 好吧,我想要的是手动编组......另一个选择是使用 WM_COPYDATA 如你所说。我想知道的另一件事是编组数据的可见性(在 WM_COPYDATA 的情况下)。它对所有程序可见还是仅对两个程序可见?
    • 为什么要手动编组?至于可见性,AFAIK,这些东西没有安全性。 Spy++ 可以挂钩任何人的消息循环并查看其中的内容。嗯......实际上这是属于同一用户的两个进程。我怀疑您是否可以查看属于不同用户帐户的消息队列。但前者对于类似于跨站点脚本的东西来说就足够了。
    • 这是我正在开发的大型多平台、multiopsys 软件的最后一段代码。我对windows编程不是很熟悉,我只是在探索矛盾:“你可以生成每一种wm_message 你必须使用wm_copydata”。无论如何,似乎正确的做法是使用 wm_copydata 并将内容包装在 copydatastruct 中。我要包装的是一个命令模式对象。请参阅:stackoverflow.com/questions/5237639/… 感谢您的帮助。
    • 啊,我明白了:窗口消息是操作系统告诉您有关用户输入的方式,以及您如何与进程中的子窗口对话。在 Win32 历史上(以及在 MFC 的幕后,甚至 Windows 窗体中),如果您想将一个项目添加到列表框中,您可以向它发送一条消息 (LB_ADDSTRING)。如果您想要列表框中的项目计数,请向其发送不同的消息 (LB_GETCOUNT)。在 Windows 多任务处理之前几年,“消息”这个词就与这个概念相关联了。该术语绝对会误导那些没有参加整个旅程的人。这不是 IPC 机制。
    猜你喜欢
    • 1970-01-01
    • 2013-10-12
    • 2023-04-02
    • 2011-11-18
    • 2011-06-20
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2010-11-29
    相关资源
    最近更新 更多