使用 Visual C++ 的辦公室自動化

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:196776
結論
本文將會為您解答有關到 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 知識庫 」 中下列文件中:
    152023尋找資源來研究 OLE 自動化
    如果您喜歡的學習依範例,請參閱下列的 「 Microsoft 知識庫 」 中的文件:
    179706HOWTO 使用 MFC 來自動化 Excel 和建立/格式新的活頁簿
  3. 是否有不同的方式,我可以使用自動化吗?

    有三種基本方式,您可以使用自動化: MFC,# import 和 C/C + +:

    • 以 MFC,使用 Visual C++ ClassWizard 從 Microsoft Office 型別程式庫產生 「 包裝函式類別 」。這些類別,以及其他如 COleVariant、 COleSafeArray、 COleException 的 MFC 類別簡化自動化的工作。通常透過他人,建議使用這個方法,大部分的 Microsoft 知識庫範例使用 MFC。
    • # import,變得可以使用 Visual 的 C + + 5.0 的新指示詞建立 VC + + 智慧型指標 」 從指定的型別程式庫。它是非常強大,但通常不建議的因為參考-計數時發生的問題通常與 Microsoft Office 應用程式一起使用。
    • C/C + + 自動化十分更困難,但有時需要避免負荷與 MFC 或 # import 的問題。基本上,您可以配合 CoCreateInstance(),作為這類 API,而且 COM 介面,例如 IDispatch 和 IUnknown。
    請務必注意有從 C + + 相較於一般 C 因為周圍 C + + 類別的設計是 COM 自動化有些微差異。如需詳細資訊請參閱下列文 「 Microsoft 知識庫 」 中為 C 的範例:
    181473HOWTO: 從 C 的應用程式使用 OLE 自動化
  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 尋找特定的文件附加到它,然後從它取得應用程式物件。反覆查看 ROT 和尋找文件名稱的下列 「 Microsoft 知識庫 」 文件中有一些程式碼:
    190985HOWTO: 從一個 OCX 取得 IDispatch Excel 或 Word 文件
    您不需要這樣的 PowerPoint,因為它是單一執行個體應用程式,您可以只可以執行它的一個執行個體。
  6. 如何進行傳遞選擇性參數?

    某些方法有選擇性 」 的參數。在 Visual Basic,您可以省略 casually 忽略這些呼叫方法時。不過,使用 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 的:
    183599HOWTO: 攔截使用 VC + + 的 Microsoft Word97 應用程式事件
    在一般要設定諮詢連接,您取得伺服器的 IConnectionPointContainer,呼叫 FindConnectionPoint() 具有事件介面的 IID。這提供您 IConnectionPoint 介面,而且所有剩下的是呼叫 Advise() 與事件介面的執行個體。伺服器會接著呼叫回透過這個介面發生這些事件時。
  8. 我的自動化程式碼是太慢。我如何能加速事情?

    自動化的速度問題的常見原因是與重複的讀取和寫入的資料。這是一般 Excel 自動化用戶端。不過,大多數人不注意通常可寫入或讀取一次使用 SAFEARRAY 此資料。請參閱下列微軟知識庫文件,如需詳細資訊及提供資訊的範例:
    186120HOWTO: 使用 MFC 來自動化 Excel 並填入陣列的範圍
    186122HOWTO: 使用 MFC 來自動化 Excel 從一個範圍取得陣列 (& I)
    179706HOWTO: 使用 MFC 來自動化 Excel 和建立/格式新的活頁簿
    而且,務必點使用剪貼簿可以有時改善效能。比方說您可以將您的資料複製到剪貼簿,然後使用自動化來告知伺服器要貼上。反之亦然,告知伺服器要複製-clipboard 並貼到您的應用程式。
  9. 類似像-2147352573 或 0x80030002 這樣的這些巨大的錯誤值是什麼意思?

    這些值稱為 HRESULT,而且在 winerror.h 中定義。數字是很大,因為第一個位元代表為錯誤結果。您可以使用 ErrLook.Exe 公用程式隨附 Visual C++ 將這些號碼轉譯成有意義的說明。

    若想以程式設計方式取得錯誤描述您可以使用 FormatMessage() API。請參閱下列微軟知識庫文件,如需詳細資訊和範例上 FormatMessage() 使用,:
    186063INFO: VB/VBA 的轉譯自動化錯誤
    122957範例: 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 的物件。這不是良好的設計,以便在 Office 97 中每個物件有它自己分隔 Idispatch 實作。這表示如果您有要求方法或屬性從個別的物件 Y 中的物件 X,您會收到 「 錯誤 0x80020003,-2147352573,「 成員找不到]。若要避免這個錯誤,您必須先確認您正在從呼叫的基礎 IDispatch 介面是語意上正確。請參閱下列微軟知識庫文件,如需詳細資訊:
    172108HOWTO: 疑難排解 「 找不到成員 」,0x80020003 錯誤
  2. 我的程式完成之後,我要自動化應用程式會停留在記憶體。目前所發生?

    最可能,這是因為您忘記釋放取得的介面,您將需要追蹤它。以下是一些一般建議並事項,以尋找:

    • 如果您使用 # import,則很可能是您可能執行到其中一個參考計數的 Bug 與其相關聯。通常時間 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)。請參閱下列微軟知識庫文件,逐步範例:
    184663HOWTO: 內嵌及自動化與 MFC 的 Microsoft Excel 工作表
  5. 如何存取我的文件屬性在 Office 文件中?

    文件屬性都可存取 「 自動化 」,或直接透過 IPropertyStorage。下列 「 Microsoft 知識庫 」 文件示範每一種方法:
    179494HOWTO: 使用自動化來擷取內建文件屬性
    186898HOWTO: 讀取直接與 VC + + 的複合文件屬性
coledispatchdriver colesafearray colevariant _com_ptr_t _com_variant_t IPropertySetStorage

警告:本文為自動翻譯

內容

文章識別碼:196776 - 最後檢閱時間:03/13/2008 20:13:39 - 修訂: 7.0

Microsoft Visual C++ 2008 Express Edition, Microsoft Project 2000 Standard Edition, Microsoft Excel 2000 Standard Edition, Microsoft Visual C++ 4.0 Standard Edition, Microsoft Visual C++ 5.0 Enterprise Edition, Microsoft Visual C++ 6.0 Enterprise Edition, Microsoft Visual C++ 5.0 Professional Edition, Microsoft Visual C++ 6.0 Professional Edition, Microsoft Visual C++, 32-bit Learning Edition 6.0, Microsoft Access 97 Standard Edition, Microsoft Excel 97 Standard Edition, Microsoft PowerPoint 97 Standard Edition, Microsoft Outlook 97 Standard Edition, Microsoft Word 97 Standard Edition, Microsoft Access 2000 Standard Edition, Microsoft PowerPoint 2000 Standard Edition, Microsoft Outlook 2000, Microsoft Word 2000 Standard Edition, Microsoft Access 2002 Standard Edition, Microsoft Excel 2002 Standard Edition, Microsoft PowerPoint 2002 Standard Edition, Microsoft Word 2002 Standard Edition, Microsoft Outlook 2002 Standard Edition

  • kbmt kbsweptvs2008 kbautomation kbfaq KB196776 KbMtzh
意見反應