Comment faire pour créer un complément COM Office 2000 dans Visual Basic

Traductions disponibles Traductions disponibles
Numéro d'article: 238228 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Microsoft Office 2000 et versions ultérieures prennent en charge une nouvelle architecture de conception uniforme pour créer les macros complémentaires d'application en vue d'améliorer et de contrôler les applications Office. Il s'agit des compléments COM. Cet article montre comment construire un complément COM à l'aide de Visual Basic.

Plus d'informations

Un complément COM est un serveur COM en cours d'exécution (une DLL ActiveX) qui implémente l'interface IDTExensibility2 comme indiqué dans la Bibliothèque de types du concepteur de macros complémentaires de Microsoft (Msaddndr.dll). Tous les compléments COM héritent de cette interface et doivent implémenter chacune de ses cinq méthodes.

OnConnection

L'événement OnConnection est déclenché dès que le complément COM est connecté. La macro complémentaire peut être connectée au démarrage, par l'utilisateur final, ou par le biais de l'automation. Si OnConnection est renvoyé correctement, la macro complémentaire est dite chargée. Si un message d'erreur est renvoyé, l'application hôte renvoie immédiatement sa référence à la macro complémentaire et l'objet est supprimé.

OnConnection prend les quatre paramètres suivants :
  • Application - Une référence à l'objet d'application hôte.
  • ConnectMode - Une constante qui spécifie la façon dont a été connectée la macro complémentaire.
    • ext_cm_AfterStartup - Démarré par l'utilisateur final à partir de la boîte de dialogue des compléments COM.
    • ext_cm_CommandLine - Connectée à partir de la ligne de commande. (Ne s'applique pas à la création de compléments COM pour les applications Office).
    • ext_cm_External - Connectée par une application externe par le biais de l'automation. (Ne s'applique pas à la création de compléments COM pour les applications Office).
    • ext_cm_Startup - Démarrée par l'hôte au démarrage de l'application. (Ce comportement est contrôlé par un paramètre dans le Registre.)
  • AddInInst - Une référence à l'objet COMAddIn qui se réfère à cette macro complémentaire dans la collection COMAddIns pour l'application hôte.
  • Custom - Une gamme de variantes pouvant contenir les données définies par l'utilisateur.

OnDisconnection

L'événement OnDisconnection se déclenche quand le complément COM est déconnecté et juste avant qu'il se décharge de la mémoire. La macro complémentaire devrait effectuer tout nettoyage des ressources dans cet événement et restaurer tout changement apporté à l'application hôte.

OnDisconnection prend les deux paramètres suivants :
  • RemoveMode - Une constante qui spécifie la façon dont a été déconnectée la macro complémentaire.
    • ext_dm_HostShutdown - Déconnectée lorsque l'application hôte a été fermée.
    • ext_dm_UserClosed - Déconnectée par l'utilisateur final ou un contrôleur Automation.
  • Custom - Une gamme des variantes pouvant contenir les données définies par l'utilisateur.

OnAddInsUpdate

L'événement OnAddInsUpdate se déclenche lorsque le jeu de compléments COM enregistré change. En d'autres termes, toutes les fois qu'un complément COM est installé ou supprimé de l'application hôte, cet événement se déclenche.

OnStartupComplete et OnBeginShutdown

Les méthodes OnStartupComplete et OnBeginShutdown sont toutes deux appelées lorsque l'application hôte s'arrête ou entre dans un état où l'interaction utilisateur doit être évitée car l'application est en cours de chargement ou de déchargement via la mémoire. OnStartupComplete n'est appelée que si votre macro complémentaire a été connectée pendant le démarrage et OnBeginShutdown n'est appelée que si votre macro complémentaire a été déconnectée par l'hôte lors de la fermeture.

L'interface utilisateur pour l'application hôte étant entièrement active lorsque ces événements se déclenchent, ils peuvent représenter l'unique moyen d'exécuter certaines opérations qui, sans cela, seraient impossibles à partir d'OnConnection ou d'OnDisconnection.

Enregistrement d'un complément COM

Outre l'enregistrement COM normal, le complément COM doit s'enregistrer auprès de chaque application Office dans laquelle il s'exécute. Pour s'enregistrer auprès d'une application particulière, le complément doit créer une sous-clé, en se servant de son ProgID comme nom pour la clé, sous l'emplacement suivant :
HKEY_CURRENT_USER\Software\Microsoft\Office\<OfficeApp>\Addins\<ProgID>
Le complément peut fournir des valeurs à cet emplacement de clé pour un nom d'affichage convivial et une description complète. En outre, le complément doit spécifier son comportement de charge voulu à l'aide d'une valeur DWORD nommée "LoadBehavior". Cette valeur détermine la façon dont le complément est chargé par l'application hôte et il est composé d'une combinaison des valeurs suivantes :
  • 0 = Disconnect - N'est pas chargé.
  • 1 = Connected - Est chargé.
  • 2 = Bootload - Charge au démarrage de l'application.
  • 8 = DemandLoad - Ne charge que lorsque cela est demandé par l'utilisateur.
  • 16 = ConnectFirstTime - Ne charge qu'une fois (au prochain démarrage).
La valeur généralement spécifiée est 0x03 (Connected | Bootload).

Les compléments qui implémentent IDTExtensibility2 devraient également spécifier une valeur DWORD nommée "CommandLineSafe" pour indiquer s'ils sont sûrs pour des opérations qui ne prennent pas en charge une interface utilisateur. Une valeur de 0x00 correspond à Faux, 0x01 signifie Vrai.

Création d'un complément COM

Vous pouvez créer un complément COM selon l'une des trois méthodes mentionnées ci-après :

Créer un complément COM en utilisant le modèle de complément Com

Si vous avez Microsoft Office 2000 Developer ou Microsoft Office XP Developer et Visual Basic 6.0, la façon la plus facile de générer un complément COM consiste à utiliser le modèle de complément COM .vbp. Ce projet se trouve dans le sous-dossier ODETools\V9\Samples\OPG\Samples\CH11\VB_COM_AddIn sur le CD-ROM de Office 2000 Developer. Copiez les fichiers dans ce dossier vers le dossier Template\Projects de Visual Basic 6.0, qui est en général C:\Program Files\Microsoft Visual Studio\VB98\Template\Projects. Copier ce projet modèle dans cet emplacement assurera que le modèle apparaît dans la boîte de dialogue du nouveau projet Visual Basic 6.0. Consultez le chapitre 11 du Guide du programmeur Visual Basic de Microsoft Office 2000 pour plus d'informations sur ce modèle et sur la création de compléments COM.

Créer un complément COM en utilisant le concepteur de complément de Visual Basic 6

Si vous venez seulement d'installer Microsoft Visual Basic 6.0 et que vous souhaitez utiliser un wrapper de sorte que vous n'ayez pas besoin d'implémenter directement IDTExtensibility2, vous pouvez utiliser le même concepteur ce complément que vous utiliseriez pour générer un complément VB6. Procédez comme suit pour créer un tel complément pour Microsoft Excel 2000 ou 2002 :
  1. Démarrez Microsoft Visual Basic 6.0 et sélectionnez Addin comme type de projet. Cela devrait ajouter une classe de concepteur projet (Connect) et un formulaire (frmAddin).
  2. Affichez l'objet du Concepteur pour Connect et sélectionnez Microsoft Excel à partir de la liste déroulante Application.
  3. Dans la liste déroulante Comportement initial, sélectionner Startup.
  4. Supprimer frmAddin du projet.
  5. À partir de la fenêtre Projet, cliquez avec le bouton droit sur l'élément Connect et sélectionnez Code.
  6. Supprimer tout le code dans la fenêtre de code du concepteur. Ce code fonctionne pour les compléments VB mais pas pour les compléments Office.
  7. Ajoutez le code suivant au concepteur :
       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. Enregistrez le projet et créez MyAddin.dll. Le concepteur va enregistrer le complément pour vous.
  9. Ouvrez Microsoft Excel et vous remarquerez un message lors du chargement et du déchargement du complément. Sur la barre d'outils standard, vous allez avoir un nouveau bouton nommé My Custom Button que notre complément gérera lorsqu'il sera sélectionné.

Créer un complément COM en utilisant Implements

Vous pouvez créer un complément COM à l'aide de Microsoft Visual Basic 5.0 et du mot clé Implements pour implémenter directement l'interface IDTExtensibility2. Cette méthode est toutefois moins facile. Le seul inconvénient de cette approche est l'enregistrement. Comme Microsoft Visual Basic ne sait pas comment ajouter les clés nécessaires pour enregistrer le complément avec Office, vous allez avoir besoin de faire cela séparément (dans un utilitaire de configuration personnalisé, ou en utilisant un script REG).

Toutefois, l'avantage d'utiliser Implements est que c'est plus direct et plus efficace que l'utilisation du concepteur, et cela nous permet de créer un objet COM simple qui peut fonctionner dans de multiples applications Office (au lieu de créer un objet Connect pour chaque application dans laquelle nous voulons travailler).

Voici la procédure à suivre pour écrire un complément à l'aide de Implements :
  1. Ouvrez Visual Basic et créez un nouveau projet DLL ActiveX. Nommez le projet MyCOMAddin, et nommez la classe publique Connexion.
  2. À partir de la boîte de dialogue Références (Projet | Références), ajoutez une référence à Microsoft Office 9.0 Object Library (ou 10.0 pour Office XP) et à la Bibliothèque de types Microsoft Add-In Designer. Si vous ne pouvez pas trouver Add-In Designer dans la liste des Références, vous devriez chercher Msaddndr.dll ou Msaddndr.tlb, qui sont en général situé dans le dossier "C:\Program Files\Common Files\Designer".
  3. Dans la fenêtre Code pour Connexion, ajoutez ceci :
       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. Enregistrez le projet et créez MyCOMAddin.dll. Toutefois, avant que votre complément ne fonctionne, vous devez l'associer à chaque application Office dans laquelle vous voulez qu'il fonctionne. Dans la réalité, un utilitaire de configuration peut faire cela lorsque la DLL est installée. Pour cet exemple, vous allez appeler directement une fonction d'enregistrement à partir de l'IDE de Visual Basic.
  5. Ajoutez un nouveau module au projet. Dans le code pour Module1, ajoutez ceci :
       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. À partir de la fenêtre Exécution (Affichage | Fenêtre exécution), tapez RegisterAll, puis appuyez sur ENTRÉE. Cela va enregistrer le complément avec toutes les applications Office prises en charge (Access, Excel, FrontPage, Outlook, PowerPoint et Word).
  7. Ouvrez chacune des applications Office répertoriées ci-dessus. Notez le message au démarrage et à la fermeture, ainsi que le bouton personnalisé ajouté à la barre d'outils standard.
  8. Lorsque vous voulez enregistrer le complément, tapez RegisterAll dans la fenêtre d'exécution Visual Basic puis appuyez sur ENTRÉE.

Références

"Guide du programmeur Visual Basic Microsoft Office 2000", Chapitre 11. Compléments, Modèles, Assistants et Bibliothèques.

Pour plus d'informations sur l'écriture des compléments COM, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la Base de connaissances Microsoft :
230689 EXEMPLE : Complément COM Office 2000 Comaddin.exe écrit en Visual C++
190253 Les concepteurs Visual Basic 6.0 ne fonctionnent pas dans Visual Basic 5.0
Pour plus d'informations sur le développement de solutions basées sur le Web pour Microsoft Internet Explorer, reportez-vous au site Web de Microsoft à l'adresse suivante (en anglais) :
http://msdn.microsoft.com/ie/
Remarque Lorsque vous ajoutez un élément de menu à Office Word à partir d'un complément de Visual Basic COM en appliquant les étapes qui sont répertoriées dans cet article ou une méthode semblable, l'élément de menu ne fonctionne pas comme prévu. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft.
313948 Word perd la référence aux éléments de menu d'objet COM (CommandBarControl)

Propriétés

Numéro d'article: 238228 - Dernière mise à jour: mercredi 26 octobre 2005 - Version: 6.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Excel 2000 Standard
  • Microsoft Office XP Developer
  • Microsoft Office 2000 Developer
  • Microsoft Access 2002
  • Microsoft Access 2000 Standard Edition
  • Microsoft Excel 2002
  • Microsoft FrontPage 2002 Standard
  • Microsoft FrontPage 2000 Standard
  • Microsoft Outlook 2002 Standard
  • Microsoft Outlook 2000 Standard
  • Microsoft PowerPoint 2002 Standard
  • Microsoft PowerPoint 2000 Standard
  • Microsoft Word 2002 Standard Edition
  • Microsoft Word 2000 Standard Edition
  • Microsoft Visual Basic 5.0 Édition professionnelle
  • Microsoft Visual Basic 6.0 Édition professionnelle
  • Microsoft Visual Basic 5.0 Édition Entreprise
  • Microsoft Visual Basic 6.0 Édition Entreprise
Mots-clés : 
kbautomation kbhowto KB238228
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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