知识大全 对象链接与嵌入(二)[3]
Posted 知
篇首语:阳光照亮世界,知识照亮人生。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 对象链接与嵌入(二)[3]相关的知识,希望对你有一定的参考价值。
DELPHI基础教程:对象链接与嵌入(二)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
注册后的OLE自动化对象是引用记数的 因为对象可能被多个控制器控制 当使用完一个OLE对象 调用Release方法 Release可减少引用数目 当引用数目为零时 调用Free方法释放对象
通常把OLE对象作为变体类型(variants)进行输出 任何OLE 对象的方法和属性必须返回一个包含OLE对象的变体类型 TAutoObject提供了一个变体类型的OLEObject属性 控制器不能直接得到服务器中的类或指针 而是引用OLE对象的OLEObject属性
例程MemoAuto单元的NewMemo函数就是通过引用OLEObject 属性而提供引用TMemoDoc对象的接口
function TMemoApp NewMemo : Variant;
begin
Result := MainForm CreateMemo( ) OleObject;
end;
创建OLE自动化服务器
OLE自动化服务器是应用程序或动态链接库(DLL) 它可向OLE 自动化控制器输出OLE对象 MemoEditdpr 就是OLE 自动化服务器 在MemoAuto 单元中注册了MemoEdit Appdication自动化类 所有OLE控制器均可对MemoEdit Application进行引用
在Windows环境下有两种OLE自动化服务器 进程内服务器和进程外服务器 Delphi可创建这两种服务器
进程内服务器是输出OLE自动化对象的动态链接库 因为OLE自动化对象来自于DLL
对象是控制器程序的同一窗体进程 进程内服务器适合于创建共享的程序模块 而这个模块可以被用不同语言编写的多个程序所共享 进程内服务器被调用时在同一地址中运行 这样就不需要控制器进行调度 以避免处理大量的消息句柄 进程外服务器是能输出OLE自动化对象的应用程序
有些OLE自动化服务器只能创建和输出一个OLE对象 有些服务器则可以处理多个OLE对象 另外一些服务器不能输出OLE对象 只能在程序内部使用OLE对象 服务器与其能输出的对象数目的关系称为实例(instancing)
在创建OLE 自动化对象时必须定义实例 这样 在创建一个OLE 自动化对象时 Windows就能决定是否创建一个新的服务器实例 表 列出三种实例类型
表 实例的取值及含义
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
instancing类型 含义
─────────────────────────────── ───────
internal OLE对象是应用程序的内部对象 对象不需要注册 外部进程不能创建此对象
对象实例 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
DLLGetClassObject DLLCanUnloadNow;
DLLRegisterServer DLLUnregisterServer;
以上代码必须准确拼写 包括大小写 与Object Pascal的其它项目不同 这些代码
对大小写敏感
创建进程外服务器
创建一个Delphi应用程序
在工程文件的begin之后加入以下代码
if Automation Server Registration then Exit;
创建服务器之后 应该向服务器加入OLE自动化对象 这个过程大部分是自动完成的 但必须向Delphi的自动化对象专家提供必要的信息
把OLE自动化对象加入服务器
在Delphi集成开发环境中选择File| New 菜单项 并在对象集中选择Automation
Object Delphi打开自动化对象专家
给自动化对象命名
这是服务器内部标识OLE对象的名字 必须是个有效的面象对象Pascal标识符 习惯上以T字母开头
给OLE类命名
该名用以外部控制器创建对象 当服务器在Windows中注册OLE对象 就以这个名字在系统注册 控制器使用这个名字调用CreateOLEObject来创建对象
描述要输出的对象
定义对象的实例(instancing) 进程内服务器常定义为Multiple 进程外服务器常定义为Single;
选择OK键完成该过程
自动化对象专家将产生以下代码
● 从TAutoObject派生下来的自动化对象定义 但没有定义任何属性方法
● 调用DelphiOLE自动化管理器的注册代码 管理器负责Windows中注册服务器和对象
在注册代码中包括一个自动产生的ID号 这个ID号是全局唯一的 通常不要修改 每个ID号与一个OLE类名相对应 如果其中之一被改变 应用程序在使用时会发生错误
在创建了服务器并把OLE自动化对象加入服务器之后 控制器程序就可以对服务器进行操纵
cha138/Article/program/Delphi/201311/25217相关参考
DELPHI基础教程:对象链接与嵌入(二)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DELPHI基础教程:对象链接与嵌入(二)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DELPHI基础教程:对象链接与嵌入(一)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DELPHI基础教程:对象链接与嵌入(一)[5] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DELPHI基础教程:对象链接与嵌入(一)[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DELPHI基础教程:对象链接与嵌入(一)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DELPHI基础教程:对象链接与嵌入(一)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DELPHI基础教程:动态链接库编程(二)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
迄今为止我们见到的内部类好象仅仅是一种名字隐藏以及代码组织方案尽管这些功能非常有用但似乎并不特别引人注目然而我们还忽略了另一个重要的事实创建自己的内部类时那个类的对象同时拥有指向封装对象(这些对象
DELPHI基础教程:动态链接库编程(二)[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!