关于HRESULT判断的宏(SUCCEEDED/FAILED)
来源:互联网 发布:网络词flop是什么意思 编辑:程序博客网 时间:2024/06/05 18:36
1. SUCCEEDED
原型如下:
BOOL SUCCEEDED( HRESULT hr);
对应的定义(具体的实现):#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)
2. FAILED
原型如下:
BOOL FAILED( HRESULT hr);
对应的定义(具体的实现):#define FAILED(hr) (((HRESULT)(hr)) < 0)
注意:
使用这两个宏来对COM组件的返回值HRESULT进行判断;
因为HRESULT值为返回状态,可能有很多种状态,所以不能直接判断
3 关于HRESULT
如果函数正常执行,则返回S_OK,同时真正的函数运行结果则通过参数指针返回。如果遇到了异常情况,则COM系统经过判断,会返回相应的错误值。
HRESULT 值 含义
S_OK 0x00000000 成功
S_FALSE 0x00000001 函数成功执行完成,但返回时出现错误
E_INVALIDARG 0x80070057 参数有错误
E_OUTOFMEMORY 0x8007000E 内存申请错误
E_UNEXPECTED 0x8000FFFF 未知的异常
E_NOTIMPL 0x80004001 未实现功能
E_FAIL 0x80004005 没有详细说明的错误。一般需要取得 Rich Error 错误信息(注1)
E_POINTER 0x80004003 无效的指针
E_HANDLE 0x80070006 无效的句柄
E_ABORT 0x80004004 终止操作
E_ACCESSDENIED 0x80070005 访问被拒绝
E_NOINTERFACE 0x80004002 不支持接口
HRESULT 其实是一个双字节的值,其最高位(bit)如果是0表示成功,1表示错误。具体参见 MSDN 之"Structure of COM Error Codes"说明。我们在程序中如果需要判断返回值,则可以使用比较运算符号;switch开关语句;也可以使用VC提供的宏:
HRESULT hr = 调用组件函数;
if( SUCCEEDED( hr ) ){...} // 如果成功
......
if( FAILED( hr ) ){...} // 如果失败
......
大多数COM 函数以及一些接口成员函数的返回值类型均为HRESULT 类型。HRESULT 类型的返回值反映了函数中的一些情况,其类型定义规范如下:
31 30 29 28 16 15 0
|-----|--|------------------------|-----------------------------------|
类别码 (30-31) 反映函数调用结果:
00 调用成功
01 包含一些信息
10 警告
11 错误
自定义标记(29) 反映结果是否为自定义标识,1 为是,0 则不是;
操作码 (16-28) 标识结果操作来源,在 Windows 平台上,其定义如下:
#define FACILITY_WINDOWS 8
#define FACILITY_STORAGE 3
#define FACILITY_RPC 1
#define FACILITY_SSPI 9
#define FACILITY_WIN32 7
#define FACILITY_CONTROL 10
#define FACILITY_NULL 0
#define FACILITY_INTERNET 12
#define FACILITY_ITF 4
#define FACILITY_DISPATCH 2
#define FACILITY_CERT 11
操作结果码(0-15) 反映操作的状态,WinError.h 定义了 Win32 函数所有可能返回结果。
以下是一些经常用到的返回值和宏定义:
S_OK 函数执行成功,其值为 0 (注意,其值与 TRUE 相反)
S_FALSE 函数执行成功,其值为 1
S_FAIL 函数执行失败,失败原因不确定
E_OUTOFMEMORY 函数执行失败,失败原因为内存分配不成功
E_NOTIMPL 函数执行失败,成员函数没有被实现
E_NOTINTERFACE 函数执行失败,组件没有实现指定的接口
注意:不能简单地把返回值与S_OK和S_FALSE比较,而要用SECCEEDED 和FAILED 宏进行判断
FAILED和SUCCEEDED是windows中定义的宏函数,而S_OK只是一个特定的值。
#define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)
#define FAILED(Status) ((HRESULT)(Status) <0)
成功的代码有多个,失败的代码也有多个一个函数在各种情况下返回的状态代码通常将包含多个成功代码及多个失败代码。
这就是我们为什么要使用SUCCEEDED及FAILED宏的原因。一般不能直接将HRESULT值同某个成功代码(如S_OK)进行比较以决定某个函数是否成功。
- 关于HRESULT判断的宏(SUCCEEDED/FAILED)
- 关于HRESULT判断的宏(SUCCEEDED/FAILED)
- note : FAILED宏 和 SUCCEEDED宏 的使用细节
- 关于arcgis server 发布地图的时候报错"Packaging succeeded but publishing failed"问题解决
- COM中的 FAILED 和 SUCCEEDED
- RabbitMQ安装不当出现的问题:TCP connection succeeded but Erlang distribution failed
- 关于HRESULT句柄的说明
- 关于HRESULT
- [已解决]windows 上面git 克隆clone 的时候报错 warning:Clone succeeded,but checkout failed
- 分享两篇关于HRESULT的文章
- COM笔记-关于HRESULT
- COM笔记-关于HRESULT
- How I Failed, Failed, and Finally Succeeded at Learning How to Code
- 关于 Office的Error 1935(HRESULT:0x8007054F)的修复
- 关于C#调用IDLsav文件返回HRESULT的处理
- win2003 64位英文 IIS安装.net 2.0时的问题 IsDomainController failed with HRESULT 80070842
- lnmp安装到config-set succeeded的时候卡住,解决办法
- MFC 调试:Build: 0 succeeded or up-to-date, 0 failed, 1 skipped--问题解决
- POJ 3461 Oulipo KMP
- 再见了,CSDN
- 阅读Android官方教程 Google Training 1.7 ----- Working with System Permissions
- 系统栏系列之背景图片侵入系统栏
- jQuery-ui插件实现百度提词器的效果,各种效果可以设置
- 关于HRESULT判断的宏(SUCCEEDED/FAILED)
- 这样一类问题总是显得特殊
- 二维数组中的查找
- Retrofit2.0 OkHttp如何自动加载Cookie 持久化
- oracle第一次使用语句创建作业失败记
- 3_Oracle_SQL语句执行过程剖析
- fcitx输入法在wps、wineqq中失灵问题的解决
- HDU 5399 Too Simple(数学 + 找规律)——2015 Multi-University Training Contest 9
- springboot学习笔记(二):基于MySql数据库的JDBC操作