首页 / 软件开发 / Delphi / 第八章-对象链接与嵌入(二)(2)
第八章-对象链接与嵌入(二)(2)2007-05-07 8.4 OLE自动化 OLE自动化是Windows应用程序操纵另一个程序的一种机制。OLE 2.0提供了一种方法来集成应用程序,这就是应用程序之间的命令操作。利用OLE 2.0,程序员可以定义一组命令,使它们进入到其它程序中。这些命令可带参数。看起来很象应用程序在调用函数或过程一样。采用上述办法, 可以在人不参与的情况下,就能使得两个应用程序的相互作用。被自动化的程序称作自动化对象或自动化服务器, 操作或自动化其他程序的应用程序称为自动化控制器或自动化客户器。Delphi2.0完全支持OLE2.0的应用程序自动化,可以用Delphi 2.0编写自动化控制器和服务器。在应用程序之间可编程的潜能是巨大的。用户可以创建宏或者其它命令, 使得某个应用程序能透过其它应用程序进行工作。已经存在的应用程序的宏语言很容易被扩展,它可以包括一组别的应用程序能够执行的命令和函数调用。 现在介绍两个应用程序,其中MemoEdit.dpr 是多文档界面的文本编辑器,作为OLE自动化服务器,AutoFrom.dpr是自动化控制器。运行AutoForm前,在Delphi集成开发环境中单击菜单(run | parameters),Delphi弹出运行参数对话框,如图8.5,输入参数后运行状态如图8.6。AutoForm窗体的多个按钮。可对MemoEdit进行操作;如按Creat按钮,MemoEdit产生三个子窗体,如图8.7,按"AddText",子窗体将出现"This text was added through OLE Automation"的字符串“MemoEdit包括三个单元:Mainfrom MDI主窗体EditFrom MDE子窗体和自动化类MemoAuto 应用程序自动化对象下面结合例程讲述OLE自动化的基本概念及开发。 8.4.1 TAutoObject对象 TAutoObject 是Delphi自动化服务器中所有对象的基类,任何自动化对象都是从TAutoObject类派生出来的。OLE对象的定义与其它类的定义类似。它的automated部分象普通类的public部分,OLE控制器可引用在这部分声明的属性和方法。编译器把automated部分创建成OLE自动化对象的入口。但automated部分的代码有很多限制:● 属性方法可以定义,但不能定义域;● 所有属性、参数、函数类型必须是以下类型之一: SmallInt,Integer,Single,Double,Currency,TDateTime,String,WordBool, Varint ● 属性声明只能包括访问定义符(read and Write),其它定义符如index,stored, default,odefault均不能使用;● 访问定义符必须列出相应的方法标识符,不能使用域标识符;● 支持数组类型;● 不允许属性重载;● 方法是可以是虚拟的,但不能是动态的,允许方法重载。在EditFrom单元中定义了TMemoDoc类: typeTMemoDoc = Class(TAutoObject)privateFEditForm : TEditForm;funtion CretFileName : String;funtion CretModiFied : WordBool;procedure SetFileName(Const Value : String);automatedprocedure Clear;procedure Ineart(Const Text : String);procedure Save;procedure Close;procedure FileName : String read GretFileName writeSetFileName;procedure Modified : WordBool read GretModifiedend; TMemeDoc类是MemoEdit程序的内部自动化类,因此不需要注册。外部OLE自动化控制器对它不能直接引用。如果要使外部控制器对自动化对象进行操作,则要在声明自动化对象的单元中调用Automation. RegisterClass 进行注册。例程MemoAuto 单元定义了TMemoApp对象并进行注册。 unit MemoAuto …typeTMemoApp = Class(TAutoObject)implementation…procedure RegisterMemoAppConstAutoClassInfo : TAutoClassInfo = (AutoClass : TMemoApp;ProgID : MemoEdit,ApplicationClassIn : "{FIFF4880 - 200D - 11CF - BDCF - D020AFOE5B81}";Description : "Memo Editor Application";Instancing : acSingle Instance );beginAutomation,RegisterClass(AutoClassInfo)end;inibializationRegisterMemoApp;end; 自动化对象要在initialization部分中对自动化对象进行注册。 注册的信息用以唯一辨识服务器对象。把一个自动化对象加入到服务器中要用到这些信息。程序一旦注册了自动化对象,全局自动化对象将用OLE自动化API进行自动管理。注册后的OLE自动化对象是引用记数的,因为对象可能被多个控制器控制。当使用完一个OLE对象,调用Release方法,Release可减少引用数目,当引用数目为零时,调用Free方法释放对象。通常把OLE对象作为变体类型(variants)进行输出,任何OLE 对象的方法和属性必须返回一个包含OLE对象的变体类型,TAutoObject提供了一个变体类型的OLEObject属性。控制器不能直接得到服务器中的类或指针,而是引用OLE对象的OLEObject属性。例程MemoAuto单元的NewMemo函数就是通过引用OLEObject 属性而提供引用TMemoDoc对象的接口。 function TMemoApp,NewMemo : Variant;beginResult := MainForm,CreateMemo(" "),OleObject;end;