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

发布于 2024-07-26 16:41:39 字数 964 浏览 5 评论 0原文

当 32 位 C# 应用程序的 wParam 在转换为 64 位 C++ 进程的过程中发生变化时,我遇到了传递指针内容的问题。

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

这里发生了什么?

I am having problem with the contents of a pointer passed as the wParam from a 32-bit C# application is changing along the way to a 64-bit C++ process.

There are two processes 32.exe (in C#) and 64.exe (in C++). 64.exe is started as a child process of 32.exe. 32.exe post window message for 64.exe, one of which has a wParam that is a pointer to an array of RECT structures. Both 64.exe and 32.exe have a common DLL (written in C++, but compiled for different platforms, of course), called 32.dll and 64.dll.

A function expecting a RECT* in 32.dll is called directly from 32.exe with the same RECT* that is later posted, and this works well. Afterwards it posts a message to 64.exe, which calls the same function and casts the wParam to RECT*:

else if (WM_SetDisabledAreas == message)
{
    SetDisabledAreas((RECT*)wParam, (UINT)lParam);
}

The message is posted as follows:

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

By debugging I've validated that the message is received, however the wParam address is not the same as it was before. This is not unexpected, but the contents of the memory it now points to is undefined (and I get an access violation when attempting to see what is there).

What is happening here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

仲春光 2024-08-02 16:41:39

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

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

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

Each of the two processes has an own address space, so that the pointer from process 32.exe is not valid in 64.exe.

However, this has nothing to do with 32bit vs 64bit at all. You just have to use an interprocess communication technique of your choice to transfer the data between the two processes.

For example, you could use CreateFileMapping to create a named section of shared memory.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文