📄 022.htm
字号:
face="宋体" lang="ZH-CN">对象而启动程序</p>
<p> </font>SmRegSever <font face="宋体" lang="ZH-CN">应用程序仅为注册一个或多个</font>OLE<font
face="宋体" lang="ZH-CN">对象而启动</p>
<p> </font>SmUnregSever <font face="宋体" lang="ZH-CN">应用程序仅为注销一个或多个</font>OLE<font
face="宋体" lang="ZH-CN">对象而启动</font></p>
<p><font face="宋体" lang="ZH-CN">━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ </p>
<p> 当</font>StartMode<font face="宋体" lang="ZH-CN">模式是</font>SmAutomation<font
face="宋体" lang="ZH-CN">,而用户不再需要服务器时发生</font>OnLastRelease <font
face="宋体" lang="ZH-CN">事件。此时所有</font>OLE<font face="宋体" lang="ZH-CN">控制器释放了由服务器创建的对象。缺省情况下,服务器关闭实例,但</font>OnLastRelease
<font face="宋体" lang="ZH-CN">事件可根据实际情况是否关闭。</font>OnLastRelease
<font face="宋体" lang="ZH-CN">事件可得到一个叫</font>ShutDown<font
face="宋体" lang="ZH-CN">的布尔型变量。把</font>ShutDown<font face="宋体"
lang="ZH-CN">设置成</font>True<font face="宋体" lang="ZH-CN">,则在最后一个</font>OLE<font
face="宋体" lang="ZH-CN">对象释放时服务器不关闭。</p>
<p> 无论创建何种自动化服务器,必须定义对控制器的界面,包括定义和注册</font>OLE<font
face="宋体" lang="ZH-CN">对象,</font>OLE<font face="宋体" lang="ZH-CN">自动化对象的属性和方法。定义界面主要是为了控制器能够引用它们。</p>
<p> 对已存在的自动化服务器界进行修改时,要确保向上兼容 ,不要删去已有的属性、方法,这样会导致已存在的自动化控制器发生错误,修改服务器只能增加属性和方法。</p>
<p> 创建</font>OLE<font face="宋体" lang="ZH-CN">自动化服务器第一步是创建服务器自身。即创建能输出</font>OLE
<font face="宋体" lang="ZH-CN">对象的应用程序或动态链接库。这主要取决于是创建进程内服务器还是进程外服务器。</p>
<p> 创建进程内服务器,即动态链接库:</p>
<p> </font>1.<font face="宋体" lang="ZH-CN">创建动态链接库;</p>
<p> </font>2.<font face="宋体" lang="ZH-CN">在工程文件的</font>uses<font
face="宋体" lang="ZH-CN">条款中加入</font>OLEAuto<font face="宋体" lang="ZH-CN">单元;</p>
<p> </font>3.<font face="宋体" lang="ZH-CN">在</font>DLL<font face="宋体"
lang="ZH-CN">中输出四个标准入口,即加入以下代码。 </p>
<p> </font>exports</p>
<p>DLLGetClassObject,DLLCanUnloadNow;</p>
<p>DLLRegisterServer,DLLUnregisterServer; </p>
<p><font face="宋体" lang="ZH-CN">以上代码必须准确拼写,包括大小写。与</font>Object
Pascal<font face="宋体" lang="ZH-CN">的其它项目不同,这些代码</p>
<p>对大小写敏感。</p>
<p> 创建进程外服务器:</p>
<p> </font>1.<font face="宋体" lang="ZH-CN">创建一个</font>Delphi<font
face="宋体" lang="ZH-CN">应用程序;</p>
<p> </font>2.<font face="宋体" lang="ZH-CN">在工程文件的</font>begin<font
face="宋体" lang="ZH-CN">之后加入以下代码; </p>
<p> </font>if Automation,Server Registration then Exit; </p>
<p><font face="宋体" lang="ZH-CN">创建服务器之后,应该向服务器加入</font>OLE<font
face="宋体" lang="ZH-CN">自动化对象,这个过程大部分是自动完成的,但必须向</font>Delphi<font
face="宋体" lang="ZH-CN">的自动化对象专家提供必要的信息。</p>
<p> 把</font>OLE<font face="宋体" lang="ZH-CN">自动化对象加入服务器:</p>
<p> </font>1.<font face="宋体" lang="ZH-CN">在</font>Delphi<font face="宋体"
lang="ZH-CN">集成开发环境中选择</font>File| New <font face="宋体" lang="ZH-CN">菜单项,</font>
<font face="宋体" lang="ZH-CN">并在对象集中选择</font>Automation</p>
<p>Object,Delphi<font face="宋体" lang="ZH-CN">打开自动化对象专家。</font></p>
<p>2.<font face="宋体" lang="ZH-CN">给自动化对象命名</p>
<p> 这是服务器内部标识</font>OLE<font face="宋体" lang="ZH-CN">对象的名字,必须是个有效的面象对象</font>Pascal<font
face="宋体" lang="ZH-CN">标识符,习惯上以</font>T<font face="宋体"
lang="ZH-CN">字母开头;</p>
<p> </font>3.<font face="宋体" lang="ZH-CN">给</font>OLE<font face="宋体"
lang="ZH-CN">类命名</p>
<p> 该名用以外部控制器创建对象。当服务器在</font>Windows<font
face="宋体" lang="ZH-CN">中注册</font>OLE<font face="宋体" lang="ZH-CN">对象,</font>
<font face="宋体" lang="ZH-CN">就以这个名字在系统注册。控制器使用这个名字调用</font>CreateOLEObject<font
face="宋体" lang="ZH-CN">来创建对象。</p>
<p> </font>4.<font face="宋体" lang="ZH-CN">描述要输出的对象。</p>
<p> </font>5.<font face="宋体" lang="ZH-CN">定义对象的实例</font>(instancing)<font
face="宋体" lang="ZH-CN">,进程内服务器常定义为</font>Multiple,<font
face="宋体" lang="ZH-CN">进程外服务器常定义为</font>Single<font face="宋体"
lang="ZH-CN">;</p>
<p> </font>6.<font face="宋体" lang="ZH-CN">选择</font>OK<font face="宋体"
lang="ZH-CN">键完成该过程</p>
<p> 自动化对象专家将产生以下代码:</p>
<p> ●</font> <font face="宋体" lang="ZH-CN">从</font>TAutoObject<font
face="宋体" lang="ZH-CN">派生下来的自动化对象定义,但没有定义任何属性方法;</p>
<p> ●</font> <font face="宋体" lang="ZH-CN">调用</font>DelphiOLE<font
face="宋体" lang="ZH-CN">自动化管理器的注册代码,管理器负责</font>Windows<font
face="宋体" lang="ZH-CN">中注册服务器和对象。 </p>
<p> 在注册代码中包括一个自动产生的</font>ID<font face="宋体"
lang="ZH-CN">号,这个</font>ID<font face="宋体" lang="ZH-CN">号是全局唯一的,通常不要修改。每个</font>ID<font
face="宋体" lang="ZH-CN">号与一个</font>OLE<font face="宋体" lang="ZH-CN">类名相对应,如果其中之一被改变,应用程序在使用时会发生错误。</p>
<p> 在创建了服务器并把</font>OLE<font face="宋体" lang="ZH-CN">自动化对象加入服务器之后,控制器程序就可以对服务器进行操纵。 </p>
</font><p>8.4.3 <font face="宋体" lang="ZH-CN">自动化另一程序 </p>
<p> 每个服务器在系统注册中有一个叫</font>ProgID<font face="宋体"
lang="ZH-CN">的关键定,主要用以控制器辨识服务器。任何控制器可以用</font>ProgID<font
face="宋体" lang="ZH-CN">号来创建</font>OLE<font face="宋体" lang="ZH-CN">对象实例。例程</font>AutoForm<font
face="宋体" lang="ZH-CN">是控制器程序,它在其主窗体创建了</font>OLE<font
face="宋体" lang="ZH-CN">对象实例。 </p>
<p> </font>procedure TMainForm.FormCreate(Sender : TObject);</p>
<p>begin</p>
<p>try</p>
<p>MemoEdit := CreateOleObject('MemoEdit.Application');</p>
<p>except</p>
<p>MessageDlg(</p>
<p>'An instance of the "MemoEdit Application"OLE Automation Class could</p>
<p>not be created,Make sure that the MemoEdit application has been registered</p>
<p>using a "MemoEdit|regserver"command line',</p>
<p>mtError,[mbok],0)</p>
<p>Halt;</p>
<p>end;</p>
<p>end; </p>
<p><font face="宋体" lang="ZH-CN">
控制器创建了</font>OLE<font face="宋体"
lang="ZH-CN">自动化对象实例后,可对其进行操纵。</font>OLE<font
face="宋体" lang="ZH-CN">自动对象包括属性和方法,虽然</font>OLE<font
face="宋体" lang="ZH-CN">自动化对象与面向对象</font>Pascal<font face="宋体"
lang="ZH-CN">中的对象不是同一概念,但</font>Delphi<font face="宋体"
lang="ZH-CN">允许使用与类似的语法对</font>OLE<font face="宋体" lang="ZH-CN">对象的方法进行调用。</p>
<p> </font>AutoForm<font face="宋体" lang="ZH-CN">的很多过程引用了</font>OLE<font
face="宋体" lang="ZH-CN">自动化对象的方法: </p>
<p> </font>procedure TMainForm,TileButtonClick(Sender : Tobject);</p>
<p>begin</p>
<p>MemoEdit,TileWindow;</p>
<p>end; </p>
<p><font face="宋体" lang="ZH-CN">其中</font>TileWindows<font face="宋体"
lang="ZH-CN">是</font>OLE<font face="宋体" lang="ZH-CN">对象</font>TMemoApp<font
face="宋体" lang="ZH-CN">中定义的方法。</p>
<p> </font>AutoForm<font face="宋体" lang="ZH-CN">还通过</font>TMemoApp<font
face="宋体" lang="ZH-CN">的</font>NewMemo<font face="宋体" lang="ZH-CN">方法获得了对服务器内部</font>OLE<font
face="宋体" lang="ZH-CN">对象</font>TMemoDoc <font face="宋体" lang="ZH-CN">的引用。</p>
<p> procedure TMainForm,CreateButtonClick(Sender : TObject);</p>
</font><p>var</p>
<p>I : Integer;</p>
<p>begin</p>
<p>CloseMemo</p>
<p>for I := 1 to 3 do Memos[2] := MemoEdit.NewMemo;</p>
<p>end; </p>
<p><font face="宋体" lang="ZH-CN">其中</font>NewMemo<font face="宋体" lang="ZH-CN">在</font>MemoAuto<font
face="宋体" lang="ZH-CN">单元中定义如下: </p>
<p> </font>function IMemoApp.NewMemo : Variant;</p>
<p>begin</p>
<p>Result := MainForm,CreateMemo(' '),OleObject;</p>
<p>end;</p>
<p><font face="宋体" lang="ZH-CN">控制器在获得服务器的内部</font>OLE<font
face="宋体" lang="ZH-CN">对象后,可以引用其方法: </p>
<p> </font>procedure TMainForm.AddTextButtonClick(Sender,TObject);</p>
<p>var</p>
<p>I : Integer;</p>
<p>begin</p>
<p>for I := 1 to 3 do </p>
<p>if not var IsEmpty(Memo[I]) then</p>
<p>Memo[I],Insert{'This text was added through OLE Automation'#13#10);</p>
<p>end;</p>
<p>Insert<font face="宋体" lang="ZH-CN">是</font>TMemoDoc<font face="宋体"
lang="ZH-CN">中定义的方法,用以在子窗体中插入字符串。</font></p>
<BR>
<hr color="#EE9B73" size="1" width="94%">
</TD>
<TD CLASS="tt3" VALIGN="bottom" width="8%" bgcolor="#e0e0e0"><strong><A HREF="023.htm"><FONT style="FONT-SIZE: 9pt">后一页</font></A><BR>
<A HREF="021.htm"><FONT style="FONT-SIZE: 9pt">前一页</font></A><BR>
<A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目录</font></A><BR>
<A HREF="../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首页</font></A><BR>
</strong>
</TD>
</TR>
</table>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -