文章編號: 288902 - 上次校閱: 2007年3月19日 - 版次: 9.2

Office 自動化伺服器的 GetObject 和 CreateObject 行為

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

本文將告訴您,當您在各種版本的 Microsoft Office 應用程式使用 GetObjectCreateObject 函數時,所發生的不同行為。GetObjectCreateObject 是由 Microsoft Visual Basic 和 Microsoft Visual Basic for Applications (VBA) 提供的函數。不過,如果您將 GetObject 的參照當成對 GetActiveObject API 的呼叫處理,以及將 CreateObject 的參照當成對 CoCreateInstance API 的呼叫處理,則此資訊也適用於 Microsoft Visual C++。

其他相關資訊

GetObject

GetObject 用於附加至自動化伺服器的執行中執行個體。有幾種不同的方法可以呼叫 GetObject,但是針對 Microsoft Office 應用程式建議的語法如下:
set xlApp = GetObject(, "Excel.Application")
				
如果執行此程式碼時有 Microsoft Excel 的執行個體正在執行,則您可以透過 xlApp 變數存取執行中執行個體的物件模型。如果沒有執行中的執行個體,您會收到下列可設陷執行階段錯誤訊息:
執行階段錯誤 '429':
ActiveX component can't create object (ActiveX 元件無法建立物件)
如果有多個 Microsoft Excel 的執行個體正在執行,GetObject 會附加至最先啟動的執行個體。如果您接著關閉第一個執行個體,另一個對 GetObject 的呼叫會附加至先前啟動的第二個執行個體,以此類推。

如果您知道執行個體中開啟之文件的名稱,則可以附加至特定的執行個體。例如,如果有一個 Excel 的執行個體在執行中,並開啟了名為 Book2 的活頁簿,則即使該執行個體並非最早啟動的執行個體,下列程式碼仍會成功地附加至該執行個體:
Set xlApp = GetObject("Book2").Application
				

CreateObject

CreateObject 用於啟動自動化伺服器的新執行個體。例如:
set xlApp = CreateObject("Excel.Application")
				
根據伺服器的設計是 SingleUse 或 MultiUse,可能會 (或可能不會) 啟動另一個伺服器處理序。這將是決定您是否應強制關閉自動化執行個體的重要區別。例如,若是 MultiUse 伺服器,如果在您附加至執行個體之前,執行個體已在執行,則在您完成其自動化時,應避免使用程式設計方式關閉伺服器。

下表可做為實作 Microsoft Office 解決方案時的實用參照。表中列出 Microsoft Office 的各種版本和應用程式的行為與屬性,例如,伺服器啟動時是否預設為可見、是屬於 SingleUse 或 MultiUse、是否有 UserControl 屬性、是否有 Quit 方法,以及其主視窗的類別名稱。

摺疊此表格展開此表格
應用程式可見執行個體有 UserControl有 Quit類別名稱
Excel 97、2000、2002、2003、2007SingleUseXlMain
Word 97、2000、2002、2003、2007SingleUseOpusApp
PowerPoint 97MultiUsePP97FrameClass
PowerPoint 2000MultiUsePP9FrameClass
PowerPoint 2002MultiUsePP10FrameClass
PowerPoint 2003MultiUsePP11FrameClass
PowerPoint 2007MultiUsePP12FrameClass
Access 97SingleUseOMain
Access 2000、2002、2003、2007SingleUseOMain
Project 98、2000MultiUseJWinproj-WhimperMainClass

當您想要輕鬆地知道是否已有任何執行個體在執行時,主視窗類別名稱對呼叫 FindWindow API 非常有用。UserControl 屬性是布林屬性,指出當伺服器應用程式的最後參照釋放 (設定為無) 後,伺服器應用程式是否會自動關閉。Quit 方法可讓您在必要時 (例如執行個體未在最後參照釋放後關閉) 覆寫 UserControl 屬性。

一般而言,Microsoft 建議您使用新的 Office 應用程式執行個體,而不要附加至使用者可能正在使用的執行個體。最好是使用應用程式 ProgID 建立執行個體,然後從該執行個體開啟或建立新物件。其他 ProgID,例如 Excel.Sheet 和 Word.Document...等等,是要在 OLE (物件連結與內嵌) 中使用,搭配 CreateObject 使用時可能會產生不一致的結果。使用應用程式 ProgID,可明確地啟動自動化 (而非內嵌) 的伺服器,以避免潛在的問題。

當您完成自動化伺服器之後,請釋放對伺服器的所有參照,並呼叫其 Quit 方法 (如果有),讓伺服器能如預期地關閉。如果您要透過自動化來設定執行個體,然後讓其保持開啟以供使用者使用,則必須將 UserControl 屬性設定為 TRUE,再釋放您所有的參照。之後伺服器會保持執行 (因為 UserControl 屬性為 TRUE),並在使用者關閉應用程式時適當地關閉 (因為沒有未處理的參照)。

請注意 Word 的 UserControl 屬性是唯讀的。無法設定為 True 或 False。Word 一律會在最後一個參照釋放後保持執行。

?考

如需有關使用 GetObject/CreateObject 的詳細資訊,以及了解在 Microsoft Office 使用自動化的例外和問題,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
222783? (http://support.microsoft.com/kb/222783/ ) PPT2000:CreateObject Does Not Create New PowerPoint Session
188546? (http://support.microsoft.com/kb/188546/ ) BUG:Starting Word Manually Uses Same Instance as Automation
265385? (http://support.microsoft.com/kb/265385/ ) INFO:PowerPoint 97 和 PowerPoint 2000 Viewers 的 Automation 模式
259940? (http://support.microsoft.com/kb/259940/ ) BUG:Word 2000 Does Not Quit When Keybindings.ClearAll Is Called
258511? (http://support.microsoft.com/kb/258511/ ) HOWTO:Obtain Window Handle to Office Application For Automation
249169? (http://support.microsoft.com/kb/249169/ ) PPT97:PowerPoint 97 Remains in Memory After Getting a Presentation and Being Closed
159922? (http://support.microsoft.com/kb/159922/ ) XL97:Using Quit Method May Cause Illegal Operation

這篇文章中的資訊適用於:
  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Office Access 2007
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
  • Microsoft Access 2000 Standard Edition
  • Microsoft Access 97 Standard Edition
  • Microsoft Office PowerPoint 2007
  • Microsoft Office PowerPoint 2003
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft PowerPoint 2000 Standard Edition
  • Microsoft PowerPoint 97 Standard Edition
  • Microsoft Project 2000 Standard Edition
  • Microsoft Project 98 Standard Edition
  • Microsoft Office Word 2007
  • Microsoft Office Word 2003
  • Microsoft Word 2002 Standard Edition
  • Microsoft Word 2000 Standard Edition
  • Microsoft Word 97 Standard Edition
關鍵字:?
kbautomation kbinfo KB288902
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。