如何在Win x64中的32位和64位应用程序之间共享HWND?

Mar*_*din 21 c c++ windows wow64

MSDN告诉我,在进程间通信(MSDN)中,32位和64位应用程序之间可以共享窗口句柄(HWND ).但是,在Win32中,HWND是32位,而在64位Windows中,它是64位.那么如何共享句柄呢?

我想同样的问题适用于命名对象的句柄,如互斥锁,信号量和文件句柄.

Mar*_*din 18

正如Daniel Rose在上面指出的那样,MSDN文档现在指出:

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

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


Mar*_*din 12

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

手柄为32位,可以安全截断/零延伸.对于内核对象句柄和USER/GDI句柄都是如此.


Tim*_*ter 9

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

  • 我看到了暗示,但MSDN中似乎没有特定的文档说明只使用了低32位并且将永远使用它,因此这样做是安全的.了解当前窗口句柄的底层实现并不能保证在未来版本的Windows中不会发生这种变化,因为没有记录. (7认同)
  • @MSalters MSDN现在明确指出截断/符号扩展的正确方式:http://msdn.microsoft.com/en-us/library/aa384203.aspx (6认同)
  • @MSalters,如果MS在Win64中设置了高位,那么对于从Win32传递的句柄,HWND比较将被破坏.您的陈述清楚地说明了为什么我们需要明确这些情景,而不仅仅是假设和隐含的猜测,因此截断是允许的.换句话说,MSDN应该说:"在Win64中,HWND仅使用低32位,高32位始终为零.因此,要将HWND传递给Win32,请将其截断为DWORD32." 这是明确的具体文档. (2认同)