COM组件对象模型提供了组件之间交互的规范,不依赖于任何特定的语言,它提供了一种规范、标准。

OLE(对象链接和嵌入)以COM规范为基础,继OLE后Microsoft推出的以COM规范为基础的技术统称ActiveX技术。

组件软件的关键是接口,因此,软件组件应遵从统一标准。COM就是一套公用标准,COM标准包括规范和实现两部分,规范定义了组件间的通信规则,实现则是COM库。

接口是一组逻辑上相关的函数(接口成员函数)的集合。

在COM模型中,对象本身对于客户来说是不可见的,只能通过接口请求服务。

每个接口由一个128位的GUID来标识:客户--->GUID--->接口指针--->接口成员函数。

每个对象也由一个GUID来标识,称为CLSID:客户--->CLSID--->对象的某个接口指针。可以从某个接口指针得到该对象的任意其它接口。

COM组件本身是位置透明的,即只需要调用接口,组件的加载,对象的创建由COM库完成。

COM中包容模式是对象1传递调用给对象2;聚合模型是虽然也不知道对象2的存在,但是直接返回对象2的接口给用户使用。

COM对象为什么要使用引用计数?因为客户个数及什么时候请求服务是不确定的,直接delete释放对象是不安全的。

IDL(接口描述语言)提供了一种不依赖于任何语言的接口描述方法。在VC++中使用IDL其实是MIDL工具将.idl文件编译成C/C++兼容的接口描述头文件。

接口只是一种定义,并不包括实现,具体的实现是在COM对象中,因此,接口继承只继承了成员函数的说明。

接口继承只允许单继承,为什么?因为接口的内存模型中只有一个虚指针,多重继承会出现多个!

接口原则中有一点:对于同一个对象的不同接口指针查询到的IUnkown接口必须相同。这是因为一个COM对象实现了多个接口时,其虚指针会有多个,且虚表中的IUnkown(保存其成员函数地址的位置)会有多份!