64位应用程序上的Windows HANDLE的范围是多少?

Den*_*rim 23 windows 64-bit winapi handle

在WinAPI上,HANDLE类型定义为a void*,因此在64位应用程序上,HANDLE值的范围可以018446744073709551615.但这在实践中是真的吗?有没有文件说明这样的整体范围HANDLE

例如,如果有人希望将其存储HANDLEint32_t完全正常的32位应用程序,但在64位应用程序上则存在疑虑.

Blu*_*kMN 23

MSDN声明:

64位版本的Windows使用32位句柄来实现互操作性.在32位和64位应用程序之间共享句柄时,只有低32位是重要的,因此截断句柄(将其从64位传递到32位)或对句柄进行符号扩展是安全的(当它从32位传递到64位时).可共享的句柄包括用户对象的句柄(如windows(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

  • 您依赖的评论没有权限.按照文档. (2认同)