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