【问题标题】:How can I share HWND between 32 and 64 bit applications in Win x64?如何在 Win x64 中的 32 位和 64 位应用程序之间共享 HWND?
【发布时间】:2010-12-21 19:33:30
【问题描述】:

MSDN 告诉我,Windows 的句柄 (HWND) 可以在 Interprocess Communication (MSDN) 中的 32 位和 64 位应用程序之间共享。但是,在 Win32 中,HWND 是 32 位,而在 64 位 Windows 中,它是 64 位。那么如何共享句柄呢?

我猜同样的问题也适用于命名对象的句柄,例如互斥锁、信号量和文件句柄。

【问题讨论】:

    标签: c++ c windows wow64


    【解决方案1】:

    它们可以共享的事实不是意味着在 Win64 进程中只使用低 32 位吗?至少据我所知,Windows 句柄是索引而不是指针,所以除非 MS 想要允许超过 2^32 个窗口/文件/互斥体/等。处理没有理由在 Win64 上使用 void* 的高 32 位。

    【讨论】:

    • 我明白了其中的含义,但 MSDN 中似乎没有具体的文档说明只使用低 32 位并且将永远使用,因此这样做是安全的。鉴于未记录在案,了解当前窗口句柄的底层实现并不能保证这不会在未来的 Windows 版本中发生变化。
    • 如果 MS 擅长一件事,那就是保持向后兼容性。我同意就此事找到一些明确的陈述会很好,但看起来你只会得到一个隐含的陈述。也许您应该在microsoft.public.windows.64bit.generalmicrosoft.public.windows.app_compatibility 之类的论坛中提问(参见aumha.org/nntp.php)一些MS 开发人员肯定知道...
    • @Marc:“MSDN 中的特定文档”正是您链接到的声明。它并没有真正说只使用低 32 位,实际上我希望 Win64 设置至少一个高位 - 只是为了发现已被截断的句柄 - 但低 32 位应该足以唯一识别一个窗口。
    • @MSalters,如果 MS 确实在 Win64 中设置了一个高位,那么对于从 Win32 传递的句柄,HWND 比较将被破坏。您的陈述是一个清楚的例子,说明了为什么我们需要在这些情况下明确,而不仅仅是假设和隐含的猜测,因此截断是允许的。换句话说,MSDN 应该这样说:“在 Win64 中,HWND 仅使用低 32 位,而高 32 位始终为零。因此,要将 HWND 传递给 Win32,请将其截断为 DWORD32。”那是明确的、具体的文档。
    • @MSalters MSDN 现在明确指出截断/符号扩展是正确的方式:msdn.microsoft.com/en-us/library/aa384203.aspx
    【解决方案2】:

    我认为您总体上保持谨慎是正确的。但是,MSDN 声称它们可以共享是对我们程序员的合同。在不破坏大量软件的情况下,他们不能很好地说“今天分享”,然后明天“不再分享”。

    同样,为了让 x64 和 32 位软件在给定的机器上同时运行,并且每个人都能相处,HWND(和许多 HANDLE)必须继续保持 32 位和兼容。

    我想我的意思是,我认为这是一个非常安全的赌注,至少在 Windows 7 的整个生命周期内,并且可能是 Windows 的“下一个”。

    【讨论】:

      【解决方案3】:

      我刚刚收到一封来自 Microsoft WOW64 开发人员的电子邮件,他确认:

      句柄是 32 位的,可以安全地截断/零扩展。对于内核对象句柄和 USER/GDI 句柄都是如此。

      【讨论】:

        【解决方案4】:

        查看 Microsoft 接口定义语言 (MIDL) 移植指南,第 12 页 (http://msdn.microsoft.com/en-us/library/ms810720.aspx)

        看看 USER 和 GDI 句柄是符号扩展的 32b 值

        【讨论】:

          【解决方案5】:

          正如 Daniel Rose 在上面指出的那样,MSDN documentation 现在声明:

          ... 截断句柄(从 64 位传递到 32 位时)或对句柄进行符号扩展(从 32 位传递到 64 位时)是安全的。

          这里似乎仍然有些混乱,因为我被 WOW64 开发人员告知零扩展是正确的方法。如果您正在编写从 32 位模块获取句柄的 64 位模块,最安全的选择可能是仅比较句柄的低 32 位(即截断)。否则,您可能会发现符号扩展与零扩展的差异。

          【讨论】:

            猜你喜欢
            • 2011-01-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-07
            • 2012-01-21
            • 1970-01-01
            • 1970-01-01
            • 2018-10-26
            相关资源
            最近更新 更多