我怎样才能共享Win 32中的32位和64位应用程序的HWND?

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

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

Solutions Collecting From Web of "我怎样才能共享Win 32中的32位和64位应用程序的HWND?"

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

正如丹尼尔·罗斯(Daniel Rose)指出的那样, MSDN文档现在指出:

…将句柄截断(从64位传递到32位)或签名扩展句柄(从32位传递到64位)是安全的。

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

我刚收到一封微软WOW64开发者发来的电子邮件,确认:

手柄是32位,可以安全地截断/零扩展。 内核对象句柄和USER / GDI句柄都是如此。

请参阅Microsoft接口定义语言(MIDL)移植指南(第12页)(http://msdn.microsoft.com/zh-cn/library/ms810720.aspx)

这里有一个用户名和GDI句柄是符号扩展的32b值

我认为你总的来说是谨慎的。 但是,MSDN声称他们可以共享是我们程序员的合同。 他们不能很好地说“今天分享”,然后明天“不再”,而不会破坏大量的软件。

同样,为了使x64和32位软件在给定的机器上同时运行,并且让每个人都能相处,HWND(和许多HANDLE)必须继续保持32位和兼容。

我想我所说的是,我认为这是一个非常安全的选择,至少在Windows 7的一生中,可能是Windows“下一个”。