摘要

本文回答關於以 Microsoft Office 的自動化,從 Visual C++ 的常見問題。

其他相關資訊

目錄

  1. 什麼是自動化?

  2. 我是的自動化,哪裡可以找到很好的資源,以瞭解更多的新手嗎?

  3. 有不同的方式,我可以使用自動化嗎?

  4. 什麼是 COM?

  5. 如何附加至正在執行的執行個體的 Office 應用程式?

  6. 我要如何傳遞選擇性參數?

  7. 如何找出 Office 應用程式所公開的事件?

  8. 我的自動化程式碼是太慢。如何提高速度事項?

  9. 這些巨大的錯誤值,例如-2147352573 或 0x80030002,代表什麼意義?

  10. 型別程式庫是什麼?

  11. 我的自動化程式碼是由 Microsoft Excel 95 中,但失敗,Microsoft Excel 97 所處理。為什麼?

  12. 為什麼沒有應用程式,我自動化停留在記憶體中完成我的程式後?

  13. 我知道我想要作為 Microsoft Office 應用程式使用者,但我怎麼做這使用自動化來以程式設計方式?

  14. 可以自動執行內嵌的 Microsoft Office 應用程式?

  15. 我要如何存取我的文件屬性在 Microsoft Office 文件中?

問題和答案

  1. 什麼是自動化? 自動化 (以前 OLE 自動化) 是一種技術,可讓您利用現有的程式功能,並將其整合到自己的應用程式。舉個例說,您還可以利用 Microsoft Word 的拼字及文法檢查功能加入您的應用程式,而不需您的使用者看見的 Microsoft Word。您甚至可以使用所有的 Microsoft Excel 的圖表、 列印以及資料分析工具。這項技術可以大幅簡化並加速您的開發。

  2. 我是的自動化,哪裡可以找到很好的資源,以瞭解更多的新手嗎?David Kruglinski"內 Visual C++ 」 的章節 24 (ISBN:1-57231-565-2) 提供的一般概觀,以及一些很棒的範例。此外,「 Microsoft 知識庫 」 是資訊的理想來源。這份文件本身是一個很好的開始,且可以找到更明確的參考下列的文 「 Microsoft 知識庫 」 中的文件中:

    尋找來研究 OLE 自動化的資源如果您想學習範例時,請參閱下列文件的 「 Microsoft 知識庫 」 中的文:

    如何使用 MFC 自動化 Excel 和建立/格式新的活頁簿

  3. 有不同的方式,我可以使用自動化嗎? 有三種基本方式,您可以使用自動化: MFC 中,#import 和 C/c + +:

    • MFC 中,使用 Visual C++ 類別精靈,從 Microsoft Office 型別程式庫產生 「 包裝函式類別 」。這些類別,以及其他的 MFC 類別,例如 COleVariant、 COleSafeArray、 COleException,簡化自動化的工作。透過其他建議通常使用這個方法,大部分的 Microsoft 知識庫 」 範例使用 MFC。

    • #import,與 Visual C++ 的 5.0 版,可使用的新指示詞會建立 VC + +"智慧型指標 」 從指定的型別程式庫。因為參考-計算所發生的問題通常與 Microsoft Office 應用程式搭配使用時是非常強大,但通常不建議。

    • C/c + + 自動化十分困難,但有時候在需要避免使用 MFC,額外負荷或 #import 的問題。基本上,您可以配合 CoCreateInstance(),為此類 Api,而且 COM 介面,例如 IDispatch 和 IUnknown。

    請務必請注意,是因為 COM 專為 c + + 類別,相較於一般的 C 的 c + + 的自動化之間有些微的差異。如需詳細資訊,請參閱下列 「 Microsoft 知識庫 」 中的文件,如需 C 的範例:

    如何: 使用 OLE 自動化,從 C 應用程式

  4. 什麼是 COM? 自動化是以元件物件模型 (COM) 為基礎。COM 是使用標準的軟體架構,根據介面,並分成獨立的物件的程式碼設計。把它視為擴充功能的物件導向程式設計 (OOP) 架構中,但適用來區隔應用程式。每個物件會公開一組介面,並初始化、 告知和資料傳輸,例如,此物件的所有通訊都是透過這些介面。 COM 也是一組動態連結程式庫 (Dll) 安裝與作業系統所提供的服務。自動化所採用的這些服務。例如,"Marshalling"服務,該封裝用戶端應用程式呼叫伺服器應用程式的介面的成員函式,並將那些使用,請在其引數,伺服器應用程式傳遞的服務。它讓出現伺服器的介面會公開在用戶端的記憶體空間,不符合上述情況,當用戶端是在它自己的處理序空間中執行的.exe。封送處理也會取得傳回值從伺服器的方法上一步跨處理序界限,而安全地落入的用戶端的呼叫。有許多其他服務所提供的各種 COM 程式庫的自動化很重要。來源的資訊包括"內 Ole-第二版 」 依 Kraig Brockschmidt、 ISBN 1-55615-843-2、"內 COM"Dale Rogerson-ISBN 1-57231-349-8,並 「 自動化程式設計人員參考,」 ISBN 1-57231-584-9。

  5. 如何附加至正在執行的執行個體的 Office 應用程式? 使用 GetActiveObject() API。自動化伺服器註冊 (執行物件表格,) ROT 中透過 RegisterActiveObject() API。自動化用戶端可以如取得程式碼執行的執行個體:

          // Translate server ProgID into a CLSID. ClsidFromProgID      // gets this information from the registry.      CLSID clsid;      CLSIDFromProgID(L"Excel.Application", &clsid);        // Get an interface to the running instance, if any..      IUnknown *pUnk;      HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);      ASSERT(!FAILED(hr));      // Get IDispatch interface for Automation...      IDispatch *pDisp;      hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);      ASSERT(!FAILED(hr));      // Release the no-longer-needed IUnknown...      pUnk->Release();

    附註: 如果有多個執行個體執行您想要附加的 Office 應用程式,您將只能附加到已啟動使用 GetActiveObject() API 的第一個執行個體。 理論上來說,您可以逐一查看 ROT 對於每個個別的執行個體,但如果另一個執行個體已在 ROT 因為自行 moniker 永遠是相同的 (它無法進行區分還是),Office 應用程式不要登錄本身。這表示您無法貼附至第一個以外的任何執行個體。不過,因為 Office 應用程式也會登錄在 ROT 中的文件,您可以成功地附加至其他執行個體中循序搜尋 ROT 尋找特定的文件,附加到它,然後取得從它的 [應用程式物件。有一些程式碼位於下列 「 Microsoft 知識庫 」 文件,以逐一查看 ROT,並尋找文件名稱:

    如何: 從 OCX 取得 IDispatch Excel 或 Word 文件的您不需要執行這項操作的 PowerPoint,因為它是單一執行個體應用程式中。您只能有一個執行個體的執行。

  6. 我要如何傳遞選擇性參數? 某些方法有"optional"的參數。在 Visual Basic 中,您可以資料庫取走省略呼叫方法時。然而,與 Visual C++ 的呼叫時,您必須要通過特殊的 VARIANT 其.vt 欄位是 VT_ERROR,而.scode 欄位是 DISP_E_PARAMNOTFOUND。這就是:

          // VARIANT used in place of optional-parameters.      VARIANT varOpt;      varOpt.vt = VT_ERROR;      varOpt.scode = DISP_E_PARAMNOTFOUND;

    這實在是 Visual Basic 正在做幕後。

  7. 如何找出 Office 應用程式所公開的事件? 基本上您實作事件介面,您要攔截 (「 接收 」),並設定諮詢連接與應用程式 (「 來源 」)。下列的文件可以讓您逐步範例供 Microsoft Word:

    如何: 攔截 Microsoft Word97 使用 VC + + 的應用程式事件一般情況下,若要設定諮詢連接,您取得伺服器的 IConnectionPointContainer,並呼叫 FindConnectionPoint() 具有事件介面的 IID。這可讓您 IConnectionPoint 介面,剩下的就是呼叫 Advise() 事件介面的執行個體。伺服器會再透過這個介面時回呼發生這些事件。

  8. 我的自動化程式碼是太慢。如何提高速度事項? 使用自動化的速度問題的常見原因是與重複的讀取和寫入資料。這是一般 Excel 自動化用戶端。不過,大部分的人不曉得通常可以寫入或讀取一次使用安全陣列時發生此資料的。請參閱下列 「 Microsoft 知識庫 」 文件,如需詳細資訊,以及資訊的範例:

    如何: 使用 MFC 以自動化 Excel,並填入陣列的範圍

    如何: 使用 MFC,若要將 Excel 自動化和取得陣列,從範圍

    如何: 使用 MFC,將 Excel 自動化,並建立/格式新的活頁簿此外,務必點,使用剪貼簿可以有時會改善效能。舉個例說,您可以將您的資料複製到剪貼簿,然後使用自動化來告知伺服器要貼上。反之亦然;告訴複製-剪貼到伺服器並貼到您的應用程式。

  9. 這些巨大的錯誤值,例如-2147352573 或 0x80030002 平均數做什麼? 這些值稱為 Hresult,而定義在 winerror.h 中。號碼會很大,因為第一個位元代表,不論它錯誤結果。您可以使用 ErrLook.Exe 公用程式,而隨附 Visual C++,將這些數字轉換成有意義的描述。 如果您想要利用程式設計方式取得錯誤的描述,您可以使用 FormatMessage() API。FormatMessage() 使用,請參閱下列微軟知識庫文件,如需詳細資訊及範例:

    資訊: 轉譯 VB/vba 的自動化錯誤

    範例: Decode32 和 Decode16 OLE 錯誤程式碼解碼器工具附註: 如果您使用 Visual C++ 6.0,有包含偵錯的 [監看式] 視窗中,這個值的變數時,附加",hr"(不含引號),必須將它解譯為您的 Visual C++ !

  10. 型別程式庫是什麼? 型別程式庫是類似於 C/c + + 標頭檔。它包含介面、 方法和發行伺服器的內容。您可以檢視隨附 Visual C++ OLE/COM 物件檢視器 (Oleview.exe) 型別程式庫。以下是一份型別程式庫檔名,如 Microsoft Office 95、 97 與 2000年: Office Application | Type library ------------------------+---------------- Word 95 and prior | wb70en32.tlb Excel 95 and prior | xl5en32.olb Powerpoint 95 and prior | Powerpoint.tlb Access 95 and prior | msaccess.tlb Binder 95 | binder.tlb Schedule+ | sp7en32.olb Project | pj4en32.olb Team Manager | mstmgr1.olb Word 97 | msword8.olb Excel 97 | excel8.olb Powerpoint 97 | msppt8.olb Access 97 | msacc8.olb Binder 97 | msbdr8.olb Graph 97 | graph8.olb Outlook 97 | msoutl8.olb Outlook 98 | msoutl85.olb Word 2000 | msword9.olb Excel 2000 | excel9.olb Powerpoint 2000 | msppt9.olb Access 2000 | msacc9.olb Outlook 2000 | msoutl9.olb Word 2002 | msword.olb Excel 2002 | excel.exe Powerpoint 2002 | msppt.olb Access 2002 | msacc.olb Outlook 2002 | msoutl.olb

  1. 使用 Excel 95 中,但 Excel 97 的失敗,過我的自動化程式碼。發生了什麼? Excel 的物件模型進行重大的變更從 95 以 97 版。Excel 95 中的單一實作 IDispatch,實作其所有的方法和屬性。這意味著,通常您可以呼叫是針對物件 X,Y object 的方法。這不是良好的設計,以便在 Office 97 中,每個物件都有自己的分隔 Idispatch 實作。這表示,如果您要求的方法或屬性的物件 X,Y 的個別物件從來源,您收到錯誤 0x80020003,-2147352573,「 找不到成員 」。若要避免這個錯誤,您需要確定您從進行呼叫的基礎 IDispatch 介面是語意正確。請參閱下列 「 Microsoft 知識庫 」 文件,如需詳細資訊:

    如何: 疑難排解: Member 找不到,0x80020003 錯誤

  2. 我的程式完成後,我自動化的應用程式會停留在記憶體中。發生了什麼? 最可能的這是因為您忘記釋放取得的介面,而且您將必須追蹤它。以下是一些一般性的建議,而項目,以查看有:

    • 如果您正在使用 #import,就很可能是您可能執行到與其相關聯的參考計數錯誤之一。經常 bug 可以正常運作,但通常會偏好使用一種自動化方法。#import 不太管用與 Office 應用程式中,因為它的型別程式庫和運用是相當複雜。此外,這類參考計數的問題 」,難以追蹤因為大量介面層級的 COM 呼叫幕後時使用 #import。

    • 請檢查呼叫任何方法,例如開啟,] 或 [新增],會傳回 IDispatch * (LPDISPATCH),並忽略傳回值。如果您是,您會放棄這個傳回的介面,而需要變更您的程式碼,讓您不再需要時釋放。

    • 逐漸標記為註解的程式碼,直到問題消失,然後將它加入區段回謹慎追蹤問題開始之處。

    • 請注意,某些應用程式會保持執行,如果使用者有"接觸 」 的應用程式。如果您想自動化時,發生此狀況,然後應用程式將可能一直之後執行。Office 應用程式對應用程式物件,您可以讀取/寫入來變更此行為的 「 使用者控制項 」 屬性。

    • 此外,某些應用程式會決定保持執行,如果發生 「 動作 」 不足,無法使用者介面。如果您要結束應用程式,然後應用程式物件上呼叫它的 Quit() 方法。在呼叫結束時,Word 將會關機,不論其參考次數。這不是預期的 COM 行為。Excel 中,不過,會正確只把自己隱藏但還是保持執行,直到所有未完成的介面都放開為止。一般情況下,您應該釋放所有未完成的參考,並只呼叫 Quit(),如果您想要結束應用程式。

  3. 我知道我想要作為 Office 應用程式使用者,但我怎麼做這以程式設計的方式由 「 自動化? 您感興趣,是要使用何種物件、 方法和屬性。若要了解如何瀏覽 Word、 Excel 及 Powerpoint,根據您身為使用者,進行想要的物件模型,最好是使用巨集錄製器。只要從 [工具] 功能表中選擇 [Macro\' 錄製新巨集 '、 執行的工作,您感興趣,然後選擇 [Macro\' 停止錄製]。一旦您完成錄製時,從 [工具] 功能表中選擇 [Macro\Macros,選取您所錄製的巨集然後按一下 [編輯]。這將帶領您至產生的 VBA 程式碼,將會完成您所錄製的工作。請記住錄製的巨集無法最可能的程式碼中大多數的情況下,但它的很好的快速的範例。

  4. 可以自動執行內嵌的 Office 應用程式? 絕對。這一輪取得 IDispatch 指標: 這已列在 [Visual C++ 技術注意 39 (TN039)。請參閱下列 「 Microsoft 知識庫 」 文件,以逐步說明的範例:

    如何: 內嵌和自動化使用 MFC 的 Microsoft Excel 工作表

  5. 我要如何存取我的文件屬性在 Office 文件中? 此文件內容是透過自動化,或直接 IPropertyStorage 存取。下列的 「 Microsoft 知識庫 」 文件示範每一種方法:

    如何: 使用自動化來擷取內建文件屬性

    如何: 讀取直接與 VC + + 的複合文件內容

需要更多協助?

擴展您的技能
探索訓練
優先取得新功能
加入 Microsoft 測試人員

這項資訊有幫助嗎?

您對語言品質的滿意度如何?
以下何者是您會在意的事項?

感謝您的意見反應!

×