什麼是自動化 (OLE 自動化)?概念、運作方式
自動化可讓一個應用程式操作在另一個應用程式中實作的物件,或公開物件以便可以操作它們。
自動化 (OLE 自動化)
索引(在此頁面中)
什麼是自動化(OLE Automation)
自動化伺服器
自動化伺服器範例
支援自動化伺服器
自動化用戶端
在自動化用戶端中處理事件
自動化用戶端:使用類型程式庫
如何從類型庫創建分派類
外部參考
什麼是 OLE 自動化?
一種 Microsoft 技術,可讓應用程式將其功能公開給其他應用程式。自動化 (先前稱為 OLE 自動化) 是以元件物件模型 (COM) 為基礎,並允許元件的執行階段繫結。自動化僅由腳本語言使用,例如 Microsoft Visual Basic for Applications (VBA)、Microsoft Visual Basic Scripting Edition (VBScript) 和 Microsoft JScript,以存取支援自動化的 COM 元件。
自動化的優點是它允許各種語言在運行時間訪問 COM 組件。自動化的缺點是速度很慢,而且無法執行編譯階段資料類型檢查。
透過自動化公開其功能的應用程式稱為自動化伺服器。透過自動化與伺服器通訊的應用程式稱為自動化用戶端。
自動化伺服器
自動化伺服器是將可程式化物件 (稱為自動化物件) 公開給其他應用程式 (稱為自動化用戶端) 的應用程式。自動化伺服器有時稱為自動化元件。
公開自動化物件可讓用戶端直接存取伺服器提供的物件和功能,以自動化特定程序。當應用程式提供對其他應用程式有用的功能時,以這種方式公開物件是有益的。例如,文字處理器可能會公開其拼字檢查功能,以便其他程式可以使用它。因此,物件的公開可讓廠商使用其他應用程式的現成功能來改善其應用程式的功能。
這些自動化物件具有屬性和方法作為其外部介面。屬性是自動化物件的具名屬性。屬性就像 C++ 類別的資料成員。方法是處理自動化物件的函式。方法就像 C++ 類別的公用成員函式。
自動化伺服器範例
以下是自動化伺服器的範例:一個文字處理程序,可以公開其拼字檢查功能,以便自動化控制器可以存取它們。這容許其他程式 (自動化用戶端或控制器) 使用一個程式 (自動化伺服器) 的功能。
支援自動化伺服器
Visual C++ 和 MFC 架構為自動化伺服器提供廣泛的支援。它們會處理製作自動化伺服器所涉及的大部分額外負荷,因此您可以將精力集中在應用程式的功能上。
架構支援自動化的主要機制是分派對應,這是一組宏,可展開為公開 OLE 方法和屬性所需的宣告和呼叫。一般分派對應如下所示:C++複製
BEGIN_DISPATCH_MAP(CMyServerDoc, COleServerDoc) DISP_PROPERTY(CMyServerDoc, "Msg", m_strMsg, VT_BSTR) DISP_FUNCTION(CMyServerDoc, "SetDirty", SetDirty, VT_EMPTY, VTS_I4) END_DISPATCH_MAP()
「類別精靈」和「類別檢視」可協助維護調度地圖。當您將新方法或屬性新增至類別時,Visual Studio 會新增對應或巨集,其中包含參數,指出類別名稱、方法或屬性的外部和內部名稱,以及資料類型。DISP_FUNCTION
DISP_PROPERTY
[新增類別] 對話方塊也會簡化自動化類別的宣告,以及其屬性和作業的管理。當您使用 [新增類別] 對話方塊將類別新增至專案時,您可以指定其基底類別。如果基類允許自動化,則 [新增類別] 對話方塊會顯示您用來指定新類別是否應該支援自動化、是否為「OLE 可建立」 (也就是,是否可以根據 COM 用戶端的要求建立類別的物件) ,以及 COM 用戶端要使用的外部名稱。
然後,[新增類別] 對話方塊會建立類別宣告,包括您指定之 OLE 功能的適當巨集。它還添加了用於實現類別成員函數的骨架代碼。
MFC 應用程式精靈可簡化讓自動化伺服器應用程式啟動所涉及的步驟。如果您從 [進階功能] 頁面選取 [自動化] 核取方塊,MFC 應用程式精靈會將註冊自動化物件並將應用程式作為自動化伺服器執行所需的呼叫新增至應用程式的函式。
自動化用戶端
自動化用戶端是存取自動化伺服器功能的用戶端。自動化 (OLE 自動化) 是一個應用程式操作另一個應用程式的公開物件 (屬性和方法) 的一種方式。
自動化控制器是用戶端應用程式,可操作另一個應用程式的公開物件,稱為自動化伺服器。自動化控制器的範例包括 Microsoft Word、Microsoft Excel 和 Microsoft Visual Basic。
自動化用戶端有兩種類型:
在編譯階段具有連結至其自動化伺服器內容及方法的靜態資訊的用戶端。
在執行時期動態取得自動化伺服器內容及方法相關資訊的用戶端。這些用戶端會透過查詢自動化伺服器的 IDispatch 介面來執行此動作。
第二種用戶端會藉由查詢 OLE 系統的機制來取得伺服器方法和屬性的相關資訊。雖然它足以用於動態用戶端,但很難用於靜態用戶端,其中所驅動的物件必須在編譯階段已知。針對靜態系結用戶端,Microsoft Foundation 類別會提供 COleDispatchDriver 類別。IDispatch
IDispatch
靜態繫結用戶端會使用與用戶端應用程式靜態連結的 Proxy 類別。這個類別提供伺服器應用程式屬性和作業的類型安全 C++ 封裝。
此類別提供自動化用戶端的主要支援。使用「新增項目」對話框,您可以建立衍生自 的類別。COleDispatchDriver
COleDispatchDriver
然後,您可以指定描述伺服器應用程式物件屬性和函式的類型程式庫檔案。[新增專案] 對話方塊會讀取此檔案,並建立衍生類別,其中包含您的應用程式可以呼叫的成員函式,以類型安全的方式存取 C++ 中的伺服器應用程式物件。繼承自的其他功能可簡化呼叫適當自動化伺服器的程序。COleDispatchDriver
COleDispatchDriver
在自動化用戶端中處理事件
如果您想要處理自動化用戶端中的事件,您必須新增接收介面。MFC 提供精靈支援來新增 ActiveX 控制項的接收介面,但不支援其他 COM 伺服器。
自動化用戶端:使用類型程式庫
如果用戶端要操作伺服器的物件,自動化用戶端必須具有伺服器物件屬性和方法的相關資訊。屬性具有資料類型;方法通常會傳回值並接受參數。用戶端需要所有這些資料類型的相關資訊,才能靜態繫結至伺服器物件類型。
此類型資訊可以透過多種方式為人所知。建議的方法是建立類型程式庫。
如需 MkTypLib 的相關資訊,請參閱 Windows SDK。
Visual C++ 可以讀取類型程式庫檔案,並建立衍生自 COleDispatchDriver 的分派類別。該類別的物件具有複製伺服器物件的屬性和作業。您的應用程式會呼叫此物件的屬性和作業,以及繼承自的功能會將這些呼叫路由傳送至 OLE 系統,而 OLE 系統接著會將它們路由傳送至伺服器物件。COleDispatchDriver
如果您在建立專案時選擇包含自動化,Visual C++ 會自動為您維護此類型程式庫檔案。在每個組建中,將使用 MkTypLib 建置 .tlb 檔案。
如何從類型庫 (.tlb) 檔案建立分派類別
在 [類別檢視] 或 [方案總管] 中,以滑鼠右鍵按一下專案,然後按一下 [新增],然後按一下捷徑功能表上的 [新增類別]。
在 [ 新增類別 ] 對話方塊中,選取左窗格中的 Visual C++/MFC 資料夾。從右窗格中選取 [來自 TypeLib 的 MFC 類別] 圖示,然後按一下 [開啟]。
在「從 Typelib 精靈新增類別」對話方塊中,從「可用的類型程式庫」下拉式清單中選取類型程式庫。「介面」方塊會顯示所選類型資源庫可用的介面。若要選取介面,請按兩下它們或按一下 新增 按鈕。當您這樣做時,分派類別的名稱將出現在 產生的類別 方塊中。您可以在方塊中編輯類別名稱。[檔案] 方塊會顯示將在其中宣告類別的檔案。(您也可以編輯此檔案名稱)。如果您希望將標頭和實作資訊寫入現有檔案或專案目錄以外的目錄中,您也可以使用瀏覽按鈕來選取其他檔案。
Class
按一下 [完成]。然後,精靈會使用指定的類別和檔名來撰寫分派類別的程式碼。