?? 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 + -