HRESULT判断宏
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 错误信息
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提供的宏:
typede long HRESULT;
HRESULT hr = E_FAIL;
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判断宏相关推荐
- Qt pro工程文件中判断宏定义是否存在
在Qt工程文件中如果自定义了宏,那么在如果要判断该宏是否存在,可以这么写 xx.pro 添加宏定义: DEFINES += ANDROID_TV 判断宏定义是否存在 contains(DEFINES, ...
- Source Insight中无法正确判断宏定义的问题
Source Insight阅读C语言项目,会出现#ifdef无法正确判断宏定义值导致无法正确跳转到#else的问题,因为软件本身只能识别TRUE和FALSE,解决方法是右键该宏定义选择"E ...
- QT.pro工程文件中判断宏定义是否存在
在QT .pro文件中添加自定义了宏: DEFINES += ANDROID_TV 那么如果要判断该宏是否存在,可以这么写 xx.pro contains(DEFINES,ANDROID_TV) { ...
- CVPR2018关于检测的论文汇总
1.By Object 查看全文 http://www.taodudu.cc/news/show-3614733.html 相关文章: CVPR2018资源汇总 CVPR2018论文笔记: Robus ...
- VC中的宏 (#define) 与预处理 (#if/#ifdef/#pragma) 的使用方法总结。
C/C++ 预定义宏 例子:C/C++ 预定义宏的取值 C/C++ 预定义宏用途:诊断与调试输出 CRT 的诊断与调试输出:assert, _ASSERT/_ASSERTE, _RPTn/_RPTFn ...
- 条件编译宏定义_C语言学习- 预处理指令2 - 条件编译
上一篇已经介绍了预处理指令中的宏定义,这篇就介绍一下条件编译! 条件编译的概念 在很多情况下,我们希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执 ...
- C语言开发必会 宏定义、宏函数
文章目录 宏定义 宏函数 宏定义之闰年判断 宏定义 宏定义是C中三种预处理方式(宏定义.文件包含.条件编译)的一种,只做替换.不求解. 宏定义分为有参宏定义和无参宏定义两种.应特别注意有参宏定义的括号 ...
- 国服WLK野德德鲁伊专用宏整理:野德新手练级副本宏
国服WLK野德德鲁伊专用宏整理:野德新手练级副本宏 野德专用宏,节省技能栏,适用国服3.22 如果野德不用宏..请给我三只手.. 分享一下自己用的几个宏,适合野德新手.并诚心求高手改进. 1.横扫宏. ...
- iOS - 常用宏定义和PCH文件知识点整理
(一)PCH文件操作步骤演示: 第一步:图文所示: 第二步:图文所示: (二)常用宏定义整理: (1)常用Log日志宏(输出日志详细可定位某个类.某个函数.某一行) //=============== ...
最新文章
- mybaties插件生成代码
- python接口测试第二期_python2 接口测试一般方法.
- [SHOI2014] 概率充电器
- WPF 用装饰器制作抽屉效果
- 操作系统上机作业--使用系统调用实现mycp
- mongoDB 3.0以前版本 - 入门指南、示例
- 动态规划系列-连续的子数组和(leetcode523)
- 2048小游戏成品源码
- matlab中邮递员问题实例,中国邮递员问题的求解实例.doc
- 计算机技术研究生省考,省考,硕士学历计算机技术(专硕)可以报计算机类的职位吗...
- Linux基础篇——Linux用户管理、组管理、权限管理
- 08系统装iss_安全信息系统| ISS | 第1部分
- 禅与 JavaScript 编程艺术, Zen and The Art of JavaScript Programming
- 解决TS中“Cannot find module ‘path‘ or its corresponding type declarations.”
- Xcode No certificate for team ‘xxx‘ matching ‘iPhone Developer: xxx (xxx)‘
- Solana中的account
- HDU Today-SPEA
- guided filter matlab,导向滤波(Guided Filter)的解析与实现
- 分享广东联通光猫超级密码
- PHP匿名在线聊天室系统源码