64位应用程序上的Windows HANDLE的范围是什么?

在WinAPI上, HANDLEtypes被定义为void* ,因此在64位应用程序中, HANDLE值可以从018446744073709551615 。 但是,在实践中是这样吗? 任何文件是否规定了这种HANDLE的整体范围?

例如,如果想把这个HANDLE作为int32_t存储在一个完全正常的32位应用程序中,但是在64位应用程序中,这个疑惑将会持续下去。

Solutions Collecting From Web of "64位应用程序上的Windows HANDLE的范围是什么?"

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位。