Windows系统的编程接口常常用HResult返回执行结果的好坏。HResult通常是一个整型值,其字节宽度随计算机位数的增加而增加。现在常常把HResult看成一个带符号的32位整型值。和Linux的编程接口一样,采用负值,也就是最高位为1的值来表示错误代码。
HResult可以看作是HandleResult的缩写。应用程序常常通过Handle来引用系统资源,然后Result表示对这些资源操作所产生的结果。
HRsult的结构,根据Wikipedia HRESULT的记录:
其低16位为错误码,而高16位则划分出不同的功能区域,最大的区域是Facility区域,用来划分操作类型。对于Win32接口,Facility就是FACILITY_WIN32(0x007)。以错误码0x80070152为例,最高位置一,表示这是一个错误码,Facility为007,表示是一个Win32错误,低16为的0x0152,代表FT_WRITE_FAILURE。
其他比较常见的Facility当属FACILITY_URT,也就是.NET相关的Facility。
HResult中的R,C,N,X做特殊使用,可参考Wikipedia页面,此处不做介绍乐。
在winerror.h头文件中,定义乐HRESULT_FROM_WIN32宏,可以将Win32的错误码转为HResult。
HResult通常会对应一段描述,可以使用诸如GetRestrictedErrorInfo等接口来获取,更多参考How to get descriptions for HRESULT error codes for WinRT / Windows 10 Store code?
其他参考
- Structure of COM Error Codes
- Using Macros for Error Handling
- https://www.hresult.info/
- https://channel9.msdn.com/Shows/Inside/HRESULT
- https://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-191-HRESULT-Error-Codes
- How do I convert an HRESULT to a Win32 error code?
- Conversion of HRESULT between C++ and C#
- HRESULT
- [MS-ERREF]: Windows Error Codes
- 2.3 NTSTATUS
(本篇完)