如何建置一個 Office 2000 COM 增益集在 Visual Basic 中

文章翻譯 文章翻譯
文章編號: 238228 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

Microsoft Office 2000 和一個新的更新版本支援統一設計架構建置應用程式增益集來加強及控制 Office 應用程式。這些增益集稱為 COM 增益集。本文將示範如何建置一個 COM 增益集使用 Visual Basic。

其他相關資訊

COM 增益集是 inprocess COM 伺服器 (ActiveX DLL) 實作 IDTExensibility2 介面,在 Microsoft 增益功能設計工具類型程式庫 (Msaddndr.dll) 中所述。所有 COM 增益集從這個介面繼承和必須實作每五個的方法。

OnConnection

連線 COM 增益集時,就會引發 OnConnection 事件。增益集可能連接上啟動,結束] 使用者,或透過自動化。如果順利傳回 OnConnection,增益集是稱為載入。如果傳回錯誤,則主應用程式立即釋放其增益集的參考並終結物件。

OnConnection 採用下列四個參數:
  • 應用程式-主機應用程式物件的參考。
  • ConnectMode-指定增益集連接方式的常數。
    • ext_cm_AfterStartup-從 [COM 增益集] 對話方塊的使用者入門。
    • ext_cm_CommandLine-已連線從命令列。(並不適用於建置 COM 增益集的 Office 應用程式)。
    • ext_cm_External-透過自動化外部應用程式連線。(並不適用於建置 COM 增益集的 Office 應用程式)。
    • ext_cm_Startup-由主應用程式在應用程式啟動時已啟動。(這種行為是由登錄中設定所控制)。
  • AddInInst-A COMAddIn 物件參照到這個增益集 COMAddIns 集合為主機應用程式中的參照。
  • 自訂-一個陣列變數可以保留使用者定義的資料。

OnDisconnection

當 COM 增益集已中斷連線並只在它從記憶體卸載之前,就會引發 OnDisconnection 事件。增益集應該在這個事件中執行任何清理資源,並還原對主應用程式所做的任何變更。

OnDisconnection 採用下列兩個參數:
  • RemoveMode-指定如何增益集已中斷連線的常數。
    • ext_dm_HostShutdown-已中斷連線,主機應用程式關閉時。
    • ext_dm_UserClosed-由一般使用者或自動化控制站已中斷連線。
  • 自訂-一個陣列變數可以保留使用者定義的資料。

OnAddInsUpdate

已註冊 COM 增益集的集合變更時,就會引發 OnAddInsUpdate 事件。亦即每次 COM 增益集是安裝或移除從主應用程式,會引發這個事件。

OnStartupComplete 和 OnBeginShutdown

當主應用程式已離開或正在進入的狀態,其中使用者互動應予以避免因為應用程式忙碌中載入或卸載本身從記憶體時,會呼叫 OnStartupComplete 和 OnBeginShutdown 方法。如果增益集已連接啟動,期間,而如果您的增益集已中斷連線由主應用程式在關機期間,只被呼叫 OnBeginShutdown,只會呼叫 OnStartupComplete。

因為這些事件引發時,主機應用程式使用者介面是完全使用中,它們可能會執行某些動作否則就無法從 OnConnection 和 OnDisconnection 使用唯一的方法。

正在註冊 COM 增益集

除了標準的 COM 登錄 COM 增益集需要與它執行每個 Office 應用程式登錄自己。若要以特定的應用程式註冊本身,增益集應該建立使用其 ProgID 當作機碼下下列位置的名稱為子機碼:
HKEY_CURRENT_USER\Software\Microsoft\Office\<OfficeApp>\Addins\<ProgID>
的增益集可以提供易記顯示名稱和完整描述這個索引鍵位置的值。在另外增益集應該指定其您想要的載入行為使用 DWORD 值,稱為 「 LoadBehavior]。這個值會決定如何增益集載入在主應用程式,而且由下列值的組合所組成:
  • 0 = 中斷連線-不是已載入。
  • 1 = 已連線-是載入。
  • 2 = bootload-應用程式啟動上的負載。
  • 8 = demandLoad-只在使用者需要時才載入。
  • 16 = ConnectFirstTime-載入一次 (在下一個啟動)。
一般指定的值是 0x03 (已連線 | Bootload)。

增益集,實作 IDTExtensibility2 也應該指定一個 DWORD 值稱為"CommandLineSafe"來指示它們是否安全的作業,並不支援使用者介面。值為 0x00 False,表示 0x01 為 True。

建置 COM 增益集

您可以建置一個 COM 增益集以下提及的三種方式之一:

藉由使用 COM 增益集範本建置 COM 增益集

如果您有 Microsoft Office 2000 程式開發人員] 或 [Microsoft Office XP 程式開發人員] 及 [Visual Basic 6.0 中,建置 COM 增益集最簡單的方法,就是使用 COM 新增 in.vbp 範本。這個專案] 位於 [Office 2000 開發 o 人 h 員 ? 工 u 具 ? CD 上的 [ODETools\V9\Samples\OPG\Samples\CH11\VB_COM_AddIn] 子資料夾。這個資料夾中的檔案複製到通常是 C:\Program Files\Microsoft Visual Studio\VB98\Template\Projects 的 [Visual Basic 6.0 Template\Projects] 資料夾。將範本專案複製到這個位置,可確保範本出現在 [Visual Basic 6.0 中新增專案] 對話方塊。請參閱第 11 章這個範本及建立 COM 增益集的相關資訊的 [Microsoft Office 2000 Visual Basic 程式設計人員指南 》。

使用 Visual Basic 6 增益集設計工具來建置 COM 增益集

如果您只是 Microsoft Visual Basic 6.0 安裝,而且要使用的包裝函式,因此您不需要直接實作 IDTExtensibility2,您可以使用相同增益功能設計師會用來建置 VB6 新增 In.依照這些步驟來建置這類的增益集的 Microsoft Excel 2000 或 2002年:
  1. 啟動 Microsoft Visual Basic 6.0 中,選取 增益功能 做為專案類型。這應該將設計工具類別加入至專案 (連線) 和表單 (frmAddin)。
  2. 開啟 設計工具] 視窗的連線,然後從 應用程式] 下拉式清單中選取 [Microsoft Excel
  3. 初始載入行為] 下拉式清單中,選取 [啟動]。
  4. 從專案移除 frmAddin
  5. 從 [專案] 視窗用滑鼠右鍵按一下 連線 項目,然後選取 [檢視程式碼]。
  6. 在設計工具的程式碼視窗中移除所有程式碼。這個程式碼適用於 VB 增益集,但不是 Office 增益集。
  7. 將下列程式碼加入至設計工具:
       Option Explicit
    
       Dim oXL As Object
       Dim WithEvents MyButton As Office.CommandBarButton
    
       Private Sub AddinInstance_OnConnection(ByVal Application As Object, _
        ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
        ByVal AddInInst As Object, custom() As Variant)
          On Error Resume Next
          MsgBox "My Addin started in " & Application.Name
       
          Set oXL = Application
       
          Set MyButton = oXL.CommandBars("Standard").Controls.Add(1)
             With MyButton
                .Caption = "My Custom Button"
                .Style = msoButtonCaption
    
              ' The following items are optional, but recommended. 
              ' The Tag property lets you quickly find the control 
              ' and helps MSO keep track of it when there is more than
              ' one application window visible. The property is required
              ' by some Office applications and should be provided.
    
                .Tag = "My Custom Button"
     
              ' The OnAction property is optional but recommended. 
              ' It should be set to the ProgID of the add-in, such that if
              ' the add-in is not loaded when a user presses the button,
              ' MSO loads the add-in automatically and then raises
              ' the Click event for the add-in to handle. 
    
                .OnAction = "!<" & AddInInst.ProgId & ">"
    
                .Visible = True
             End With
       
       End Sub
    
       Private Sub AddinInstance_OnDisconnection(ByVal RemoveMode As _
          AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)
          On Error Resume Next
          MsgBox "My Addin was disconnected by " & _
             IIf(RemoveMode = ext_dm_HostShutdown, _
             "Excel shutdown.", "end user.")
          
          MyButton.Delete
          Set MyButton = Nothing
          Set oXL = Nothing
        End Sub
    
       Private Sub MyButton_Click(ByVal Ctrl As Office.CommandBarButton, _
         CancelDefault As Boolean)
          MsgBox "Our CommandBar button was pressed!"
       End Sub
  8. 儲存專案,並建立 MyAddin.dll。設計工具會為您註冊增益集。
  9. 開啟 Microsoft Excel 和您將訊息方塊時注意到增益集載入及卸載。在 [標準] 工具列上,您必須標示為 [我的自訂按鈕 我們增益集將處理時選取新的按鈕。

藉由實作建立 COM 增益集

雖然不是以簡單,您可以建立 COM 增益集使用 Microsoft Visual Basic 5.0 和 Implements 關鍵字來直接實作 IDTExtensibility2 介面。這個方法唯一的缺點是註冊。因為 Microsoft Visual Basic 並不知道如何新增以 Office 註冊增益集所需的按鍵,您必須要執行這項操作分別 (在自訂安裝公用程式或使用 REG 指令碼)。

不過,使用 Implements 優點是它是更直接和效率比使用設計工具,而且它允許我們建立一個單一的 COM 物件,它可以處理在多個 Office 應用程式中 (而非建立個別的連線物件,我們要在其中進行工作的每一個應用程式)。

撰寫一個新增的-在使用 Implements 步驟如下:
  1. 開啟 Visual Basic 並建立新的 ActiveX DLL 專案。專案 MyCOMAddin,名稱,並命名為公用類別 連線
  2. 從 [參考] 對話方塊 (專案 | 參考),將參考加入至 [Microsoft Office 9.0 (或 Office XP 的 10.0) 物件程式庫和 Microsoft 增益功能設計工具 」 型別程式庫。如果您在 [參考] 清單中找不到 [增益功能設計工具 」,您應該針對 Msaddndr.dll 或通常位於 C:\Program Files\Common Files\Designer 資料夾的 Msaddndr.tlb 瀏覽。
  3. 在為連線的 [程式碼] 視窗中將下列程式碼加入:
       Option Explicit
       Implements IDTExtensibility2
    
       Dim oHostApp As Object
       Dim WithEvents MyButton As Office.CommandBarButton
    
      Private Sub IDTExtensibility2_OnConnection(ByVal Application As Object, _
         ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
    
         ByVal AddInInst As Object, custom() As Variant)
      
          On Error Resume Next
        ' Set a reference to the host application...
          Set oHostApp = Application
       
        ' If you aren't in startup, then manually call OnStartupComplete...
          If (ConnectMode <> ext_cm_Startup) Then _
             Call IDTExtensibility2_OnStartupComplete(custom)
          
       End Sub
    
       Private Sub IDTExtensibility2_OnStartupComplete(custom() As Variant)
          Dim oCommandBars As Office.CommandBars
          Dim oStandardBar As Office.CommandBar
       
          On Error Resume Next
        ' Set up a custom button on the "Standard" commandbar...
          Set oCommandBars = oHostApp.CommandBars
          If oCommandBars Is Nothing Then
           ' Outlook has the CommandBars collection on the Explorer object
             Set oCommandBars = oHostApp.ActiveExplorer.CommandBars
          End If
       
          Set oStandardBar = oCommandBars.Item("Standard")
          If oStandardBar Is Nothing Then
           ' Access names it's main toolbar Database
    
             Set oStandardBar = oCommandBars.Item("Database")
          End If
       
        ' In case the button was not deleted, use the exiting one...
          Set MyButton = oStandardBar.Controls.Item("My Custom Button")
             If MyButton Is Nothing Then
    
                Set MyButton = oStandardBar.Controls.Add(1)
                With MyButton
                   .Caption = "My Custom Button"
                   .Style = msoButtonCaption
     
              ' The following items are optional, but recommended. 
              ' The Tag property lets you quickly find the control 
              ' and helps MSO keep track of it when there is more than
              ' one application window visible. The property is required
              ' by some Office applications and should be provided.
    
                .Tag = "My Custom Button"
     
              ' The OnAction property is optional but recommended. 
              ' It should be set to the ProgID of the add-in, such that if
              ' the add-in is not loaded when a user presses the button,
              ' MSO loads the add-in automatically and then raises
              ' the Click event for the add-in to handle. 
    
                   .OnAction = "!<MyCOMAddin.Connect>"
    
                   .Visible = True
                End With
             End If
     
        ' Display a simple message to know which application you started in...
          MsgBox "Started in " & oHostApp.Name & "."
    
          Set oStandardBar = Nothing
          Set oCommandBars = Nothing
       End Sub
    
       Private Sub IDTExtensibility2_OnDisconnection(ByVal RemoveMode As _
         AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)
    
          On Error Resume Next
          If RemoveMode <> ext_dm_HostShutdown Then _
             Call IDTExtensibility2_OnBeginShutdown(custom)
          
          Set oHostApp = Nothing
    
       End Sub
    
       Private Sub IDTExtensibility2_OnBeginShutdown(custom() As Variant)
          On Error Resume Next
        ' Notify the user you are shutting down, and delete the button...
          MsgBox "Our custom Add-In is unloading."
          MyButton.Delete
          Set MyButton = Nothing
       End Sub
    
       Private Sub MyButton_Click(ByVal Ctrl As Office.CommandBarButton,    CancelDefault As Boolean)
          MsgBox "Our CommandBar button was pressed!"
       End Sub
    
       Private Sub IDTExtensibility2_OnAddInsUpdate(custom() As Variant)
          'You do nothing if this is called, but you need to
          'add a comment so Visual Basic properly implements the function...
       End Sub
  4. 儲存專案,並建立 MyCOMAddin.dll。但是,您的增益集將作用之前您必須將它與您想要在執行每個 Office 應用程式產生關聯。在現實世界裡安裝公用程式時,可以進行此操作已安裝該 DLL。在這個範例您將會直接從 Visual Basic IDE 呼叫登錄函式。
  5. 將新模組加入至專案。Module1 中之程式碼,將下列程式碼加入:
       Option Explicit
    
       Private Declare Function RegCreateKeyEx Lib "advapi32.dll" _
       Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
       ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As _
       Long, ByVal samDesired As Long, ByVal lpSecurityAttributes As Long, _
       phkResult As Long, lpdwDisposition As Long) As Long
       
       Private Declare Function RegSetValueEx Lib "advapi32.dll" _
       Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As _
       String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, _
       ByVal cbData As Long) As Long
       
       Private Declare Function RegDeleteKey Lib "advapi32.dll" _
       Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) _
       As Long
       
       Private Declare Function RegCloseKey Lib "advapi32.dll" _
       (ByVal hKey As Long) As Long
    
       Private Const HKEY_CURRENT_USER = &H80000001
       Private Const KEY_ALL_ACCESS = &H1F0037
       Private Const REG_CREATED_NEW_KEY = &H1
       Private Const REG_SZ = 1
       Private Const REG_DWORD = 4
    
       'These are the settings for your Add-in...
       Private Const PROGID As String = "MyCOMAddin.Connect"
       Private Const DESCRIPTION As String = "My VB5/6 COM Add-In Sample"
       Private Const LOADBEHAVIOR As Long = 3
       Private Const SAFEFORCOMMANDLINE As Long = 0
    
    
       Public Sub RegisterAll()
          RegisterOfficeAddin "Access"
          RegisterOfficeAddin "Excel"
          RegisterOfficeAddin "FrontPage"
          RegisterOfficeAddin "Outlook"
          RegisterOfficeAddin "PowerPoint"
          RegisterOfficeAddin "Word"
       End Sub
    
       Public Sub UnregisterAll()
          UnRegisterOfficeAddin "Access"
          UnRegisterOfficeAddin "Excel"
          UnRegisterOfficeAddin "FrontPage"
          UnRegisterOfficeAddin "Outlook"
          UnRegisterOfficeAddin "PowerPoint"
          UnRegisterOfficeAddin "Word"
       End Sub
    
       Public Sub RegisterOfficeAddin(sTargetApp As String)
          Dim sRegKey As String
          Dim nRet As Long, dwTmp As Long
          Dim hKey As Long
       
          sRegKey = "Software\Microsoft\Office\" & sTargetApp _
             & "\Addins\" & PROGID
       
          nRet = RegCreateKeyEx(HKEY_CURRENT_USER, sRegKey, 0, _
             vbNullString, 0, KEY_ALL_ACCESS, 0, hKey, dwTmp)
          
          If nRet = 0 Then
             If dwTmp = REG_CREATED_NEW_KEY Then
                Call RegSetValueEx(hKey, "FriendlyName", 0, _
                   REG_SZ, ByVal PROGID, Len(PROGID))
                Call RegSetValueEx(hKey, "Description", 0, _
                   REG_SZ, ByVal DESCRIPTION, Len(DESCRIPTION))
                Call RegSetValueEx(hKey, "LoadBehavior", 0, _
                   REG_DWORD, LOADBEHAVIOR, 4)
                Call RegSetValueEx(hKey, "CommandLineSafe", 0, _
                   REG_DWORD, SAFEFORCOMMANDLINE, 4)
             End If
             Call RegCloseKey(hKey)
          End If
       
       End Sub
    
       Public Sub UnRegisterOfficeAddin(sTargetApp As String)
          Dim sRegKey As String
          sRegKey = "Software\Microsoft\Office\" & sTargetApp _
             & "\Addins\" & PROGID
       
           Call RegDeleteKey(HKEY_CURRENT_USER, sRegKey)
       
       End Sub
  6. 從 [即時運算] 視窗 (檢視 | 即時運算] 視窗)、 鍵入 RegisterAll,並按下 ENTER。這將會以所有 Office 應用程式支援 (存取、 Excel、 FrontPage、 Outlook、 PowerPoint,與 Word) 註冊增益集。
  7. 開啟 Office 應用程式的任何列之前。請注意啟動和關機和自訂的按鈕新增至標準] 工具列上的 [訊息] 方塊。
  8. 當想要移除註冊增益集時, 在 Visual Basic 即時運算視窗中鍵入 UnregisterAll,並按下 ENTER。

?考

第 11 章 < Microsoft Office 2000 Visual Basic 程式設計人員指南 」。增益集、 範本、 精靈和程式庫。

如需有關撰寫 COM 增益集的資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中 「 文件:
230689Office 2000 COM 增益集以 Visual C++ 撰寫的範例: comaddin.exe
190253VB6 設計工具無法在 VB5 中運作
如需有關 Microsoft Internet Explorer 開發 Web 為基礎的解決方案的詳細資訊,請造訪下列 Microsoft 網站:
http://msdn.microsoft.com/ie/
附註當您為功能表項目至 Office Word 將來自新增 Visual Basic COM 增益集使用本文所列的步驟,或使用類似的方法時,功能表項目無法如預期般運作。如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
313948Word 將會遺失參考的 COM 物件] 功能表項目 (CommandBarControl)

屬性

文章編號: 238228 - 上次校閱: 2007年1月24日 - 版次: 6.2
這篇文章中的資訊適用於:
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Office XP Developer Edition
  • Microsoft Office 2000 Developer Edition
  • Microsoft Access 2002 Standard Edition
  • Microsoft Access 2000 Standard Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft FrontPage 2002 Standard Edition
  • Microsoft FrontPage 2000 Standard Edition
  • Microsoft Outlook 2002 Standard Edition
  • Microsoft Outlook 2000
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft PowerPoint 2000 Standard Edition
  • Microsoft Word 2002 Standard Edition
  • Microsoft Word 2000 Standard Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
關鍵字:?
kbmt kbautomation kbhowto KB238228 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:238228
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com