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地址与以前不一样.这不是意料之外的,但它现在指向的内存的内容是未定义的(当我试图查看那里有什么时,我得到了访问冲突).
这里发生了什么?
这两个进程中的每一个都有自己的地址空间,因此进程32.exe中的指针在64.exe中无效.
但是,这与32位与64位无关.您只需使用您选择的进程间通信技术在两个进程之间传输数据.
例如,您可以使用CreateFileMapping创建共享内存的命名部分.