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)相关推荐

  1. HRESULT判断宏

    1.SUCCEEDED 原型如下: BOOL SUCCEEDED(HRESULT hr ); 对应的定义(具体的实现): #define SUCCEEDED(hr) (((HRESULT)(hr)) ...

  2. linux c 宏判断多条件 #ifdef 和 #if defined 的区别

    多个条件判断用 #if defined 单个条件判断用 #ifdef #ifdef 和 #if defined 的区别在于,后者可以组成复杂的预编译条件,比如 #if defined (AAA) &a ...

  3. Qt pro工程文件中判断宏定义是否存在

    在Qt工程文件中如果自定义了宏,那么在如果要判断该宏是否存在,可以这么写 xx.pro 添加宏定义: DEFINES += ANDROID_TV 判断宏定义是否存在 contains(DEFINES, ...

  4. QT.pro工程文件中判断宏定义是否存在

    在QT .pro文件中添加自定义了宏: DEFINES += ANDROID_TV 那么如果要判断该宏是否存在,可以这么写 xx.pro contains(DEFINES,ANDROID_TV) { ...

  5. HRESULT的使用

    HRESULT hr = func(); if( SUCCEEDED( hr ) ){...} // 如果成功 if( FAILED( hr ) ) {...} // 如果失败 这篇文章总结较为详细& ...

  6. 空的宏定义作用及常见用法

    空的宏定义作用及常见用法 我们学习宏定义的第一个概念是,宏定义作为替换作用. 例如: #define SIZE 32 // 接下来代码使用SIZE就相当于32 宏定义是编译器在编译时,将程序中所有SI ...

  7. C 和 C++ 宏 详解

    From:https://www.cnblogs.com/njczy2010/p/5773061.html C中的预编译宏详解:http://www.cppblog.com/bellgrade/arc ...

  8. 【C语言】----宏定义,预处理宏

    什么是宏? 宏是学习任何语言所不可缺少的,优秀的宏定义可以使得代码变得很简洁且高效,有效地提高编程效率. 宏是一种预处理指令,它提供了一种机制,可以用来替换源代码中的字符串,解释器或编译器在遇到宏时会 ...

  9. objective-c宏定义

    1.先来几个常用的: [csharp] view plaincopy // 是否高清屏 #define isRetina ([UIScreen instancesRespondToSelector:@ ...

  10. C中的预编译宏定义-转

    C中的预编译宏定义 2009-02-10 作者: infobillows 来源:网络 在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocesso ...

最新文章

  1. 刚刚,中国空间站核心舱“天和”出征太空!
  2. 戴尔怎样把计算机放在桌面,戴尔台式机桌面图标不见了怎么办
  3. redis的学习使用,第二章
  4. JZOJ 5395. 【NOIP2017提高A组模拟10.6】Count
  5. 「BZOJ2879」[Noi2012]美食节
  6. iOS-仿支付宝加载web网页添加进度条
  7. 基于JAVA+SpringBoot+Mybatis+MYSQL的疫情信息分析管理系统
  8. rabbitmq 手动提交_第四章----SpringBoot+RabbitMQ发送确认和消费手动确认机制
  9. 谈谈Java中的集合
  10. mysql linux内核_mysql 5.7.15 vs mysql 5.6.31性能测试以及不同linux内核性能比较
  11. SQL常用语句总结整理
  12. 【OS学习笔记】二 汇编语言和汇编软件
  13. teamviewer Android 8,利用TeamViewer控制设备
  14. Arduino for Esp8266 基础篇之Ticker
  15. 输入netsh winsock reset 重启电脑生效
  16. 【入门】广电行业DNS、DHCP解决方案详解(三)——DNS部署架构及案例
  17. 精神心理科医生教您如何摆脱精神科药物带来的副作用
  18. 【整理】扩频及CDMA知识点
  19. ESP8266-Arduino编程实例-MS5611气压传感器驱动
  20. 根据国家法定节假日来计算出报告时间

热门文章

  1. c 调用openoffice word转pdf_Word 批量转 PDF
  2. python装饰器两层和三层_python装饰器为什么要双层嵌套函数
  3. linux下槽函数的响应时间,Qt信号与槽之connectSlotsByName函数
  4. php前端代码隐藏,php – Yii2 htaccess – 如何隐藏前端/ web和后台/ web完全
  5. 基于adaboost算法的人脸检测_基于噪声检测的图像去噪算法
  6. ch340串口驱动_敏矽微电子Cortex-M0学习笔记07-串口通信详解
  7. java 字符串 数字个数_Java 求一串字符串中字符,字母,数字的个数
  8. 单片机涡轮流量传感器_青天仪表为您介绍安装涡轮流量计需要注意问题
  9. anaconda怎么打开python3.7,使用anaconda更新到python 3.7
  10. MyBatis(一)------目录