《COM原理及应用》学习笔记之第十一章

11 自动化( Automation )对象

1 、自动化技术

       自动化技术既以前提到的 OLE 自动化。虽然自动化技术建立在 COM 基础上,但自动化要比 COM 应用广泛得多。一方面,自动化继承了 COM 的很多优点,比如语言无关、进程透明等特性;另一方面,自动化简化了 COM 的一些底层细节,比如属性和方法的处理、一组专用于自动化的数据类型等。自动化也是 OLE 的基础,所以可以把自动化看作 COM OLE 中间的一项技术。自动化的核心是 IDispatch 接口,每一个自动化对象都必须实现 IDispatch 接口。自动化技术并不复杂,它实际上是 COM 的一个特例。

 

2 、自动化产生与发展

       COM 的语言无关性在使用一些弱类型的高级语言时很受限制,而自动化为这些高级语言提供了另一条程序相互通信的直观且友好的途径。

       自动化技术的发展与 Visual Basic VBA 有直接的关系。首先, VBA (或 VBScript )已经发展成为大多数 Microsoft 应用程序扩展的标准,其次, Microsoft Visual Basic 开发工具的成功应用也推动了自动化对象的发展。自动化技术为 Visual Basic 与其他语言的协作开发提供了一条捷径。

       通过自动化编程接口,不同应用程序之间的通信可以在 VBA 或者 VBScript 层次上进行,甚至根本不需要知道列集和 RPC 调用的概念。自动化是位于上层(应用层)的组件技术,它可以面对最终用户,比如宏语言编程。

       自动化对象的 IDispatch 接口可以作为 OLE 的标准接口,由于 OLE 已经提供了标准的接口代理和存根组件,所以自动化对象即可以运行在 DLL 组件中,也可以运行在 EXE 组件中。如果在分布式环境下,那么自动化对象可以被远程客户创建或连接。

 

3 、属性和方法

       方法( method )和属性( property )是自动化对象的两个基本特性,方法是指自动化对象所提供的功能服务;而属性是指自动化对象的数据特征。

       从本质上讲,属性是一个值,它既可以被设置,也可以被获取。

       方法要比属性灵活得多,它们可以具有零个或多个参数,它们既可以设置也可以获取对象数据,最常见的是完成某些动作。

       自动化对象的属性和方法都有符号化的名字,客户程序通过名字就可以访问到自动化对象的属性或者方法。

 

4 、类型库和 ODL

       组件对象的类型信息是指它与外界进行交互的一些必要信息,包括组件的 CLSID 、它所支持接口的 IID 、接口的每个成员函数、成员函数的参数和返回值类型等等,类型信息中的数据类型也可以是自定义的数据类型,如 C 语言风格的结构、联合、枚举等。

       Microsoft 扩充了 IDL 形成 ODL object description language ,对象描述语言),可以描述组件对象的类型信息。一般来说,一个组件对象的类型信息包括每个接口的类型信息和对象的类型信息,接口类型信息的描述方法与 IDL 完全兼容。接口类型信息使用 interface dispinterface 关键字描述;对象类型信息使用 coclass 关键字进行描述。每个 ODL 文件可以描述多个组件对象,经过 MIDL 或者 MkTypLib 工具可编译得到类型库。通常把一个组件程序中的所有对象放在一个 ODL 文件中,并用 library 关键字描述库信息,包括类型库的 ID (即 LIBID )、类型库所使用的语言、版本等。在 ODL 文件中也可以使用 importlib 引入其他类型信息。

       MIDL 实用工具编译 ODL 文件可以得到类型库文件,其后缀为 TLB ,也可以产生相应的 .h 头文件。

       使用类型库的好处有两点。一是 VB 或者 VBA 可以使用类型库来浏览组件对象的方法和属性,它也可以利用类型库增强对属性和方法的访问;二是在实现自动化对象的 IDispatch 接口时,可以利用类型库向客户程序提供类型信息,这可使我们避免繁琐的类型处理。

 

5 IDispatch 接口

       成员函数 Invoke 是个关键函数,客户程序必须通过 Invoke 函数才能访问属性或方法,也可以说 Invoke 函数是自动化对象的命令翻译器。

 

6 、自动化兼容的数据类型

       自动化对象使用的基本数据类型为 VCRIANT 结构类型。整个 VARIANT 结构的大小为 16 字节,但它描述了所有自动化对象可以使用的数据类型。

 

7 IDispatchEx 接口

       IDispatch 接口描述的类型信息是静态的,在运行过程中类型信息不会被改变,在编译时刻通过类型库就可以获得所有的类型信息。然而,在一些脚本语言中,我们需要在运行时刻动态提供类型信息, IDispatchEx 接口这是适应这样的要求而建立起来的,它继承了 IDispatch 接口的成员函数。

 

8 、自动化对象实现——类型库支持

      

9 、自动化对象实现—— Invoke 函数实现

      

10 、自动化对象实现——异常处理

      

11 、自动化对象实现——多语种,本地化

      

12 、自动化对象实现——用 CreateStdDispatch 函数实现自动化对象

      

13 、自动化对象应用——双接口

       自动化控制器通过 IDispatch 接口可以调用自动化对象的所有方法和属性,但由于这种调用是通过 Invoke 成员函数间接进行的,中间经过几重处理,调用的效率损失很大。当然这种方式为高级语言客户程序提供了极大的便利,不过有的客户程序不一定希望这种效率损失,它希望能够直接通过 vtable 调用到成员函数代码。为了同时满足这两种情形,自动化对象可以在实现 IDispatch 接口的基础上,把方法和属性函数也以接口成员函数的方法暴露出去,这样就形成了双接口( dual interface )的概念

 

14 、自动化对象应用——迟绑定和早绑定

       由于自动化对象使用类型库对参数类型进行检查,而类型库文件独立于自动化组件,因此,不仅自动化对象可以利用类型库实现它的 IDispatch 成员函数,自动化控制器也可以利用类型库对方法或属性的参数进行检查。

如果自动化控制器利用对象的类型库,在编译时刻对参数类型和返回值类型进行检查,并直接用分发 ID 调用 Invoke 函数,我们把这种调用方法称为早绑定( early binding )技术。

相对应地,控制器也可以在运行时刻通过 IDispatch 接口的成员函数获得类型信息,当它访问一个属性或方法时,它要调用 IDispatch::GetIDsOfNames ,以便根据符号化名字找到分发 ID ,我们把这种调用称为迟绑定( late binding )技术。

选择使用早绑定或者迟绑定取决于控制器的运行环境,而调用效率并不成为判断的依据。

 

15 、自动化对象应用——自动化集合对象

       集合对象也是一个自动化对象,但它有一些特殊的要求。首先,作为一组同类对象(或数值)的容器对象,它必须提供枚举这些成员的方法;其次,它必须支持 Add Remove Item 方法以及 Count 属性。

 

16 、自动化对象应用——一 IDispatch 作为出接口

      

17 、自动化对象应用——自动化控制器

      

18 、自动化对象编程—— MFC 对自动化对象的支持

 

19 、自动化对象编程—— COleDispatchDriver

 

20 、自动化对象编程——在 Visual Basic 中使用自动化对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值