接口查询
头文件: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仍然完整保留下来,因此也运行照旧。