2

我在传递指针的内容时遇到问题,因为 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 地址与以前不同。这并不意外,但它现在指向的内存内容是未定义的(当我试图查看那里的内容时,我遇到了访问冲突)。

这里发生了什么?

4

1 回答 1

5

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

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

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

于 2009-07-06T12:24:25.133 回答