在WinAPI上, HANDLE
types被定义为void*
,因此在64位应用程序中, HANDLE
值可以从0
到18446744073709551615
。 但是,在实践中是这样吗? 任何文件是否规定了这种HANDLE
的整体范围?
例如,如果想把这个HANDLE
作为int32_t
存储在一个完全正常的32位应用程序中,但是在64位应用程序中,这个疑惑将会持续下去。
MSDN指出:
Windows的64位版本使用32位手柄来实现互操作性。 在32位和64位应用程序之间共享句柄时,只有较低的32位是有意义的,因此可以安全地截断句柄(将它从64位传递到32位时)或签名扩展句柄当从32位传递到64位)。 可以共享的句柄包括用户对象(如窗口(HWND))的句柄,GDI对象(如钢笔和画笔(HBRUSH和HPEN))的句柄,以及指向对象(例如互斥体,信号量和文件句柄)的句柄。
还值得注意的是,在该页面上添加了这条评论:
跨进程边界共享这些句柄的正确方法是将32位句柄零扩展为64位,反之亦然,将64位句柄截断为32位,丢弃最高位。
注意“手势扩展”句柄与“零扩展”句柄之间的区别。
编辑:从对这个问题删除的答案中看到的讨论来看,我认为符号扩展一个32位句柄到达一个64位句柄,而不是零扩展它的意义是保留适当的处理INVALID_HANDLE_VALUE值为一个句柄。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa384203%28v=vs.85%29.aspx
我希望知道它在哪里被记录,但我的一个同事坚持认为64位HWND句柄总是适合32位。 我从来没有看到过这样的情况,但是不能说明未来或者有记录的地方。 关于像HTREEITEM这样的其他句柄,它们是完整的64位,我也曾经假设它们也适合32位。