我正在 Win32 + WTL 中进行一些编程,我对可用的错误类型感到困惑。
一般来说,我想检查错误,并将其提供给 AtlGetErrorDescription (它调用 FormatMessage)。
我的问题是:
-
有什么区别:
-
DWORD
,由返回GetLastError
.
-
HRESULT
,由例如返回这CAtlFile
包装器,它使用HRESULT_FROM_WIN32
转换自DWORD
.
-
LSTATUS
,由例如返回RegCreateKeyEx
.
我可以反馈哪些类型的错误FormatMessage
?它的签名表明它接受HRESULT
,但是有很多例子的返回值GetLastError
被直接传递给FormatMessage
.
它们只是反映了 Windows 中使用的不同 API:
GetLastError() 返回 winapi 错误代码。从 1 开始的简单数字。它们通常从底层本机 API 错误代码映射。就像 ERROR_FILE_NOT_FOUND 是从 STATUS_OBJECT_NAME_NOT_FOUND 文件系统驱动程序错误代码映射的。 Winapi 错误代码在 WinError.h SDK 头文件中声明。您可以使用 FORMAT_MESSAGE_FROM_SYSTEM 选项从 FormatMessage() 获取描述性字符串。
HRESULT 是 COM 错误代码。它由三个基本部分组成,高位表示严重性,中间位编码facility指示错误来源,低 16 位编码错误号。 HRESULT_FROM_WIN32() 宏是一个辅助宏,用于将 winapi 错误代码映射到 COM 错误代码。它只是将严重性设置为“失败”,将设施代码设置为 7 (winapi),并将错误代码复制到低位。可能的 COM 错误代码有很多,但只有少数可以通过 FormatMessage() 转换为字符串。您应该使用 ISupportErrorInfo 接口来询问 COM 服务器是否可以通过 IErrorInfo 提供错误的描述。
LSTATUS 晦涩难懂,RegCreateEx 实际上返回 LONG,只是 winapi 错误代码。它确实会在某些 shell 包装函数中弹出,例如 SHGetValue()。我常常很不清楚为什么 shell 团队会这样做。
您的问题中没有提到,但值得注意的是本机 api 生成的错误代码。它们记录在 ntstatus.h SDK 标头中。 winapi 应该包装本机 api,但这些错误代码有时会在边缘出现,特别是在异常情况下。大多数程序员都见过 0xc0000005 (STATUS_ACCESS_VIOLATION) 异常代码。 0xc00000fd 与此站点的名称匹配。 FormatMessage() 可以将常见的错误代码转换为字符串,只要它不是由驱动程序生成的自定义错误代码。有多个 api 使用此类错误代码,即使它们在用户模式下运行也是如此。常见的例子是 WIC 和媒体基金会,否则没有强烈暗示他们为什么喜欢这种方式。获取此类错误代码的字符串需要使用带有 FORMAT_MESSAGE_FROM_HMODULE 选项的 FormatMessage。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)