HRESULT的详细说明

1. SUCCEEDED

原型以下: windows

BOOL SUCCEEDED(
  HRESULT hr
);

对应的定义(具体的实现):#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0) 函数

2. FAILED

原型以下: spa

BOOL FAILED(
  HRESULT hr
);

对应的定义(具体的实现):#define FAILED(hr) (((HRESULT)(hr)) < 0) 指针

注意: code

使用这两个宏来对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  不支持接口 it

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)进行比较以决定某个函数是否成功。

相关文章
相关标签/搜索