微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

winapi – Windows中的错误 – DWORD(GetLastError)vs HRESULT vs LSTATUS

我在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错误代码.它由三个基本部分构成,高位表示严重性,中间位编码指示错误源的设施,低16位编码错误编号. HRESULT_FROM_WIN32()宏是一个帮助宏,用于将winapi错误代码映射到COM错误代码.它将严重性设置为“fail”,设备代码设置为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()可以将常用的转换为字符串.有几个apis使用这些错误代码,即使它们在用户模式下运行.常见的例子是WIC和媒体基金会,否则没有强烈的暗示,为什么他们喜欢这样.获取一个这样的错误代码的字符串需要使用FormatMessage与FORMAT_MESSAGE_FROM_HMODULE选项.

原文地址:https://www.jb51.cc/windows/364241.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐