gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:49:36 25 4
gpt4 key购买 nike

我在处理从 32 位 C# 应用程序的 wParam 传递到 64 位 C++ 进程的过程中传递的指针内容时遇到问题。

有两个进程 32.exe(在 C# 中)和 64.exe(在 C++ 中)。 64.exe 作为 32.exe 的子进程启动。 64.exe 的 32.exe post 窗口消息,其中一个有一个 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 地址与之前不同。这并不意外,但它现在指向的内存内容是未定义的(我在尝试查看那里的内容时遇到了访问冲突)。

这里发生了什么?

最佳答案

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

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

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

关于c# - 从 32 位 C# 到 64 位 C++ 的 PostMessage 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1086632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com