Verwenden von Visual C# zum Automatisieren einer ausgeführten Instanz eines Office-Programms

Zusammenfassung

In diesem schrittweisen Artikel erfahren Sie, wie Sie einen Microsoft Visual C# 2005- oder Microsoft Visual C# .NET-Client erstellen, der einen Automatisierungsverweis auf eine ausgeführte Instanz eines Office-Programms abruft.

Erstellen einer Visual C# 2005- oder Visual C# .NET-Anwendung, die eine ausgeführte Instanz eines Office-Programms automatisiert

Clientprogramme, die Office automatisieren, können entweder eine neue Instanz dieses Office-Programms erstellen oder einen Verweis auf die Instanz abrufen, die bereits ausgeführt wird. Microsoft empfiehlt im Allgemeinen, eine neue Instanz zu erstellen, anstatt sie an eine ausgeführte Instanz anzufügen. In einigen Szenarien muss das Clientprogramm jedoch eine bereits ausgeführte Instanz eines Office-Programms automatisieren. In diesem Fall ruft der Automatisierungsclient den Verweis auf das Component Object Model (COM)-Objekt des Automatisierungsservers aus der Running Object Table (ROT) ab.

Wenn sich der Automatisierungsserver in der Running Object Table registriert hat, kann ein .NET-Client einen Verweis auf die ausgeführte Instanz abrufen, indem er Folgendes aufruft:

System.Runtime.InteropServices.Marshal.GetActiveObject

-oder-

System.Runtime.InteropServices.Marshal.BindToMoniker

Beispielcode

  1. Starten Sie Microsoft Visual Studio 2005 oder Microsoft Visual Studio .NET. Klicken Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt. Klicken Sie unter "Projekttypen" auf "Visual C#-Projekte" und dann unter "Vorlagen" auf "Windows-Anwendung". Form1 wird standardmäßig erstellt.

    Hinweis Klicken Sie in Visual C# 2005 auf Visual C# anstelle von Visual C#-Projekten.

  2. Fügen Sie einen Verweis auf die Microsoft Excel-Objektbibliothek und die Microsoft Word-Objektbibliothek hinzu. Gehen Sie dazu wie folgt vor:

    1. On the Project menu, click Add Reference.

    2. Suchen Sie auf der Registerkarte COM dieMicrosoft Excel-Objektbibliothek, und klicken Sie dann auf "Auswählen".

      Hinweis In Visual C# 2005 müssen Sie nicht auf "Auswählen" klicken.

      Hinweis Microsoft Office 2003 enthält primäre Interopassemblys (PRIMARY Interop Assemblies, PIAs). Microsoft Office XP enthält keine PIAs, sie können jedoch heruntergeladen werden.

    3. Suchen Sie die Microsoft Word-Objektbibliothek, und klicken Sie dann auf "Auswählen".

      Hinweis In Visual C# 2005 müssen Sie nicht auf "Auswählen" klicken.

    4. Klicken Sie im Dialogfeld "Verweise hinzufügen" auf "OK", um Ihre Auswahl zu übernehmen.

  3. Klicken Sie im Menü "Ansicht" auf "Toolbox", um die Toolbox anzuzeigen. Fügen Sie formular1 drei Schaltflächen und ein Textfeld hinzu. Geben Sie den Text für diese Steuerelemente wie folgt ein:

    ID Text
    button1 Abrufen eines Automatisierungsverweises für die ausführungsbereite Instanz von Excel
    schaltfläche2 Abrufen der Automatisierungsreferenz zu Excel mithilfe von "File Moniker"
    button3 Shell word and Get Automation Reference to it
    textBox1 Geben Sie den Dateinamen für die gespeicherte XLS-Datei ein.
  4. Richten Sie die Click-Ereignishandler der Schaltflächensteuerelemente wie folgt ein:

    1. Doppelklicken Sie auf Schaltfläche1, und klicken Sie dann im Menü "Ansicht" auf "Designer".
    2. Doppelklicken Sie auf Schaltfläche2, und klicken Sie dann im Menü "Ansicht" auf "Designer".
    3. Doppelklicken Sie auf Schaltfläche3.
  5. Fügen Sie den folgenden Code am Anfang von "Form1.cs" nach den anderen using-Anweisungen hinzu:

    using Excel = Microsoft.Office.Interop.Excel;
    using Word = Microsoft.Office.Interop.Word;
    
  6. Fügen Sie den Ereignishandlern den folgenden Code hinzu:

    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;
    }
    
    

    Hinweis Ersetzen Sie in button3_click() path to Winword.exe durch den richtigen Pfad zu Winword.exe. Der Standardspeicherort für Microsoft Word ist "C:\Programme\Microsoft Office\Office\Winword.exe".

  7. Wählen Sie im Menü "Erstellen" die Option "Projektmappe erstellen" aus, um die Anwendung zu erstellen.

Testen der Anwendung

  1. Drücken Sie F5, um ihre Anwendung zu erstellen und auszuführen.
  2. Beenden Sie alle ausgeführten Instanzen von Excel.
  3. Starten Sie Excel mit einer neuen Arbeitsmappe.
  4. Klicken Sie auf die Schaltfläche " Automatisierungsreferenz zum Ausführen der Instanz von Excel abrufen".
  5. Die Anwendung ruft den Automatisierungsverweise auf die vorhandene Instanz von Excel ab. Der Automatisierungsverweise wird in der lokalen Variablen "oExcelApp" für button1_Click gespeichert. In einem Meldungsfeld wird der Name der aktiven Arbeitsmappe angezeigt.
  6. Speichern Sie die Arbeitsmappe auf Ihrem lokalen Datenträger. Lassen Sie die Arbeitsmappe in Excel geöffnet.
  7. Geben Sie den vollständigen Pfad und Dateinamen der Arbeitsmappe ein, die Sie im vorherigen Schritt in textBox1 gespeichert haben.
  8. Klicken Sie mithilfe der Schaltfläche "Datei moniker" auf die Schaltfläche " Automatisierungsreferenz zu Excel abrufen ".
  9. Die Anwendung ruft einen Automatisierungsverweise auf die ausgeführte Instanz von Excel ab. Die Automatisierungsreferenz wird in der lokalen Variablen xlwkbookfor button2_Click gespeichert. Der Wert 100 wird in die erste Zeile und erste Spalte des aktiven Blatts eingegeben.
  10. Beenden Sie Excel, ohne Änderungen an der Arbeitsmappe zu speichern.
  11. Klicken Sie mithilfe der Schaltfläche "Datei moniker" auf die Schaltfläche " Automatisierungsreferenz zu Excel abrufen ".
  12. Eine neue Instanz von Excel wird erstellt, und die zuvor gespeicherte Arbeitsmappe wird geöffnet. Die Anwendung ruft einen Automatisierungsverweise auf diese Instanz von Excel ab. Die Automatisierungsreferenz wird in der lokalen Variablen xlwkbook für button2_Click gespeichert. Der Wert 100 wird in die erste Zeile und erste Spalte des aktiven Blatts eingegeben.
  13. Schließen Sie Excel.
  14. Klicken Sie auf die Word-Shell und auf die Schaltfläche "Automatisierungsreferenz abrufen ".
  15. Word wird so gestartet, als ob Sie es über eine Eingabeaufforderung gestartet haben, und es wird ein Meldungsfeld "Word gestartet" angezeigt. Das Anzeigen eines Meldungsfelds erzwingt, dass eine WM_SETFOCUS Nachricht an das Word-Programmfenster gesendet wird. Dadurch kann sich Word selbst in der Running Object Table (ROT) registrieren.
  16. Schließen Sie das Meldungsfeld. Das Programm ruft einen Automatisierungsverweise auf die neu gestartete Instanz von Word ab. Der Automatisierungsverweise wird in der lokalen Variablen wdapp für button3_Click gespeichert. Es wird ein Meldungsfeld angezeigt, in dem der Name des Word.Application-Objekts angezeigt wird.

Zusätzliche Hinweise

COM-Server können in Abhängigkeit von der Anzahl der Instanzen dieses Servers, die gleichzeitig auf einem einzelnen Computer ausgeführt werden können, als "Multiuse" (Einzelne Instanz) oder "Single Use" (Mehrere Instanzen) klassifiziert werden.

Wenn eine Anforderung für ein neues COM-Objekt an einen COM-Server mit mehreren Instanzen (Single Instance) gesendet wird, verwendet der Server nur eine Instanz der .exe Datei, um dieses Objekt zu erstellen. Unabhängig davon, wie viele Clients ein neues COM-Objekt anfordern, gibt es nur einen Server .exe Prozess. Auf dem Server mit einmaliger Verwendung (mehrere Instanzen) startet jede Anforderung für ein neues COM-Objekt eine separate Instanz des Servers .exe Datei. Daher können mehrere Instanzen des Servers auf demselben Computer ausgeführt werden.

Mehrere Instanzen von Word (Winword.exe), Excel (Excel.exe) und Microsoft Access (MSAccess.exe) können gleichzeitig ausgeführt werden. Daher sind diese Server als Single Use (Multiple Instances)-Server definiert. Nur eine Instanz von PowerPoint (Powerpnt.exe) kann zu einem bestimmten Zeitpunkt ausgeführt werden. Daher ist PowerPoint ein Multiuse-Server (Einzelne Instanz).

Ob ein COM-Server single Use (Multiple Instances) oder Multiuse (Single Instance) ist, kann sich auf Ihre Entscheidung auswirken, GetActiveObject zum Abrufen eines Verweises auf diesen Server zu verwenden. Da möglicherweise mehrere Instanzen von Word, Excel oder Microsoft Access ausgeführt werden können, gibt GetActiveObject auf einem bestimmten Server möglicherweise eine Instanz zurück, die Sie nicht erwartet haben. Die Instanz, die zuerst in rot registriert wird, ist in der Regel die Instanz, die von GetActiveObject zurückgegeben wird. Wenn Sie einen Automatisierungsverweise auf eine bestimmte ausgeführte Instanz von Word, Excel oder Microsoft Access abrufen möchten, verwenden Sie BindToMoniker mit dem Namen der Datei, die in dieser Instanz geöffnet wird. Bei einem Multiuse-Server (Einzelne Instanz) wie PowerPoint spielt dies keine Rolle, da der Automatisierungsverweis auf dieselbe ausgeführte Instanz verweist.

Com-Server werden erwartet, dass sie sich nach dem Start in "Objekttabelle ausführen" registrieren. Office-Programme registrieren sich selbst, wenn sie den Fokus verlieren. Wenn ein Programm versucht, eine Verbindung mit einer ausgeführten Instanz zu erstellen, bevor das Programm den Fokus verliert, wird möglicherweise eine Fehlermeldung angezeigt.

References

Weitere Informationen zu den unterschiedlichen Verhaltensweisen von Office-Programmen bei Verwendung von GetActiveObject erhalten Sie, indem Sie auf die artikelnummer unten klicken, um den Artikel in der Microsoft Knowledge Base anzuzeigen:

288902 INFO: GetObject- und CreateObject-Verhalten von Office-Automatisierungsservern Weitere Informationen finden Sie auf der folgenden Microsoft Developer Network (MSDN)-Website:

Microsoft Office-Entwicklung mit Visual Studio