如何构建一个 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-对此加载项在宿主应用程序对 COMAddIns 集合中引用的 COMAddIn 对象的引用。
  • 自定义-变型可包含用户定义的数据的数组。

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 开发 CD 上 ODETools\V9\Samples\OPG\Samples\CH11\VB_COM_AddIn 子文件夹中。将此文件夹中的文件复制到通常是 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. 打开 Excel,您会注意到一个消息框,添加的是加载和卸载时。在标准工具栏上,则必须标记为 我的自定义按钮 我们接程序将处理时选择新的按钮。

通过使用实现生成 COM 加载项

而不是简单,您可以创建一个 COM 加载项使用 Microsoft Visual Basic 5.0 和 Implements 关键字来直接实现 IDTExtensibility2 接口。在这种方法的唯一缺点是注册。由于 Microsoft Visual Basic 不了解如何添加该加载项注册与 Office 一起所需的项,您将需要执行此操作分别 (在一个自定义安装程序实用程序或使用 REG 脚本)。

但是,使用 Implements 优点是它是更直接和比使用设计器,有效,它使得我们可以创建多个 Office 应用程序 (不是创建一个单独的连接对象为我们想要在每个应用程序) 中的单个 COM 对象,该对象可以正常工作。

以下是编写一个添加的-在使用 Implements 步骤:
  1. 打开 Visual Basic 并创建一个新的 ActiveX DLL 项目。命名该项目 MyCOMAddin,并命名公共类 连接
  2. 引用 对话框 (项目 | 引用),添加对 Microsoft Office 9.0 (或 Office xp 10.0) 对象库和加载项设计器 Microsoft 类型库的引用。如果找不加载项设计器在引用列表中您应该浏览 Msaddndr.dll 或 Msaddndr.tlb,通常位于"是 Files\Common Files\Designer"文件夹中。
  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. 向项目添加一个新的模块。在代码中的模块 1,添加以下:
       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 知识库中相应的文章:
230689示例: Comaddin.exe Office 2000 COM 加载项在 Visual c + + 中写入
190253在 $ VB5 中不起作用 VB6 设计器
有关为 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 标准版
  • Microsoft Office XP Developer Edition
  • Microsoft Office 2000 Developer Edition
  • Microsoft Access 2002 标准版
  • Microsoft Access 2000 标准版
  • Microsoft Excel 2002 标准版
  • Microsoft FrontPage 2002 标准版
  • Microsoft FrontPage 2000 标准版
  • Microsoft Outlook 2002 标准版
  • Microsoft Outlook 2000
  • Microsoft PowerPoint 2002 标准版
  • Microsoft PowerPoint 2000 标准版
  • Microsoft Word 2002 标准版
  • Microsoft Word 2000 标准版
  • Microsoft Visual Basic 5.0 专业版
  • Microsoft Visual Basic 6.0 专业版
  • Microsoft Visual Basic 5.0 企业版
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
关键字:?
kbmt kbautomation kbhowto KB238228 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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