注册后的OLE自动化对象是引用记数的因为对象可能被多个控制器控制当使用完一个OLE对象调用Release方法Release可减少引用数目当引用数目为零时调用Free方法释放对象
通常把OLE对象作为变体类型(variants)进行输出任何OLE 对象的方法和属性必须返回一个包含OLE对象的变体类型TAutoObject提供了一个变体类型的OLEObject属性控制器不能直接得到服务器中的类或指针而是引用OLE对象的OLEObject属性
例程MemoAuto单元的NewMemo函数就是通过引用OLEObject 属性而提供引用TMemoDoc对象的接口
function TMemoAppNewMemo : Variant;
begin
Result := MainFormCreateMemo( )OleObject;
end;
创建OLE自动化服务器
OLE自动化服务器是应用程序或动态链接库(DLL)它可向OLE 自动化控制器输出OLE对象 MemoEditdpr 就是OLE 自动化服务器 在MemoAuto 单元中注册了MemoEditAppdication自动化类所有OLE控制器均可对MemoEditApplication进行引用
在Windows环境下有两种OLE自动化服务器进程内服务器和进程外服务器 Delphi可创建这两种服务器
进程内服务器是输出OLE自动化对象的动态链接库因为OLE自动化对象来自于DLL
对象是控制器程序的同一窗体进程进程内服务器适合于创建共享的程序模块 而这个模块可以被用不同语言编写的多个程序所共享 进程内服务器被调用时在同一地址中运行这样就不需要控制器进行调度以避免处理大量的消息句柄 进程外服务器是能输出OLE自动化对象的应用程序
有些OLE自动化服务器只能创建和输出一个OLE对象有些服务器则可以处理多个OLE对象另外一些服务器不能输出OLE对象只能在程序内部使用OLE对象 服务器与其能输出的对象数目的关系称为实例(instancing)
在创建OLE 自动化对象时必须定义实例 这样 在创建一个OLE 自动化对象时Windows就能决定是否创建一个新的服务器实例表列出三种实例类型
表 实例的取值及含义
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
instancing类型 含义
─────────────────────────────── ───────
internalOLE对象是应用程序的内部对象对象不需要注册外部进程不能创建此对象
对象实例WIndows为第一个OLE对象创建一个服务器实例Multiple一个服务器能创建和输出多个OLE 对象实例 进程内服务器大多是Multiple类型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
每个使用OLEAuto单元的工程文件自动地拥有一个叫Automation的对象它是非可视对象就象Application部件拥有Delphi应用程序的一些信息一样Automation对象也拥有服务器的一些信息其中最重要的是StartMode属性和OnLastRelease事件
StartMode指示OLE自动化服务器打开方式打开的目的表列出StartMode四种取值
表 StartMode 的取值及含义
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
取值 含义
───────────────────────────────
SmStandAlone 用户启动应用程序
SmAutomation Windows为创建OLE对象而启动程序
SmRegSever 应用程序仅为注册一个或多个OLE对象而启动
SmUnregSever 应用程序仅为注销一个或多个OLE对象而启动
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
当StartMode模式是SmAutomation而用户不再需要服务器时发生OnLastRelease 事件此时所有OLE控制器释放了由服务器创建的对象缺省情况下服务器关闭实例但OnLastRelease 事件可根据实际情况是否关闭OnLastRelease 事件可得到一个叫ShutDown的布尔型变量把ShutDown设置成True则在最后一个OLE对象释放时服务器不关闭
无论创建何种自动化服务器必须定义对控制器的界面包括定义和注册OLE对象OLE自动化对象的属性和方法定义界面主要是为了控制器能够引用它们
对已存在的自动化服务器界进行修改时要确保向上兼容 不要删去已有的属性方法这样会导致已存在的自动化控制器发生错误修改服务器只能增加属性和方法
创建OLE自动化服务器第一步是创建服务器自身即创建能输出OLE 对象的应用程序或动态链接库这主要取决于是创建进程内服务器还是进程外服务器
创建进程内服务器即动态链接库
创建动态链接库
在工程文件的uses条款中加入OLEAuto单元
在DLL中输出四个标准入口即加入以下代码
exports
DLLGetClassObjectDLLCanUnloadNow;
DLLRegisterServerDLLUnregisterServer;
以上代码必须准确拼写包括大小写与Object Pascal的其它项目不同这些代码
对大小写敏感
创建进程外服务器
创建一个Delphi应用程序
在工程文件的begin之后加入以下代码
if AutomationServer Registration then Exit;
创建服务器之后应该向服务器加入OLE自动化对象这个过程大部分是自动完成的但必须向Delphi的自动化对象专家提供必要的信息
把OLE自动化对象加入服务器
在Delphi集成开发环境中选择File| New 菜单项 并在对象集中选择Automation
ObjectDelphi打开自动化对象专家
给自动化对象命名
这是服务器内部标识OLE对象的名字必须是个有效的面象对象Pascal标识符习惯上以T字母开头
给OLE类命名
该名用以外部控制器创建对象当服务器在Windows中注册OLE对象 就以这个名字在系统注册控制器使用这个名字调用CreateOLEObject来创建对象
描述要输出的对象
定义对象的实例(instancing)进程内服务器常定义为Multiple进程外服务器常定义为Single;
选择OK键完成该过程
自动化对象专家将产生以下代码
● 从TAutoObject派生下来的自动化对象定义但没有定义任何属性方法
● 调用DelphiOLE自动化管理器的注册代码管理器负责Windows中注册服务器和对象
在注册代码中包括一个自动产生的ID号这个ID号是全局唯一的通常不要修改每个ID号与一个OLE类名相对应如果其中之一被改变应用程序在使用时会发生错误
在创建了服务器并把OLE自动化对象加入服务器之后控制器程序就可以对服务器进行操纵
[] [] [] []