com初谈
先请看看下面几个问题:
l 什么是com ?
l 什么是com对象?
l 什么是接口?
先说第一个,com全称是组件对象模型(compoment object model),他是一组规范,是MicroSoft创建的一组二进制和网络标准,用于解决两个组件之间的通信,可以说MicroSoft目前差不多所有的战略都是建于其上,从1993年com 首次被推出,他就注定了MicroSoft的发展的命运……
什么是com对象
com是面向对象的软件模型,com对象的概念有点类似于C++中对象的概念。在com规范中,没有com对象的严格定义,com组件提供给客户的是以对象形式封装起来的实体,客户与组件交互的实体是com对象。
com对象有自己的属性和方法,但这些都被com封装了起来,客户只有通过接口才能对com的方法进行调用,接口是com与外界通信,交互的唯一途径。
什么是接口
上面已经说过了,接口就是com 与外界通信的唯一途径。他的定义是com规范的核心。接口是一组逻辑上相关的函数的集合,他自己可以看作是指向改组函数集合的指针。
下图表示了接口和com对象的关系:
由上图可见一个com组件主要由两部分组成,一部分是接口的定义,另一部分是com对象的实现,在com规范中接口的定义和com对象的实现是相对独立的。
接口的定义 ——接口的定义遵循MIDL,他是MicroSoft针对OSF的DCE(Distributes Computing Enviroment)规范中IDL语言扩展。从上图可以看出,接口就是包含了一组函数的数据结构,他只负责定义函数。在对象创建后,他就是包含了接口指针和一个虚函数表,接口指针指向虚函数表(该函数表就成了一组函数指针的集合),每个函数指针指向“com对象实现”里相应的函数的实现。接口规范并不建立在任何编程语言基础上,任何具有足够数据表达能力的语言,都可以对接口进行描述。
com对象的实现 —— 包含com对象的所有接口的所有函数的实现代码。
COM整体模型
根据com规范所建立的应用是基于Client / Server 模型的,一个完整的com应用包括以下几个部分:com服务器,服务器方com库,客户方com库,客户程序。
先对各个部分作个简要说明:
com服务器 —— 就是一个容器,此容器用来装所有的com对象
服务器方com库 —— 可以看作是容器的管理者,负责从容器中找出相应的com对象,创建
对象的实例。
客户方com库 —— 连接员,负责把客户请求传送到服务方,负责客户com的控制管理
客户程序 —— com服务的享受者。
一次完整的方法调用包括以下几个步骤:
1. 客户程序通知com库,向com库指出他要调用的com对象的GUID或IID;
2. 客户端com库接受客户要求,向服务器端发送该要求,在客户进程内建立该com对象的代
理DLL(以后客户就同该代理DLL交互)。
3. 服务器com库接受请求,从com库中找出com对象,建立该com对象的实例(组件进
程),在实例建立时,还会在实例的进程里,创建一个存根dll。组件程序通过该存根
dll与客户端的存根dll进行交互。
4. 客户程序调用代理dll接口方法;
5. 代理dll把请求接口、方法、参数、数据,打包列集(marshalling);发送给存根dll;
6. 存根dll接收来自代理dll的数据包,散集(Unmarshalling);发送给组件程序;
7. 组件程序处理数据,返回给存根dll;
8. 存根dll列集(marshalling),发送给代理DLL;
9. 代理DLL返回结果给客户程序。
[ 注:对于存根和代理,请关注后续文章 ]
com对象的创建
com库是如何创建com对象的呢?
通过类厂,类厂是com对象的生产基地,每个com对象都有一个相应的类厂。类厂本身也是一个com对象,他支持一个接口IClassFactory,该接口的函数CreateInstance(…)用于构造com对象的实例。
客户创建一个com的过程:
1. 客户向com库,给出com对象的GUID;
2. com库调用CoGetClassObject(...)函数获取com对象的类厂,创建com对象.
CoCreateInstance(...)函数,也是通过在其内部调用CoGetClassObject(…)函数来获取类厂,创建对象的。
暂时就到这吧,各位老兄,老姐,如发现有误,或不同观点,还望指出,共同讨论,共同提高啥!