CR的代码文本

all for learning about the world
  订阅 订阅  :: 管理

COM技术内幕第三章笔记-接口查询

Posted on 2010-07-27 12:47  mumuliang  阅读(454)  评论(0编辑  收藏  举报

接口查询

头文件:IUnknown接口定义包含在Win32 SDK的unknwn.h中。

函数:QueryInterface, AddRef, Release

用途:查询组件的其他接口。

所有COM接口都需集成IUnknown,都支持QueryInterface。

创建组件时,可以考虑建立一个组件并返回IUnknown指针,而不必使用new操作符。

IUnknown * CreateInstance();

IUnknown * CreateInstance()

{

       //new一个实例,并返回IUnknown指针

}

QueryInterface带两个参数:

HRESULT__stdcall QueryInterface(const IID& iid, void ** ppv);

返回一个HRESULT值。该值并非某个结果的句柄,而是一个特定结构的32位值。

可能的值有S_OK和E_NOINTERFACE。判断返回结果时不能直接比较,而应该使用宏SUCCEEDED或FAILED。

使用QueryInterface查询两个接口的IUnknown,然后对结果进行比较,可以用来判断接口指针是否指向同一对象。

COM组件通过QueryInterface来查询是否支持某接口。

而C++类通过头文件则一开始就知道了该类支持的所有成员。

对于为什么不能向COM组件查询它所支持的所有接口?此间有一个回答是

你想对所支持的接口列表做什么捏?

但COM也提供了一个名为类型库的手段,用来在运行时确定组件提供的接口。

另外,分布式COM(DCOM)提供了一个新接口ImultiQI,有一个新的成员函数QueryMultipleInterfaces,用来一次调用查询组件的多个接口。减少网络数据的交换次数。

在具体使用上,调用前查询是否支持某接口,然后再使用对应的接口方法。接口库通常只会增加不会更改。

假设,建立了一个公司组件company,它支持打卡接口ICheck;

在名为manage的公司办公程序中,使用了company组件的ICheck来考勤。

一年后,组件更新位company2,新增打卡接口ICheck2。

旧版本manage程序仍然是首先查询组件是否支持ICheck,然后调用ICheck。

新版本manage2则会首先查询是否支持ICheck2,若不支持再查询是否支持ICheck。

而旧版本manage即使运行在company2组件环境中,因为ICheck仍然完整保留下来,因此也运行照旧。