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的详细说明相关推荐

  1. WINDOWS WIA 驱动开发 0x80210015,0x80210016错误

    WIA是基于COM技术的,直接引用COM的DLL即可. 我问过商家,现在WIA是可以通过TWAIN进行驱动的.但是代码是不同的. <span style="font-size:12px ...

  2. CVPR2018关于检测的论文汇总

    1.By Object 查看全文 http://www.taodudu.cc/news/show-3614733.html 相关文章: CVPR2018资源汇总 CVPR2018论文笔记: Robus ...

  3. HRESULT详细说明

    关于HRESULT 如果函数正常执行,则返回S_OK,同时真正的函数运行结果则通过参数指针返回.如果遇到了异常情况,则COM系统经过判断,会返回相应的错误值. HRESULT         值    ...

  4. 异常详细信息: System.Runtime.InteropServices.COMException: 异常来自 HRESULT:0x800A03EC

    异常详细信息: System.Runtime.InteropServices.COMException: 异常来自 HRESULT:0x800A03EC 参考文章: (1)异常详细信息: System ...

  5. Visual Studio图形调试器详细使用教程(基于DirectX11)

    前言 对于DirectX程序开发者来说,学会使用Visual Studio Graphics Debugger(图形调试器)可以帮助你全面了解渲染管线绑定的资源和运行状态,从而确认问题所在.现在就以我 ...

  6. HRESULT返回值说明

    From: http://www.blogjava.net/JAVA-HE/archive/2010/01/04/308134.html HRESULT返回值说明 如果函数正常执行,则返回 S_OK, ...

  7. 详细讲解D3D8里面的2D图形编程(转)

    详细讲解D3D8里面的2D图形编程(转)[@more@] 利用D3D8的IDirect3DSurface8 & IDirect3DTexture8 模拟出一个简单的表面类. 利用这个类可以去完 ...

  8. Visual Studio 2017,C++MFC免注册调用大漠插件图文教程,详细版

    Visual Studio 2017,C++MFC免注册调用大漠插件图文教程,详细版 前言 提示:这里可以添加本文要记录的大概内容: 有很多人都在问C++MFC怎么免注册调用?其实这些都有参考但是对于 ...

  9. minidump详细介绍及其windbg的使用

    简介 在过去几年里,崩溃转储(crash dump)成为了调试工作的一个重要部分.如果软件在客户现场或者测试实验室发生故障,最有价值的解决方式是能够创建一个故障瞬间的应用程序状态镜像,然后可以在开发者 ...

最新文章

  1. double free
  2. Linux系统搭建Red5服务器
  3. VMware 在ubuntu-18.04.2安装搜狗输入法
  4. 《C++游戏编程入门(第4版)》——1.11 问题讨论
  5. android切换到上个页面,Android 返回上一个界面刷新数据
  6. c#基础这些你都看过吗?(一)-----仅供初学者使用
  7. SpringMvc自定义参数绑定
  8. 遥控小车遥控赛车html5小游戏源码 【HTML游戏】
  9. iRightMouse 1.2.0 中文版 (超赞的Mac右键菜单扩展)
  10. 搜索引擎的查找算法实现
  11. 微表情如何用计算机分析计算,基于差分定位与光流特征提取的微表情识别 - 计算机应用与软件.pdf...
  12. Julia学习04——函数
  13. ODrive0.5.1程序分析#4 闭环控制程序(run_closed_loop_control_loop)
  14. 靠一套PPT上市估值120亿:新能源韭菜的自我修养
  15. shell 的一个小 脚本模板实现hosts添加
  16. linux mint 18.3 内核,Linux Mint 18.3 “Sylvia” KDE和Xfce版本正式发布
  17. 【学习笔记】C语言程序设计入门(一)
  18. 14 最小二乘估计原理推导和线性回归的外推等
  19. 基于python调用摄像头进行人脸识别,支持多张人脸同时识别
  20. stm32频率计(定时器外部计数的方式)

热门文章

  1. 26进制的加法和除法codeforces1144E
  2. 【最快的ubuntu系统安装微信教程】
  3. 练习-Java循环之嵌套循环之比赛名单判断
  4. Oracle 12C RMAN Cross-Platform Transport of PDBs
  5. linux下一款不错的背单词软件(reciteword)
  6. 使用LED灯和Arduino开发板制作一个智能马克杯
  7. .NetCore HttpClient Proxy 设置全局代理
  8. 今天,你放半天假了吗?
  9. matlab c语言 iir,Matlab下 IIR 滤波器实现(Simulink仿真和C语言实现)
  10. 浅析AnyCast网络技术