从 32 位 C# 到 64 位 C++ 的 PostMessage 参数

Posted

技术标签:

【中文标题】从 32 位 C# 到 64 位 C++ 的 PostMessage 参数【英文标题】:PostMessage params from 32-bit C# to 64-bit C++ 【发布时间】:2009-07-06 12:09:31 【问题描述】:

我遇到了一个指针的内容问题,因为从 32 位 C# 应用程序传递的 wParam 正在更改为 64 位 C++ 进程。

有两个进程 32.exe(在 C# 中)和 64.exe(在 C++ 中)。 64.exe 作为 32.exe 的子进程启动。 64.exe 的 32.exe 发布窗口消息,其中一个具有 wParam,它是指向 RECT 结构数组的指针。 64.exe 和 32.exe 都有一个共同的 DLL(用 C++ 编写,当然是为不同的平台编译的),称为 32.dll 和 64.dll。

在 32.dll 中需要一个 RECT* 的函数直接从 32.exe 调用,具有相同的 RECT*,稍后发布,这很好用。之后它向 64.exe 发送一条消息,它调用相同的函数并将 wParam 转换为 RECT*:

else if (WM_SetDisabledAreas == message)

    SetDisabledAreas((RECT*)wParam, (UINT)lParam);

留言如下:

    if (Is64Bit() && SubProcess64 != null)
    
        Win32.PostMessage(SubProcess64.MainWindowHandle, WindowMessages.SetDisabledAreas,
            (uint)pointer.ToInt32(), length);
    
    MessageBox.Show(pointer.ToString());
    DLL32.SetDisabledAreas(pointer, length);

通过调试,我已经确认收到了消息,但是 wParam 地址与以前不同。这并不意外,但它现在指向的内存内容是未定义的(我在尝试查看内存时遇到访问冲突)。

这里发生了什么?

【问题讨论】:

您能否添加包含如何初始化指针变量的源代码? 和这个问题一模一样:***.com/questions/1086294/… 使用SendMessage会出现问题吗? 【参考方案1】:

两个进程中的每一个都有自己的地址空间,因此来自进程 32.exe 的指针在 64.exe 中无效。

但是,这与 32 位和 64 位完全无关。您只需使用您选择的进程间通信技术在两个进程之间传输数据。

例如,您可以使用CreateFileMapping 创建共享内存的命名部分。

【讨论】:

我知道它们可以有不同的地址空间,但是当您传递指针时,Windows 不应该为您翻译吗? windows 应该如何知道 (uint)pointer.ToInt32() 是指向矩形数组的指针?以及调用时如何知道这个数组的长度? Windows 会为您翻译它知道的消息。对于自定义消息,它不知道数据是什么,所以它只是传递值而不对它们做任何事情。

以上是关于从 32 位 C# 到 64 位 C++ 的 PostMessage 参数的主要内容,如果未能解决你的问题,请参考以下文章

是否可以从 C# 应用程序连接到 32 位 C++ RPC 服务器应用程序

尝试使用 64 位 MFC DLL 的 C++ 32 位应用程序

将 32 位 C++ 代码移植到 64 位 - 值得吗?为啥?

在 MS VC 2013 Express 中将 C++ dll 从 32 位转换为 64 位

如何使用 Visual C++ 2010 Express 从 32 位环境为 64 位 Windows 编译 Qt?

带有 32 位 VB6 COM 对象的 64 位 C#