【发布时间】:2010-12-21 19:33:30
【问题描述】:
MSDN 告诉我,Windows 的句柄 (HWND) 可以在 Interprocess Communication (MSDN) 中的 32 位和 64 位应用程序之间共享。但是,在 Win32 中,HWND 是 32 位,而在 64 位 Windows 中,它是 64 位。那么如何共享句柄呢?
我猜同样的问题也适用于命名对象的句柄,例如互斥锁、信号量和文件句柄。
【问题讨论】:
MSDN 告诉我,Windows 的句柄 (HWND) 可以在 Interprocess Communication (MSDN) 中的 32 位和 64 位应用程序之间共享。但是,在 Win32 中,HWND 是 32 位,而在 64 位 Windows 中,它是 64 位。那么如何共享句柄呢?
我猜同样的问题也适用于命名对象的句柄,例如互斥锁、信号量和文件句柄。
【问题讨论】:
它们可以共享的事实不是意味着在 Win64 进程中只使用低 32 位吗?至少据我所知,Windows 句柄是索引而不是指针,所以除非 MS 想要允许超过 2^32 个窗口/文件/互斥体/等。处理没有理由在 Win64 上使用 void* 的高 32 位。
【讨论】:
microsoft.public.windows.64bit.general 或microsoft.public.windows.app_compatibility 之类的论坛中提问(参见aumha.org/nntp.php)一些MS 开发人员肯定知道...
我认为您总体上保持谨慎是正确的。但是,MSDN 声称它们可以共享是对我们程序员的合同。在不破坏大量软件的情况下,他们不能很好地说“今天分享”,然后明天“不再分享”。
同样,为了让 x64 和 32 位软件在给定的机器上同时运行,并且每个人都能相处,HWND(和许多 HANDLE)必须继续保持 32 位和兼容。
我想我的意思是,我认为这是一个非常安全的赌注,至少在 Windows 7 的整个生命周期内,并且可能是 Windows 的“下一个”。
【讨论】:
我刚刚收到一封来自 Microsoft WOW64 开发人员的电子邮件,他确认:
句柄是 32 位的,可以安全地截断/零扩展。对于内核对象句柄和 USER/GDI 句柄都是如此。
【讨论】:
查看 Microsoft 接口定义语言 (MIDL) 移植指南,第 12 页 (http://msdn.microsoft.com/en-us/library/ms810720.aspx)
看看 USER 和 GDI 句柄是符号扩展的 32b 值
【讨论】:
正如 Daniel Rose 在上面指出的那样,MSDN documentation 现在声明:
... 截断句柄(从 64 位传递到 32 位时)或对句柄进行符号扩展(从 32 位传递到 64 位时)是安全的。
这里似乎仍然有些混乱,因为我被 WOW64 开发人员告知零扩展是正确的方法。如果您正在编写从 32 位模块获取句柄的 64 位模块,最安全的选择可能是仅比较句柄的低 32 位(即截断)。否则,您可能会发现符号扩展与零扩展的差异。
【讨论】: