通过《Win32 Error》、《COM Error---HRESULT 》和《NTSTATUS》等我们知道了一些win32错误基础知识,下面我们说点其他的东西。
1、GetLastError()返回一个winapi错误代码.从1开始的简单数字.它们通常从底层本机api错误代码映射。Winapi错误代码在WinError.h SDK头文件中声明.您可以指望使用FORMAT_MESSAGE_FROM_SYSTEM选项从FormatMessage()获取描述性字符串。
2、HRESULT是COM错误代码.它由三个基本部分构成,高位表示严重性,中间位编码指示错误源的工具,低16位编码错误编号.HRESULT_FROM_WIN32()宏是一个帮助宏,用于将winapi错误代码映射到COM错误代码.它只将严重性设置为"失败",设施代码设置为7(winapi)并将错误代码复制到低位.有许多可能的COM错误代码,并且只有少数可以通过FormatMessage()转换为字符串.您应该使用ISupportErrorInfo接口来询问COM服务器是否可以通过IErrorInfo提供错误的描述。
3、内核和Native API则一般使用NTSTATUS类型的错误码。它们记录在ntstatus.h SDK标头中.winapi应该包装原生api。FormatMessage()可以将常用的转换为字符串,只要它不是驱动程序生成的自定义错误代码即可.有几种api使用这些错误代码,即使它们在用户模式下运行,获取此类错误代码的字符串需要使用FormatMessage和FORMAT_MESSAGE_FROM_HMODULE选项。
另外,这三者之间是可以相互转换的:
GetLastError->HRESULT: HRESULT_FROM_WIN32
NTSTATUS -> Win32:LsaNtStatusToWinError()
NTSTATUS -> HRESULT:HRESULT_FROM_WIN32( LsaNtStatusToWinError())
还有其他一些全局的函数可以帮到我们:
名称 | 说明 |
---|---|
AtlHresultFromLastError | 以 HRESULT 的形式返回 GetLastError 错误代码。 |
AtlHresultFromWin32 | 将 Win32 错误代码转换为 HRESULT。 |
AtlReportError | 设置 IErrorInfo 可向客户端提供错误详细信息。 |
AtlThrow | 引发 CAtlException 。 |
AtlThrowLastWin32 | 调用此函数可根据 Windows 函数 GetLastError 的结果发出错误。 |