22

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

我猜同样的问题也适用于命名对象的句柄,例如互斥锁、信号量和文件句柄。

4

5 回答 5

20

正如 Daniel Rose 上面指出的那样,MSDN 文档现在指出:

... 截断句柄(从 64 位传递到 32 位时)或对句柄进行符号扩展(从 32 位传递到 64 位时)是安全的。

鉴于我被告知零扩展是 WOW64 开发人员的正确方法,这里似乎仍然存在一些混淆。如果您正在编写从 32 位模块获取句柄的 64 位模块,最安全的选择可能是仅比较句柄的低 32 位(即截断)。否则,您可能会发现符号扩展与零扩展的差异。

于 2013-04-29T23:27:08.927 回答
13

我刚刚收到一封来自 Microsoft WOW64 开发人员的电子邮件,他确认:

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

于 2009-12-01T23:57:58.340 回答
9

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

于 2009-11-30T22:08:41.320 回答
2

查看 Microsoft 接口定义语言 (MIDL) 移植指南,第 12 页 (http://msdn.microsoft.com/en-us/library/ms810720.aspx)

看看 USER 和 GDI 句柄是符号扩展的 32b 值

于 2010-11-26T15:43:46.433 回答
1

我认为您总体上保持谨慎是正确的。但是,MSDN 声称它们可以共享是对我们程序员的合同。如果不破坏大量软件,他们就不能很好地说“今天分享”,然后明天“不再分享”。

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

我想我想说的是,我认为这是一个非常安全的选择,至少在 Windows 7 的整个生命周期内,并且可能是 Windows 的“下一个”。

于 2009-11-30T22:20:00.413 回答