PostMessage从32位C#到64位C++

Veg*_*sen 2 c# c++ 64-bit winapi wow64

我遇到了传递指针内容的问题,因为来自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*的函数直接从具有相同RECT*的32.exe调用,稍后发布,这很有效.然后它向64.exe发送一条消息,它调用相同的函数并将wParam强制转换为RECT*:

else if (WM_SetDisabledAreas == message)
{
    SetDisabledAreas((RECT*)wParam, (UINT)lParam);
}
Run Code Online (Sandbox Code Playgroud)

消息发布如下:

    if (Is64Bit() && SubProcess64 != null)
    {
        Win32.PostMessage(SubProcess64.MainWindowHandle, WindowMessages.SetDisabledAreas,
            (uint)pointer.ToInt32(), length);
    }
    MessageBox.Show(pointer.ToString());
    DLL32.SetDisabledAreas(pointer, length);
Run Code Online (Sandbox Code Playgroud)

通过调试我已经验证了收到了消息,但是wParam地址与以前不一样.这不是意料之外的,但它现在指向的内存的内容是未定义的(当我试图查看那里有什么时,我得到了访问冲突).

这里发生了什么?

Tim*_*mbo 5

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

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

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