Cómo crear un complemento COM de Office 2000 en Visual Basic

Seleccione idioma Seleccione idioma
Id. de artículo: 238228 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Microsoft Office 2000 y versiones posteriores admiten una nueva uniforme arquitectura de diseño para crear complementos de aplicación para mejorar y controlar las aplicaciones de Office. Estos complementos se denominan complementos. En este artículo demostrará cómo crear un complemento COM utilizando Visual Basic.

Más información

Un complemento COM es un servidor de COM inprocess (una DLL de ActiveX) que implementa la interfaz IDTExensibility2 tal como se describe en la de diseñador biblioteca de tipos Microsoft (Msaddndr.dll). Todos los complementos COM heredan de esta interfaz y deben implementar cada uno de sus cinco métodos.

OnConnection

El evento OnConnection se desencadena siempre que el complemento está conectado. El complemento puede conectarse en el inicio, por el usuario final, o a través de automatización. Si OnConnection devuelve correctamente, el complemento se dice que se va a cargar. Si se devuelve un error, la aplicación host libera su referencia para el complemento inmediatamente y se destruye el objeto.

OnConnection toma los parámetros de cuatro siguientes:
  • Aplicación: referencia a objeto de la aplicación host.
  • ConnectMode - constante que especifica cómo se ha conectado el complemento.
    • ext_cm_AfterStartup - iniciado por el usuario final en el cuadro de diálogo Complementos COM.
    • ext_cm_CommandLine - conectado desde la línea de comandos. (No se aplica a la creación de complementos COM para las aplicaciones de Office)
    • ext_cm_External - conectados por una aplicación externa a través de automatización. (No se aplica a la creación de complementos COM para las aplicaciones de Office)
    • ext_cm_Startup - iniciado por el host al iniciarse la aplicación. (Este comportamiento se controla mediante una configuración en el registro).
  • AddInInst - una referencia al objeto COMAddIn que hace referencia a este complemento en la colección COMAddIns de la aplicación host.
  • Personalizado - matriz de Variants que puede contener datos definidos por el usuario.

OnDisconnection

El evento OnDisconnection se desencadena cuando el complemento se desconecta y justo antes de descarga de memoria. El complemento debe realizar la limpieza de recursos en este evento y restaurar los cambios realizados en la aplicación host.

OnDisconnection toma los dos parámetros siguientes:
  • RemoveMode - constante que especifica cómo se ha desconectado el complemento.
    • ext_dm_HostShutdown - desconectado cuando cierra la aplicación host.
    • ext_dm_UserClosed - desconectado por el usuario final o un controlador de automatización.
  • Personalizado - matriz de Variants que puede contener datos definidos por el usuario.

OnAddInsUpdate

El evento OnAddInsUpdate se desencadena cuando cambia el conjunto de complementos COM registrados. En otras palabras, siempre que un complemento está instalado o quitado de la aplicación host, este evento se desencadena.

OnStartupComplete y OnBeginShutdown

Se llama a métodos tanto OnStartupComplete OnBeginShutdown cuando la aplicación host ha dejado o está entrando en un estado donde debe evitarse interacción del usuario porque la aplicación está ocupada cargando o descargando propio de la memoria. OnStartupComplete sólo se llama si el complemento se ha conectado durante el inicio y OnBeginShutdown sólo se llama si el complemento se desconecta por el host durante el apagado.

Dado que la interfaz de usuario para la aplicación host es plenamente activa cuando estos eventos se desencadenan, pueden ser la única manera de realizar determinadas acciones en caso contrario, sería no está disponibles desde OnConnection y OnDisconnection.

Registrar el COM agregar-en

Además el registro COM normal, un complemento necesita registrarse a sí mismo con cada aplicación de Office en el que se ejecuta. Para registrarse con una aplicación determinada, el complemento debe crear una clave de sub, mediante su ProgID como el nombre de la clave, en la siguiente ubicación:
HKEY_CURRENT_USER\Software\Microsoft\Office\<OfficeApp>\Addins\<ProgID>
el complemento puede proporcionar valores en esta ubicación clave para un nombre descriptivo y una descripción completa. Además, el complemento debe especificar su comportamiento de carga deseada mediante un valor DWORD llamado "LoadBehavior." Este valor determina cómo el complemento se carga por la aplicación host y se compone de una combinación de los siguientes valores:
  • 0 = Desconectar - no está cargado.
  • 1 = Conectado - está cargado.
  • 2 = Bootload - cargar al inicio de la aplicación.
  • 8 = DemandLoad - carga sólo cuando se solicitan por usuario.
  • 16 = ConnectFirstTime - carga sólo una vez (en el siguiente inicio).
El valor típico especificado es 0 x 03 (conectado | bootload).

Los complementos que implementan IDTExtensibility2 también deben especificar un valor DWORD valor llamado "CommandLineSafe" para indicar si son seguros para operaciones que no admiten una interfaz de usuario. Un valor de 0 x 00 significa false, 0 x 01 es True.

Crear un complemento

Puede crear un complemento COM de las tres maneras mencionadas a continuación:

Crear un complemento con la plantilla de complemento COM

Si tiene Microsoft Office 2000 Developer o Microsoft Office XP Developer y Visual Basic 6.0, la forma más sencilla de crear un complemento COM es utilizar la plantilla de add-in.vbp COM. Este proyecto se encuentra en la subcarpeta ODETools\V9\Samples\OPG\Samples\CH11\VB_COM_AddIn en el CD de Office 2000 Developer. Copie los archivos en esta carpeta a la carpeta Template\Projects de Visual Basic 6.0, que normalmente es c:\Archivos de programa\Microsoft Visual Studio\VB98\Template\Projects. Copiar el proyecto de plantilla a esta ubicación se Asegúrese de que la plantilla aparece en el cuadro de diálogo nuevo proyecto de Visual Basic 6.0. Consulte el capítulo 11 del Microsoft Office 2000 Visual Basic manual del programador para obtener más información acerca de esta plantilla y crear complementos COM.

Generación de un complemento mediante el Diseñador de complemento de Visual Basic 6

Si tiene sólo Microsoft Visual Basic 6.0 instalado y desea utilizar un contenedor para que no sea necesario implementar IDTExtensibility2 directamente, puede utilizar el mismo de diseñador que utilizaría para generar un seguimiento de VB6 In. agregar estos pasos para generar tal un complemento de Microsoft Excel 2000 o 2002:
  1. Inicie Microsoft Visual Basic 6.0 y seleccione complemento como tipo de proyecto. Esto debe agregar una clase de diseñador al proyecto (Connect) y un formulario (frmAddin).
  2. Abra la ventana del Diseñador para conectar y seleccione Microsoft Excel en la lista desplegable de aplicación .
  3. En la lista desplegable de Comportamiento de carga inicial , seleccione Inicio .
  4. Quite frmAddin del proyecto.
  5. En la ventana proyecto , haga clic con el botón secundario en el elemento Connect y seleccione Ver código .
  6. Quite todo el código en la ventana del diseñador código. Este código funciona para complementos VB, pero no complementos de Office.
  7. Agregue el código siguiente al diseñador:
       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. Guardar el proyecto y cree el MyAddin.dll . El diseñador registrará para el complemento.
  9. Abra Microsoft Excel y observará un cuadro de mensaje cuando el complemento se carga y descarga. En la barra de herramientas estándar, tendrá un botón nuevo Mi botón personalizado que nuestro complemento controlará cuando está seleccionada.

Crear un complemento con implementa

Mientras no como simple, puede crear un complemento COM utilizando Microsoft Visual Basic 5.0 y la palabra clave Implements para implementar directamente la interfaz IDTExtensibility2. La única desventaja de este enfoque es el registro. Puesto que Microsoft Visual Basic no sabe cómo agregar las claves necesarias para registrar el complemento con Office, deberá hacerlo por separado (en un programa de instalación personalizado, o mediante una secuencia de comandos REG).

Sin embargo, la ventaja de utilizar Implements es que es más directa y eficaz que utilizar el diseñador, y nos permite crear un único objeto COM que puede trabajar en varias aplicaciones de Office (en lugar de crear un objeto Connect independiente para cada aplicación que deseamos trabajar).

Éstos son los pasos para escribir un complemento - in utilizando Implements:
  1. Abra Visual Basic y cree un nuevo proyecto DLL de ActiveX. Denomine el proyecto MyCOMAddin y nombre de la clase pública Conectar .
  2. Desde el cuadro de diálogo referencias (proyecto | referencias), agregue una referencia a la biblioteca de objetos de Microsoft Office 9.0 (o 10.0 para Office XP) y la biblioteca de tipo Microsoft Add-In Designer. Si el diseñador no puede encontrar en la lista de referencias, debe buscar Msaddndr.dll o Msaddndr.tlb, normalmente se encuentra en la carpeta "C:\Archivos de programa\Archivos Files\Designer".
  3. En la ventana código para conectar, agregue lo siguiente:
       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. Guardar el proyecto y cree el MyCOMAddin.dll . Sin embargo, antes de que el complemento funcione tiene que asociar con cada aplicación de Office que desee ejecutar en. En el mundo real, una utilidad de instalación puede hacerlo cuando se instala la DLL. En este ejemplo, llamará a una función de registro directamente desde el IDE de Visual Basic.
  5. Agregar un nuevo módulo al proyecto. En el código de Module1, agregue lo siguiente:
       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. En la ventana Inmediato (ver | ventana Inmediato), escriba RegisterAll y, a continuación, presione ENTRAR. Esto registrará el complemento con todas las aplicaciones de Office admitidas (Access, Excel, FrontPage, Outlook, PowerPoint y Word).
  7. Abrir cualquiera de las aplicaciones de Office enumeradas a antes. Observe en el botón personalizado agregado a la barra de herramientas estándar, inicio y cierre el cuadro de mensaje.
  8. Cuando desee anular el registro el complemento, escriba UnregisterAll en la ventana Inmediato de Visual Basic y, a continuación, presione ENTRAR.

Referencias

"Guía del programador de Visual Basic de Microsoft Office 2000", capítulo 11. Complementos, plantillas, asistentes y bibliotecas.

Para obtener más información sobre cómo escribir complementos COM, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
230689EJEMPLO: Comaddin.exe Office 2000 complemento COM escrito en Visual C++
190253Los diseñadores de VB6 no funcionan en VB5
Para obtener más información acerca de cómo desarrollar soluciones basadas en Web para Microsoft Internet Explorer, visite el siguiente sitio Web de Microsoft:
http://msdn.microsoft.com/ie/
Nota Cuando agrega un elemento de menú para Office Word desde un complemento COM de Visual Basic mediante los pasos que aparecen en este artículo o mediante un método similar, el elemento de menú no funciona como se esperaba. Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
313948Word pierde su referencia a un objeto COM de elemento de menú (CommandBarControl)

Propiedades

Id. de artículo: 238228 - Última revisión: miércoles, 24 de enero de 2007 - Versión: 6.2
La información de este artículo se refiere a:
  • 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
  • Microsoft Outlook 2000 Standard
  • 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
Palabras clave: 
kbmt kbautomation kbhowto KB238228 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 238228

Enviar comentarios

 

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