如何在mfc c ++中创建自定义wm_copydata

时间:2011-03-08 17:52:54

标签: c++ windows marshalling messaging

如何创建将任何数据传递到其他程序的自定义Windows消息。

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

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

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

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

如果pData是整数,则上述工作原理。如果pData是一个指向对象的指针,我就无法使用该对象,因为缺少了marhsalling。我知道我可以为pData做一个包装COPYDATASTRUCT包装并更改为WM_COPYDATA。我应该这样做吗?

BR, 尤哈

1 个答案:

答案 0 :(得分:1)

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

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

无论如何,只要你能传递一大堆零和一个,你就可以传达你喜欢的任何东西。