Comment utiliser Visual C# pour automatiser une instance en cours d’exécution d’un programme Office

Résumé

Cet article pas à pas vous montre comment créer un client Microsoft Visual C# 2005 ou Microsoft Visual C# .NET qui obtient une référence Automation à une instance en cours d’exécution d’un programme Office.

Créer une application Visual C# 2005 ou Visual C# .NET qui automatise une instance en cours d’exécution d’un programme Office

Les programmes clients qui automatisent Office peuvent créer une nouvelle instance de ce programme Office ou obtenir une référence à l’instance qui est déjà en cours d’exécution. Microsoft recommande généralement de créer une instance au lieu de l’attacher à une instance en cours d’exécution. Toutefois, dans certains scénarios, le programme client doit automatiser une instance déjà en cours d’exécution d’un programme Office. Dans ce cas, le client Automation obtient la référence à l’objet COM (Component Object Model) du serveur Automation à partir de la table d’objets en cours d’exécution (ROT).

Si le serveur Automation s’est inscrit dans la table d’objets en cours d’exécution, un client .NET peut obtenir une référence à l’instance en cours d’exécution en appelant ce qui suit :

System.Runtime.InteropServices.Marshal.GetActiveObject

- ou -

System.Runtime.InteropServices.Marshal.BindToMoniker

Exemple de code

  1. Démarrez Microsoft Visual Studio 2005 ou Microsoft Visual Studio .NET. Dans le menu Fichier, cliquez sur Nouveau, puis sur Projet. Sous Types de projets, cliquez sur Projets Visual C#, puis, sous Modèles, cliquez sur Application Windows. Form1 est créé par défaut.

    Note Dans Visual C# 2005, cliquez sur Visual C# au lieu de Visual C# Projects.

  2. Ajoutez une référence à la bibliothèque d’objets Microsoft Excel et à la bibliothèque d’objets Microsoft Word. Pour cela, procédez comme suit :

    1. Dans le menu Projet, cliquez sur Ajouter une référence.

    2. Sous l’onglet COM, recherchez labibliothèque d’objets Microsoft Excel, puis cliquez sur Sélectionner.

      Note Dans Visual C# 2005, vous n’avez pas besoin de cliquer sur Sélectionner.

      Note Microsoft Office 2003 inclut des assemblys PIA (Primary Interop Assemblies). Microsoft Office XP n’inclut pas de codes confidentiels, mais ils peuvent être téléchargés.

    3. Recherchez la bibliothèque d’objets Microsoft Word, puis cliquez sur Sélectionner.

      Note Dans Visual C# 2005, vous n’avez pas besoin de cliquer sur Sélectionner.

    4. Dans la boîte de dialogue Ajouter des références, cliquez sur OK pour accepter vos sélections.

  3. Dans le menu Affichage, cliquez sur Boîte à outils pour afficher la boîte à outils. Ajoutez trois boutons et une zone de texte à Form1. Tapez le texte de ces contrôles comme suit :

    ID Text
    button1 Obtenir une référence Automation à l’instance en cours d’exécution d’Excel
    button2 Obtenir une référence Automation à Excel à l’aide du moniker de fichier
    button3 Shell Word et obtenir une référence Automation à celui-ci
    textBox1 Entrez le nom du fichier xls enregistré
  4. Configurez les gestionnaires d’événements Click des contrôles de bouton, comme suit :

    1. Double-cliquez sur bouton1, puis cliquez sur Concepteur dans le menu Affichage.
    2. Double-cliquez sur button2, puis cliquez sur Concepteur dans le menu Affichage.
    3. Double-cliquez sur le bouton3.
  5. Ajoutez le code suivant en haut de Form1.cs, après les autres instructions using :

    using Excel = Microsoft.Office.Interop.Excel;
    using Word = Microsoft.Office.Interop.Word;
    
  6. Ajoutez le code suivant aux gestionnaires d’événements :

    private void button1_Click(object sender, System.EventArgs e)
    {
    
    //Excel Application Object
    Excel.Application oExcelApp;
    
    this.Activate();
    
    //Get reference to Excel.Application from the ROT.
    oExcelApp =  (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    
    //Display the name of the object.
    MessageBox.Show(oExcelApp.ActiveWorkbook.Name);
    
    //Release the reference.
    oExcelApp = null;
    }
    
    private void button2_Click(object sender, System.EventArgs e)
    {
    Excel.Workbook  xlwkbook;
    Excel.Worksheet xlsheet;
    
    //Get a reference to the Workbook object by using a file moniker.
    //The xls was saved earlier with this file name.
    xlwkbook = (Excel.Workbook)  System.Runtime.InteropServices.Marshal.BindToMoniker(textBox1.Text); 
    
    string sFile = textBox1.Text.Substring(textBox1.Text.LastIndexOf("\\")+1);
    xlwkbook.Application.Windows[sFile].Visible = true;
    xlwkbook.Application.Visible = true;
    xlsheet = (Excel.Worksheet) xlwkbook.ActiveSheet;
    xlsheet.Visible = Excel.XlSheetVisibility.xlSheetVisible;
    xlsheet.Cells[1,1] = 100;
    
    //Release the reference.
    xlwkbook = null;
    xlsheet = null;
    }
    
    private void button3_Click(object sender, System.EventArgs e)
    {
    Word.Application wdapp;
    
    //Shell Word
    System.Diagnostics.Process.Start("<Path to WINWORD.EXE>");
    
    this.Activate();
    
    //Word and other Office applications register themselves in 
    //ROT when their top-level window loses focus. Having a MessageBox 
    //forces Word to lose focus and then register itself in the ROT.
    
    MessageBox.Show("Launched Word");
    
    //Get the reference to Word.Application from the ROT.
    wdapp = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
    
    //Display the name.
    MessageBox.Show(wdapp.Name);
    
    //Release the reference.
    wdapp = null;
    }
    
    

    Note Dans button3_click(), remplacez Path to Winword.exe par le chemin d’accès approprié à Winword.exe. L’emplacement par défaut de Microsoft Word est C:\Program Files\Microsoft Office\Office\Winword.exe.

  7. Dans le menu Générer, sélectionnez Générer la solution pour générer l’application.

Tester l’application

  1. Appuyez sur F5 pour générer et exécuter votre application.
  2. Arrêtez toutes les instances en cours d’exécution d’Excel.
  3. Démarrez Excel avec un nouveau classeur.
  4. Cliquez sur le bouton Obtenir une référence Automation à l’instance en cours d’exécution d’Excel .
  5. L’application obtient la référence Automation à l’instance existante d’Excel. La référence Automation est stockée dans la variable locale oExcelApp pour button1_Click. Une boîte de message affiche le nom du classeur actif.
  6. Enregistrez le classeur sur votre disque local. Laissez le classeur ouvert dans Excel.
  7. Tapez le chemin d’accès complet et le nom de fichier du classeur que vous avez enregistré à l’étape précédente dans textBox1.
  8. Cliquez sur le bouton Obtenir une référence Automation à Excel à l’aide du moniker de fichier.
  9. L’application obtient une référence Automation à l’instance en cours d’exécution d’Excel. La référence Automation est stockée dans la variable locale xlwkbookfor button2_Click. La valeur 100 est entrée dans la première ligne et la première colonne de la feuille active.
  10. Quittez Excel sans enregistrer les modifications apportées au classeur.
  11. Cliquez sur le bouton Obtenir une référence Automation à Excel à l’aide du moniker de fichier.
  12. Une nouvelle instance d’Excel est créée et le classeur précédemment enregistré est ouvert. L’application obtient une référence Automation à cette instance d’Excel. La référence Automation est stockée dans la variable locale xlwkbook pour button2_Click. La valeur 100 est entrée dans la première ligne et la première colonne de la feuille active.
  13. Fermez Excel.
  14. Cliquez sur le bouton Shell Word et obtenez la référence Automation à celui-ci .
  15. Word démarre, comme si vous l’avez démarré à partir d’une invite de commandes et qu’une boîte de message Word lancée s’affiche. L’affichage d’une boîte de message force l’envoi d’un message WM_SETFOCUS à la fenêtre du programme Word. Cela permet à Word de s’inscrire dans la table d’objets en cours d’exécution (ROT).
  16. Fermez la boîte de message. Le programme obtient une référence Automation à l’instance nouvellement démarrée de Word. La référence Automation est stockée dans la variable locale wdapp pour button3_Click. Une boîte de message qui affiche le nom de l’objet Word.Application s’affiche.

Notes supplémentaires

Les serveurs COM peuvent être classés en tant que serveurs à usage multiple (instance unique) ou à usage unique (plusieurs instances), en fonction du nombre d’instances de ce serveur qui peuvent s’exécuter simultanément sur un seul ordinateur.

Lorsqu’une demande de nouvel objet COM est envoyée à un serveur COM à plusieurs instances, le serveur n’utilise qu’une seule instance du fichier .exe pour créer cet objet. Quel que soit le nombre de clients qui demandent un nouvel objet COM, il n’y aura qu’un seul serveur .exe processus. Dans le serveur à usage unique (plusieurs instances), chaque demande d’un nouvel objet COM démarre une instance distincte du fichier .exe serveur. Par conséquent, plusieurs instances du serveur peuvent s’exécuter sur le même ordinateur.

Plusieurs instances de Word (Winword.exe), Excel (Excel.exe) et Microsoft Access (MSAccess.exe) peuvent s’exécuter simultanément. Par conséquent, ces serveurs sont définis comme des serveurs à usage unique (plusieurs instances). Une seule instance de PowerPoint (Powerpnt.exe) peut s’exécuter à un moment donné. Par conséquent, PowerPoint est un serveur multi-utilisateur (instance unique).

Le fait qu’un serveur COM soit à usage unique (plusieurs instances) ou multiutilisation (instance unique) peut affecter votre décision d’utiliser GetActiveObject pour obtenir une référence à ce serveur. Étant donné que plusieurs instances de Word, Excel ou Microsoft Access peuvent être en cours d’exécution, GetActiveObject sur un serveur particulier peut retourner une instance que vous ne vous attendiez pas. L’instance qui est d’abord inscrite dans le ROT est généralement l’instance retournée par GetActiveObject. Si vous souhaitez obtenir une référence Automation à une instance en cours d’exécution spécifique de Word, Excel ou Microsoft Access, utilisez BindToMoniker avec le nom du fichier ouvert dans cette instance. Pour un serveur multi-utilisation (instance unique) comme PowerPoint, cela n’a pas d’importance, car la référence d’automatisation pointe vers la même instance en cours d’exécution.

Les serveurs COM sont censés s’inscrire dans la table d’objets en cours d’exécution après le démarrage. Les programmes Office s’inscrivent eux-mêmes lorsqu’ils perdent le focus. Si un programme tente de s’attacher à une instance en cours d’exécution avant que le programme ne perde le focus, vous pouvez recevoir un message d’erreur.

References

Pour plus d’informations sur les différents comportements des programmes Office lorsque vous utilisez GetActiveObject, cliquez sur le numéro d’article ci-dessous pour afficher l’article dans la Base de connaissances Microsoft :

288902 INFO : GetObject et CreateObject Behavior of Office Automation Servers Pour plus d’informations, consultez le site web Microsoft Developer Network (MSDN) suivant :

Développement Microsoft Office avec Visual Studio