HRESULT与Windows错误代码区别深度解析
78 浏览量
更新于2024-08-28
收藏 86KB PDF 举报
"深入理解HRESULT与Windows Error Codes的区别对于Windows API编程至关重要。在C++开发中,经常使用SUCCEEDED宏来检查API调用的结果,如示例中的RegCreateKeyEx函数。然而,对这些错误处理机制的理解不足可能导致隐藏的错误。
在代码示例中,我们看到程序员通常使用SUCCEEDED宏来判断函数返回值是否成功。例如:
```cpp
HRESULT hr = ::RegCreateKeyEx(hk, szKeyPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hk, NULL);
if (SUCCEEDED(hr)) {
// ...
}
```
SUCCEEDED宏的定义如下:
```cpp
#define SUCCEEDED(hr) ((HRESULT)(hr) >= 0)
```
这意味着,只要返回的HRESULT值是非负数,宏就会认为调用成功。这看似简单,但容易导致误解。实际上,HRESULT不仅仅是简单的成功/失败标志,它包含了丰富的错误信息。
HRESULT是一个32位的整数,其结构如下:
- 最高位(bit 31):表示成功或失败,0表示成功,1表示失败。
- 下面3位(bits 30-28):保留,通常是0。
- 接下来的16位(bits 27-12):标识符,表示错误来自哪个组件或接口。
- 最后12位(bits 11-0):具体的错误代码。
例如,S_OK的值是0x00000000,表示成功;而像E_ACCESSDENIED这样的错误代码,其值是0x80070005,其中0x80000000表示失败,0x70005是具体的错误代码。
因此,仅依赖于`SUCCEEDED(hr)`可能会忽略掉错误代码的细节。更安全的做法是直接比较返回值与特定的成功或失败代码,如`if (hr == S_OK)`,或者使用`FAILED(hr)`宏来检查失败情况。
错误处理的最佳实践是不仅要检查函数是否成功,还要捕获并处理特定的错误代码。例如:
```cpp
if (hr == S_OK) {
// ...
} else if (hr == E_ACCESSDENIED) {
// 处理权限问题
} else {
// 处理其他错误
}
```
通过这种方式,开发者可以更好地诊断和解决可能出现的问题,而不是简单地假设所有非零返回值都是失败。
深入理解HRESULT和Windows Error Codes的区别有助于编写健壮、容错性强的Windows应用程序。正确处理错误不仅能确保程序在出现问题时能够给出有意义的反馈,还能帮助调试和优化代码。
347 浏览量
103 浏览量
点击了解资源详情
2021-04-08 上传
点击了解资源详情
点击了解资源详情
2023-10-24 上传
2023-06-10 上传
2023-06-11 上传
weixin_38552292
- 粉丝: 6
- 资源: 894
最新资源
- ArcGISRIA开发实践.pdf
- 需要经常用到的正则表达式使用大全
- 大量的SCJP例题 310-055
- Linux内核完全注释V3.0
- 串口通信编程详细说明
- mtk+os.pdf
- SP3767收音机模块
- Photoshop CS4 Read Me.pdf
- LCD驱动芯片1628中文资料
- h.264 中文版 标准
- 高质量C++编程指南(林锐).doc
- 仪表放大工程师应用指南
- ATMEL AT91 Serial Timer usage
- 数据库系统概论第四版答案.doc.doc数据库系统概论第四版答案.doc.doc数据库系统概论第四版答案.doc.doc
- MPLAB idE应用指南
- 2009年研究生入学考试计算机统考大纲-完整版.pdf2009年研究生入学考试计算机统考大纲-完整版.pdf2009年研究生入学考试计算机统考大纲-完整版.pdf