1.所有的com接口都需要继承iunknown。
typedef CComPtr< IUnknown > IUnknownPtr;
typedef CComPtr< CUnknown > CUnknownPtr;
IUnknown 是com 的接口
C++实现COM技术规范是通过一个名为IUnKnown的抽象类,即包含纯虚函数的类,这样的类即称为接口。
该类只有三个函数:QueryInterface、AddRef、Release,且都是纯虚函数,一个可执行文件的类只要继承了IUnKnown接口,
则此执行文件就是一个组件,能被包容或聚合到其他应用中。具体可参看COM书籍:《COM技术内幕》
IUnknown是所有接口的基础,他负责两项工作:
IUnknown::QueryInterface负责得到该组件的其他接口的指针
IUnknown::AddRef/Release负责管理该组件的生存期,但有人使用该组件时,保证该组件不会被意外删除;再没人使用该组件时,保证该组件被自动删除
一句话:COM是接口(组件)的集合,接口是方法和属性的集合。
要了解COM,就得先了解IUnknown接口,IUnknown接口的C++形式的定义如下:
interface IUnknown
{
virtual HRESULT _stdcall QueryInterface([in]REFIID iid,[out]void * * ppv)=0;
virtual ULONG _stdcall AddRef(void)=0;
virtual ULONG _stdcall Release(void)=0;
}
因为所有的com接口都继承iunknown,每个接口的vtbl前3个函数都是QueryInterface、AddRef、Release。
组件组合到应用中有什么办法?
有2个办法:包容和聚合。
先了解两个概念:外部组件,即包容或聚合其他组件的组件;内部组件,即被其他组件包容或聚合的组件。
比如,A组件要引用C组件的功能,则A就需要包容或聚合C组件,那么A组件就称为外部组件,C组件称为内部组件。
在C++里,实现包容和聚合的难度是不一样的,总的来讲,聚合实现比包容要更复杂。
包容的解决方案是,外部组件的接口封装调用内部组件的接口暴露给客户使用,暴露的只是外部组件接口;
而聚合的方案是,内部组件的接口是直接暴露给客户使用的,但对于客户来说,所有的接口都是来自外部组件。
所以,聚合的实现就必须做到通过外部组件和内部组件的任意接口可以查询到其他任意接口。
COM 组件就是一组接口的集合,实现了 IDispath 接口的 COM 组件叫做 自动化组件。
在自动化组件的基础上,在实现规定的接口就称为 ActiveX 组件,Ocx 是 Activex 的文件载体