MSDN告诉我,窗口句柄(HWND)可以在32位和64位应用程序之间共享,在进程间通信中(MSDN)。但是,在Win32中,HWND是32位,而在64位Windows中,它是64位。那么如何共享句柄呢?
我猜同样的问题也适用于命名对象的句柄,例如互斥体、信号量和文件句柄。
... 截断句柄(从64位传递到32位时)或者扩展句柄(从32位传递到64位时)是安全的。
此处仍存在一些混淆,因为 WOW64 开发人员告诉我零扩展是正确的方式。如果您正在编写一个 64 位模块,并从 32 位模块获取句柄,则最安全的做法可能是仅比较句柄的低 32 位(即截断)。否则,您可能会在扩展方式上遇到问题。
我刚刚收到了一封来自微软WOW64开发人员的电子邮件,证实:
句柄是32位的,可以安全地截断/零扩展。这适用于内核对象句柄和USER/GDI句柄。
它们可以被共享的事实是否意味着在Win64进程中仅使用了低32位?Windows句柄是索引而不是指针,至少据我所知,因此,除非Microsoft想要允许超过2 ^ 32个窗口/文件/互斥等句柄,否则在Win64上没有理由使用void *
的高32位。
我认为你在一般情况下谨慎是正确的。然而,MSDN声称它们可以被共享,这对我们程序员来说是一个合同。他们不能说“今天分享”,然后明天就“不再分享”,否则会破坏大量软件。
同样地,为了让x64和32位软件在同一台机器上同时运行,并且让所有人都能相处融洽,HWNDs(以及许多HANDLEs)必须继续保持32位并且兼容。
我想我想说的是,至少在Windows 7的生命周期内,以及可能的Windows“下一个”版本中,我认为这是一个非常安全的赌注。
microsoft.public.windows.64bit.general
或microsoft.public.windows.app_compatibility
(请参阅http://www.aumha.org/nntp.php)。一些微软开发人员肯定清楚... - Tim Sylvester