当定义自己的组件时候,必须符合COM规范,即直接或间接继承IUnknown接口,并按自己的类实现IUnknown中定义的三个函数。
interface IUnknown
{
virtual HRESULT _stdcall QueryInterface(const IID& iid,void** ppv)=0;
virtual ULONG _stdcall AddRef()=0;
virtual ULONG _stdcall Release()=0;
};
其中第一个QueryInterface用来查看(询问)当前的类是否实现(支持)某个接口.其中第一个参数iid用来标识要查看的接口的一个标志结构体.第二个参数ppv用来返回查找到的接口指针,没有找到为NULL,函数返回是HRESULT,可以用宏SUCCEEDED(hr)来判断返回值hr成功与否.
QueryInterface函数的一些实现原则:
<1>QrueryInterface返回的总是同一IUnknown指针(即使直接间接继承自多个IUnknown).
<2>若客户曾经获取过某个接口,那么它将总能获取此接口.
<3>客户可以再次获取已经拥有的接口.
<4>客户可以返回到起始接口.
<5>若能够从某个接口获取某特定接口,那么从任意接口都将可以获取此接口.
---------------------------------------------------------------------------------------------
函数AddRef增加一个使用的实例(因为都是用接口使用的,所以等于增加正在使用接口(同一个对象)的数量);函数Release完成AddRef相反的过程.
这两个函数都是使用引用记数来完成的(和设计模式中取代指针的句柄的实现是类似的),
所以对于实现接口的一块内存,要负责维护它自己的引用记数.
参考资料:《COM技术内幕》