在 WinAPI 上,HANDLE
类型被定义为void*
,因此在 64 位应用程序上HANDLE
值的范围可能是0
to 18446744073709551615
。
但实际上是这样吗?是否有任何文档指定了此类的积分范围HANDLE
?
例如,如果有人想存储这个HANDLE
as an int32_t
在 32 位应用程序上这完全没问题,但在 64 位应用程序上则令人怀疑。
MSDN 指出:
32 位和 64 位应用程序之间的进程间通信 https://msdn.microsoft.com/en-us/library/windows/desktop/aa384203%28v=vs.85%29.aspx
64 位版本的 Windows 使用 32 位句柄来实现互操作性。
在 32 位和 64 位应用程序之间共享句柄时,只有
低 32 位很重要,因此截断句柄是安全的
(将其从 64 位传递到 32 位时)或对句柄进行符号扩展
(将其从 32 位传递到 64 位时)。可共享的句柄
包括用户对象的句柄,例如窗口 (HWND)、GDI 句柄
笔和画笔(HBRUSH 和 HPEN)等对象,以及句柄
命名对象,例如互斥体、信号量和文件句柄。
还值得注意的是该页面上添加的评论:
跨进程边界共享此类句柄的正确方法是
将 32 位句柄零扩展为 64 位,或者通过截断将 32 位句柄零扩展为 64 位
64 位处理 32 位并丢弃最高位。
请注意“符号扩展”句柄与“零扩展”句柄之间的区别。
Edit:从这个问题的已删除答案中看到的讨论来看,我认为对 32 位句柄进行符号扩展以达到 64 位句柄而不是零扩展的重要性在于保留对 INVALID_HANDLE_VALUE 值的正确处理一个手柄。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)