COM简介

 1.COM的特性   
    
   COM起初是作为OLE(OLE    2)/ActiveX的底层技术推出的,COM是一种组件系统,COM组件是一种软件模块,COM有许多重要的特性,按照Microsoft的文档,COM的特性有:   
    
   ⑴语言无关性(Language    Independence)   
   ⑵位置透明性(Location    Transparency)   
   ⑶厂商无关性(Vendor    Independence,或者接口独立性/接口固定性)   
   ⑷减少版本问题(Reduced    Version    Problem)   
    
   实际上COM的基本特性有:   
    
   ⑴语言无关性:COM组件是语言(源程序)无关的,COM组件的调用协议是二进制代码级的协议(语言无关的协议)。   
   ⑵位置透明性:调用者对COM组件的调用,与COM组件的位置无关,无论COM组件位于什么位置,调用着调用COM组件的方法都相同。   
   ⑶面向对象的特性:COM是一种面向对象的组件系统,COM组件相当于类,COM组件实例化成COM组件对象,COM组件对象相当于对象,调用者调用COM组件对象。   
    
   COM的基本特性,也就是设计COM时所要达到的目标。   
    
   COM是一种面向对象的组件系统,这里用组件类(Component    Class)或者组件(Component)对应面向对象系统中的类,用组件对象(Component    Object)对应面向对象系统中的对象。   
    
   COM中,完整的COM组件由组件本身和组件对应的类厂组件构成,实现完整COM组件的DLL或者EXE称为组件服务器(Component    Server)。因为调用者/组件结构也是一种客户/服务器(C/S)结构,所以有时也不严格区分组件和组件服务器。   
    
2.接口   
    
   从调用者与组件通信的角度看,接口是一种调用协议。调用者和组件正是遵循同样的接口才能完成通信,这也是COM能够实现复杂应用(例如OLE/ActiveX)的基础,因为在复杂应用中,调用者和组件之间应该有调用协议。   
    
   COM组件实现接口,COM组件对象引出指向接口的指针,COM接口的本质与第2章中讲述的面向对象系统中的接口相同,接口解决了语言(源程序)无关的接口的方法的调用(或者组件对象的调用)问题和位置透明性问题(通过代理)。   
    
   所有的接口都从IUnknown接口派生(标准接口),这意味着所有的接口都定义了IUnknown接口中定义的方法,指向任意接口的指针都可以转换成指向IUnknown接口的指针,所有的组件都实现IUnknown接口,所有的组件对象都可以引出指向IUnknown接口的指针,也可以说所有的组件对象都可以用指向IUnknown接口的指针引用,不同的组件对象有统一的方法引用。   
    
   接口使用接口GUID(IID)标识,通过组件对象引出的指向任意一个接口的指针,可以调用IUnknown接口的QueryInterface方法查询得到该组件对象的任意一个其他接口指针,这意味着只要有指向任意一个接口的指针引用组件对象,就可以调用任意接口的任意方法(组件实现的任意接口的任意方法)。   
    
3.引用计数(Reference    Count)   
    
   因为COM的位置透明性,调用者和组件对象可能不在同一位置,当调用者不再使用组件对象时,释放组件对象的内存(删除组件对象)的工作应该调用组件对象完成,也就是说由组件对象自身来完成(自管理)。   
    
   组件对象的引用计数是实现组件对象自管理的方法,创建组件对象时组件对象的引用计数为0;当使用一个组件对象引出的指向接口的指针,添加组件对象的一个引用时,应该调用IUnknown接口的AddRef方法将引用计数加1;当不再使用一个指向接口的指针,减少组件对象的一个引用时,应该调用IUnknown接口的Release方法将引用计数减1,引用计数减到0时,方法释放组件对象自身的内存(自删除)。   
    
   所有的接口都从IUnknown接口派生,这意味着通过组件对象引出的任意一个指向接口的指针,都可以调用IUnknown接口的AddRef方法和Release方法完成组件对象的引用计数。   
    
4.类厂(Class    Factory)   
    
   类厂就是组件的类对象,类厂的本质与第3章中讲述的面向对象系统中的类对象相同,类厂组件就是类对象类,类厂组件实现的IClassFactory接口就是类对象类实现的类对象接口,通过类厂引出的指向IClassFactory接口的指针调用IClassFactory接口的CreateInstance方法创建类厂对应的组件的组件对象,解决了语言(源程序)无关的创建组件对象问题。   
    
   COM是语言(源程序)无关的面向对象系统,不可能有源程序形式的组件类(组件类的定义),可以认为类厂就是组件类(CoClass)。   
    
   组件服务器必须创建类厂(类厂组件对象),然后将类厂引出的指向IClassFactory接口的指针动态注册到COM环境中(或者暴露给COM环境),这样调用者才能通过类厂引出的指向IClassFactory接口的指针调用IClassFactory接口的CreateInstance方法创建类厂对应的组件的组件对象。例如DLL形式的组件服务器通过引出DllGetClassObject函数将类厂引出的指向IClassFactory接口的指针暴露给COM环境。   
    
   组件类或者类厂使用组件类GUID(CLSID)标识,不同组件服务器中的不同组件类的组件类GUID都被静态注册到COM环境(注册表)中,这样调用者能使用组件类GUID,通过COM环境定位到要调用的组件所在的组件服务器,进而启动组件服务器(例如加载DLL),获取动态注册到COM环境中的类厂引出的指向IClassFactory接口的指针,进而创建类厂对应的组件的组件对象。   
    
   类厂和类厂对应的组件的组件对象都是由组件服务器创建的,所以可以说COM组件对象是自创建的。   
    
5.自动化(Automation)   
    
   自动化(以前称为OLE自动化)原泛指使用解释型语言(例如Word    Basic、VBA、VBScript等)调用应用程序,使得应用程序自动工作(例如使用VBA调用Word或者Excel,使得Word完成自动排版或者Excel完成自动计算)。解释性语言调用的应用程序称为自动化服务器(或者OLE自动化服务器),自动化服务器是一种COM组件服务器。后来自动化就泛指使用解释型语言调用COM组件(组件对象),能适合解释型语言调用的组件称为自动化组件。   
    
   指向接口的指针是指向VPTR的指针,而VPTR指向VTBL。使用编译型语言调用组件对象,通过组件对象引出的指向接口的指针调用接口的方法,接口的作用是在编译时,根据接口的定义,确定虚函数(接口的方法)在VTBL中对应的项,编译后生成在VTBL中定位虚函数对应的项,获取指向虚函数的指针的二进制代码,也就是说在编译时,根据接口的定义,编译后生成在VTBL中获取虚函数(接口的方法)对应的指向虚函数的指针(在VTBL中定位虚函数对应的项,获取指向虚函数的指针)的二进制代码是编译时绑定的(但是虚函数的调用是运行时绑定的),从逻辑上看,可以认为调用者到接口的绑定是编译时绑定的。   
    
   使用解释型语言调用组件对象,在VTBL中获取虚函数(接口的方法)对应的指向虚函数的指针的工作只能在运行时绑定。解释型语言无法直接根据接口的定义,确定虚函数(接口的方法)在VTBL中对应的项,需要更直接的方法通过组件对象引出的指向接口的指针调用接口的方法。   
    
   IDispatch接口的方法可以接受字符串形式的方法名作为参数,如果组件实现IDispatch接口,那么通过组件对象引出的指向IDispatch接口的指针调用IDispatch接口的方法,传递字符串形式的方法名,就可以调用组件对象的其它方法了,也就是说组件实现IDispatch接口可以实现在运行时通过字符串形式的方法名调用组件对象的方法,从逻辑上看,可以认为调用者到组件对象的方法的绑定是运行时绑定的。实现IDispatch接口的组件就称为自动化组件,通过组件对象引出的指向IDispatch接口的指针调用IDispatch接口的方法,传递字符串形式的方法名调用的组件对象的其它方法,称为自动化方法,这些方法的集合也认为是一个接口(逻辑接口),称为调度接口(Dispatch    Interface/Dispinterface),从逻辑上看,可以认为调用者到调度接口的绑定是运行时绑定的。   
    
   如果一个接口从IDispatch接口派生,组件实现这个接口,组件对象引出的指向这个接口的指针可以转换成指向IDispatch接口的指针,那么通过组件对象引出的指向这个接口的指针,可以调用这个接口的方法,也可以调用调度接口的方法,这个接口就称为双重接口(Dual    Interface),相对于双重接口和调度接口,普通接口称为定制接口(Custom    Interface)。   
    
   自动化提供了更加统一的调用组件对象的方法。   
    
6.COM组件   
    
   综上所述,从COM组件本身的角度看,完整的COM组件相当于完全二进制代码级的组件(类),包括组件本身和组件对应的类厂组件,相当于类和类对象类,类厂相当于类对象。   
    
   从程序设计的角度看,完整的COM组件也可以看成是支持组件对象自创建、支持组件对象自管理和实现标准接口的组件(类)。   
    
   设计COM时所要达到的目标就是实现COM的基本特性,也就是COM为什么要使用接口、引用计数和类厂的原因:   
    
   ⑴接口实现了调用COM组件对象的语言无关性和位置透明性。   
   ⑵引用计数实现了删除COM组件对象的位置透明性[删除COM组件对象已经是语言(源程序)无关的]。   
   ⑶类厂实现了COM的面向对象的特性(类厂就是组件类),类厂和IClassFactory接口实现了创建COM组件对象的语言无关性和位置透明性。

 

转载地址:http://hi.baidu.com/spidermanzy/blog/item/16dd7838b6a0512297ddd8b3.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值