首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Windows (GetLastError)对HRESULT与LSTATUS中的错误

Windows (GetLastError)对HRESULT与LSTATUS中的错误
EN

Stack Overflow用户
提问于 2013-10-23 16:37:13
回答 1查看 10.3K关注 0票数 24

我正在用Win32 + WTL进行一些编程,我对可用的错误类型感到困惑。

通常,我希望检查一个错误,并将它提供给AtlGetErrorDescription (它调用FormatMessage)。

我的问题是:

  1. 在以下方面有什么区别:

代码语言:javascript
运行
复制
- `DWORD`, returned by `GetLastError`.
- `HRESULT`, returned by e.g. the `CAtlFile` wrapper, which uses `HRESULT_FROM_WIN32` to convert from `DWORD`.
- `LSTATUS`, returned by e.g. `RegCreateKeyEx`.

  1. 我可以向FormatMessage提供哪些类型的错误?它的签名表明它接受HRESULT,但是有很多例子表明GetLastError的返回值直接传递给FormatMessage
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-23 17:37:18

它们只反映Windows中使用的不同API:

  • GetLastError()返回一个winapi错误代码。从1开始的一个简单的数字。它们通常是从底层的本地api错误代码映射出来的。像ERROR_FILE_NOT_FOUND一样,从STATUS_OBJECT_NAME_NOT_FOUND文件系统映射驱动程序错误代码。Winapi错误代码在WinError.hSDK头文件中声明。您可以指望从FormatMessage()获得一个带有FORMAT_MESSAGE_FROM_SYSTEM选项的描述性字符串。
  • HRESULT是COM错误代码。它由三个基本部分组成,高比特表示严重程度,中间位编码表示错误来源的设施,低16位编码错误号。HRESULT_FROM_WIN32()宏是一个帮助宏,用于将winapi错误代码映射到COM错误代码。它只是将严重性设置为"fail",将设备代码设置为7 (winapi),并将错误代码复制到低位。有很多可能的COM错误代码,其中只有少数可以通过FormatMessage()转换为字符串。您应该使用ISupportErrorInfo接口来询问COM服务器是否可以通过IErrorInfo提供错误描述。
  • LSTATUS是模糊的,RegCreateEx实际上返回LONG,只是winapi错误代码。它确实弹出在一些shell包装函数中,比如SHGetValue()。我常常不清楚为什么壳牌团队会这么做。
  • 您的问题中没有提到,但是值得注意的是由本机api生成的错误代码。它们被记录在ntstatus.hSDK头中。winapi应该包装本地api,但这些错误代码有时会绕过边缘,特别是在异常情况下。大多数程序员都见过0xc0000005 (STATUS_ACCESS_VIOLATION)异常代码。0xc00000fd匹配此站点的名称。只要不是驱动程序生成的自定义错误代码,FormatMessage()就可以将常见的错误代码转换为字符串。有几个apis使用这种错误代码,即使它们是在用户模式下运行的。常见的例子是WIC和Media Foundation,否则就没有强烈的暗示他们为什么喜欢这种方式。获取此类错误代码的字符串需要使用FormatMessage和FORMAT_MESSAGE_FROM_HMODULE选项。
票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19547419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档