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