起源与历史
*起源于应用程序之间的交互,OLE1先于COM出现,建立在DDE的基础上。(DDE(Dynamic data exchange)的工作原理是:甲方申请一块全局内存,然后把内存指针postmessage到乙方, 乙方根据收到的指针访问那块全局内存。) 随后出现COM,由于COM定义了组件之间交互的规范,使得模块定制扩充、升级等更为方便,因此,OLE2就弃DDE转而以COM为基础和标准。
COM结构
*所有COM对象必须实现IUnknown接口,每个COM接口都有一128位的GUID(在注册表可查,书后有详细说明),客户通过GUID获得接口指针,然后调用相应实现的服务。COM对象也有一128位的CLSID,客户通过CLSID创建对象,创建后获得某一接口(该对象实现)的接口指针,因此客户与COM对象也是通过接口通信,对象对于客户来说只是一组接口。
*包容和聚合:包容,外部组件将对接口的各个函数调用转发给内部接口(函数级);聚合,外部组件将内部组件的某些接口指针传递给用户直接使用(接口级)。
*COM库,负责COM对象的创建,通过注册表查找本地服务程序,提供标准的内存分配方法。有了COM库就可以直接利用其提供的API进行编程,现在的COM库版本还包括远程组件调用的支持。
COM的进程模型
*进程内(DLL),优势效率高,但组件不稳定会影响客户程序;
*进程外(EXE),调用效率偏低(需要代理和存根),但出错不会影响客户程序运行。
COM的历史应用
*16位windows 3.x对OLE支持,虽已按照动态链接库组织,但模块间通信未采用COM标准。32位的windows 95、98、NT等开始建立在COM的基础上,并进行大范围应用:DirectX、DAO、RDO、MAPI,COM已成为windows平台的组件模型 标准。
*OLEDB完全基于COM,而ADO则是在OLEDB上建立的自动化对象库(补充:自动化对象——实现了IDispatch接口的COM对象。使用自动化技术的一个主要目的就是对COM的一些底层操作进行简化。包括自动化组件和自动化 客户两方面的内容,分别用来定义和使用自动化对象。自动化对象包括属性和方法,其中,属性类惟于类的数据成员,方法类似于类成员函数,值得注意的是属性只 能被读取而不允许被写入。自动化组件除了定义自动化对象外,还将内部可编程对象展现给自动化客户,而自动化客户则对这些暴露的自动化对象进行操作。具体的 操作包括:创建一个新的自动化对象,获取、设置自动化对象的属性,以及调用自动化对象的方法等。)