MSDN告诉我,窗口(HWND)的句柄可以在Interprocess Communication(MSDN)中的32位和64位应用程序之间共享。但是,在Win32中,HWND是32位,而在64位Windows中,它是64位。那么如何共享句柄呢?
我想同样的问题适用于命名对象的句柄,例如互斥锁,信号量和文件句柄。
答案 0 :(得分:17)
正如丹尼尔罗斯指出的那样,MSDN documentation现在指出:
...截断句柄(将其从64位传递到32位)或对句柄进行符号扩展(将其从32位传递到64位)是安全的。
这里似乎仍有一些混乱,因为我被告知零扩展是WOW64开发的正确方法。如果您正在编写一个从32位模块获取句柄的64位模块,最安全的选择可能是仅比较句柄的低32位(即截断)。否则,您可能会遇到符号扩展与零扩展差异。
答案 1 :(得分:12)
我刚收到一封来自Microsoft WOW64开发者的电子邮件,他确认:
句柄为32位,可以安全地截断/零扩展。对于内核对象句柄和USER / GDI句柄都是如此。
答案 2 :(得分:7)
它们可以共享的事实是否意味着在Win64进程中只使用低32位? Windows句柄是索引而不是指针,至少据我所知,所以除非MS想要允许超过2 ^ 32窗口/文件/互斥/等。处理没有理由在Win64上使用void*
的高32位。
答案 3 :(得分:2)
查看Microsoft接口定义语言(MIDL)移植指南,第12页 (http://msdn.microsoft.com/en-us/library/ms810720.aspx)
这里有一个看看用户和GDI句柄是符号扩展32b值
答案 4 :(得分:1)
我认为你一般都要小心谨慎。但是,MSDN声称它们可以共享是我们程序员的合同。在没有破坏大量软件的情况下,他们不能说“今天分享”然后明天“不再”。
同样,对于x64和32bit软件在给定计算机上并发运行,并且每个人都可以相处,HWND(和许多HANDLE)必须继续保持32位且兼容。
我想我所说的是我认为这是一个非常安全的赌注,至少在Windows 7的生命周期中,可能是Windows“下一个”。