COM原理
+ -

COM开发时使用的Win32 SDK头文件、宏定义和HRESULT

2022-02-09 67 0

Win32 SDK提供的头文件

  • Unknwn.h 标准接口IUnknown和IClassFacatory的IID及接口成员函数的定义
  • Wtypes.h 包含COM使用的数据结构的说明
  • Objidl.h 所有标准接口的定义,既可用于C语言风格的定义,也可用于C++语言
  • Comdef.h 所有标准接口及COM和OLE内部对象的CLSID
  • ObjBase.h 所有的COM API函数的说明
  • Ole2.h 所有经过封装的OLE辅助函数

与COM接口有关的宏

  • DECLARE_INTERFACE(iface) 声明接口iface,它不从其它接口派生
  • DECLARE_INTERFACE_(iface,baseiface) 声明接口iface,它从接口baseiface派生
  • STDMETHOD(method) 声明接口成员函数method,函数返回类型为HRESULT
  • STDMETHOD_(type,method) 声明接口成员函数method,函数返回类型为type

HRESULT类型

D30-31 D29 D28-16 D15-0
函数调用结果 是否自定义标识 操作来源 操作的状态

HRESULT类型的返回值反映了函数中的一些情况,定义规范如下:
类别码(D30-31)反映函数调用结果:

  • 00调用成功;
  • 01包含一些信息;
  • 10警告;
  • 11错误。

自定义标记(D29)反映结果是否为自定义标识

  • 1为是
  • 0则不是;

操作码(D28-16)标识结果操作来源,在Win32平台的定义如下:

#define FACILITY_NULL        0
#define FACILITY_RPC        1
#define FACILITY_DISPATCH    2
#define FACILITY_STORAGE    3
#define FACILITY_ITF        4
#define FACILITY_WIN32        7
#define FACILITY_WINDOWS    8
#define FACILITY_SSPI        9
#define FACILITY_CONTROL    10
#define FACILITY_CERT        11
#define FACILITY_INTERNET    12

操作结果码(D15-0)反映操作的状态,WinError.h定义了Win32函数所有可能返回结果。常用的如下:

S_OK                    函数执行成功,其值为0 (注意,与TRUE相反)
S_FALSE                    函数执行成功,其值为1
S_FAIL                    函数执行失败,失败原因不确定
E_OUTOFMEMORY            函数执行失败,失败原因为内存分配不成功
E_NOTIMPL                函数执行失败,成员函数没有被实现
E_NOTINTERFACE            函数执行失败,组件没有实现指定的接口

不能简单地把返回值与S_OK和S_FALSE比较,而要用SECCEEDED和FAILED宏进行判断。

#define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)
#define FAILED(Status) ((HRESULT)(Status)<0)

使用方法

HRESULT hr=CreateXXX();
if(SUCCEEDED(hr))
{
  ...
}

0 篇笔记 写笔记

COM开发时使用的Win32 SDK头文件、宏定义和HRESULT
Win32 SDK提供的头文件Unknwn.h 标准接口IUnknown和IClassFacatory的IID及接口成员函数的定义Wtypes.h 包含COM使用的数据结构的说明Objidl.h ......
COM 数据类型HRESULT
COM组件是运行在分布式环境中的。比如,写一个组件程序(DLL或EXE),使用者可能是在本机的某个进程内加载组件(INPROC_SERVER);也可能是从另一个进程中调用组件进程(LOCAL_SERVER);也可能是在这台计算机上调用地球那边计算机上的组件(REMOTE_SERVER)。所以,在理解......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!