Jak pomocí jazyka Visual C# automatizovat spuštěnou instanci aplikace Office

Souhrn

Tento podrobný článek ukazuje, jak vytvořit klienta Microsoft Visual C# 2005 nebo Microsoft Visual C# .NET, který získá odkaz automation na spuštěnou instanci aplikace Office.

Vytvoření aplikace Visual C# 2005 nebo Visual C# .NET, která automatizuje spuštěnou instanci aplikace Office

Klientské programy, které automatizují Office, můžou buď vytvořit novou instanci této aplikace Office, nebo získat odkaz na instanci, která je už spuštěná. Microsoft obecně doporučuje, abyste místo připojení ke spuštěné instanci vytvořili novou instanci. V některých scénářích ale klientský program musí automatizovat již spuštěnou instanci aplikace Office. V tomto případě klient služby Automation získá odkaz na objekt modelu COM (Component Object Model) serveru Automation ze spuštěné tabulky objektů (ROT).

Pokud se server Automation zaregistroval v tabulce spuštěných objektů, klient .NET může získat odkaz na spuštěnou instanci voláním následujícího příkazu:

System.Runtime.InteropServices.Marshal.GetActiveObject

-Nebo-

System.Runtime.InteropServices.Marshal.BindToMoniker

Ukázkový kód

  1. Spusťte Microsoft Visual Studio 2005 nebo Microsoft Visual Studio .NET. V nabídce Soubor klikněte na Nový a potom klikněte na Project. V části Typy projektů klikněte na Projekty Visual C# a potom v části Šablony klikněte na Aplikace systému Windows. Formulář1 je ve výchozím nastavení vytvořen.

    Poznámka V jazyce Visual C# 2005 klikněte na Visual C# místo projektů Visual C#.

  2. Přidejte odkaz na knihovnu objektů aplikace Microsoft Excel a knihovnu objektů aplikace Microsoft Word. Postupujte takto:

    1. V nabídce Projekt klikněte na Přidat odkaz.

    2. Na kartě COM vyhledejteKnihovnu objektů aplikace Microsoft Excel a klepněte na tlačítko Vybrat.

      Poznámka Ve Visual C# 2005 nemusíte kliknout na Vybrat.

      Poznámka Microsoft Office 2003 obsahuje primární sestavení vzájemné spolupráce (PIA). Microsoft Office XP neobsahuje pia, ale mohou být staženy.

    3. Vyhledejte knihovnu objektů aplikace Microsoft Word a klepněte na tlačítko Vybrat.

      Poznámka Ve Visual C# 2005 nemusíte kliknout na Vybrat.

    4. V dialogovém okně Přidat odkazy potvrďte výběr kliknutím na tlačítko OK.

  3. V zobrazení nabídky, klepněte na tlačítko Sada nástrojů zobrazíte sadu nástrojů. Přidejte tři tlačítka a textové pole do formuláře Form1. Zadejte text těchto ovládacích prvků následujícím způsobem:

    ID Text
    tlačítko 1 Získání odkazu na automatizaci na spuštěnou instanci Excelu
    tlačítko 2 Získání odkazu automatizace na Excel pomocí monikeru souboru
    tlačítko 3 Word shellu a získání odkazu na automatizaci
    textové pole1 Zadejte název souboru uloženého souboru XLS.
  4. Nastavte obslužné rutiny událostí Click ovládacích prvků tlačítka následujícím způsobem:

    1. Poklikejte na tlačítko1 a potom v nabídce Zobrazení klikněte na příkaz Návrhář.
    2. Poklikejte na tlačítko2 a potom v nabídce Zobrazení klikněte na Návrhář.
    3. Poklikáte na tlačítko3.
  5. Na začátek souboru Form1.cs přidejte následující kód za ostatní příkazy using:

    using Excel = Microsoft.Office.Interop.Excel;
    using Word = Microsoft.Office.Interop.Word;
    
  6. Do obslužných rutin událostí přidejte následující kód:

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

    Poznámka V button3_click() nahraďte cestu Winword.exe správnou cestou k Winword.exe. Výchozí umístění aplikace Microsoft Word je C:\Program Files\Microsoft Office\Office\Winword.exe.

  7. V nabídce Sestavení vyberte Sestavit řešení a sestavte aplikaci.

Testování aplikace

  1. Stisknutím klávesy F5 sestavte a spusťte aplikaci.
  2. Vypněte všechny spuštěné instance aplikace Excel.
  3. Spusťte Excel s novým sešitem.
  4. Klikněte na tlačítko Získat odkaz na automatizaci pro spuštění instance aplikace Excel .
  5. Aplikace získá odkaz Automation na existující instanci aplikace Excel. Odkaz Automation je uložen v místní proměnné oExcelApp pro button1_Click. V okně se zprávou se zobrazí název aktivního sešitu.
  6. Uložte sešit na místní disk. Nechte sešit otevřený v Excelu.
  7. Zadejte úplnou cestu a název souboru sešitu, který jste uložili v předchozím kroku v textovém poli1.
  8. Klikněte na tlačítko Získat odkaz na automatizaci na Excel pomocí monikeru souboru .
  9. Aplikace získá odkaz automation na spuštěnou instanci aplikace Excel. Odkaz automation je uložen v místní proměnné xlwkbookfor button2_Click. Do prvního řádku a prvního sloupce aktivního listu se zadá hodnota 100.
  10. Ukončete Excel bez uložení změn v sešitu.
  11. Klikněte na tlačítko Získat odkaz na automatizaci na Excel pomocí monikeru souboru .
  12. Vytvoří se nová instance aplikace Excel a otevře se dříve uložený sešit. Aplikace získá odkaz automation na tuto instanci aplikace Excel. Odkaz automation je uložen v místní proměnné xlwkbook pro button2_Click. Do prvního řádku a prvního sloupce aktivního listu se zadá hodnota 100.
  13. Zavřete Excel.
  14. Klikněte na tlačítko Shell Word (Shell Word) a Get Automation Reference to it (Získat odkaz na automatizaci).
  15. Word se spustí stejně, jako kdybyste ho spustili z příkazového řádku a zobrazilo se okno se zprávou Spuštěný Word. Zobrazení okna se zprávou vynutí odeslání WM_SETFOCUS zprávy do okna aplikace Word. To umožňuje, aby se Word sám zaregistroval ve spuštěné tabulce objektů (ROT).
  16. Zavřete okno se zprávou. Program získá odkaz automation na nově spuštěnou instanci aplikace Word. Odkaz automation je uložen v místní proměnné wdapp pro button3_Click. Zobrazí se okno se zprávou zobrazující název objektu Word.Application.

Další poznámky

Servery COM lze klasifikovat jako více instancí (jedna instance) nebo jednoúčelové (více instancí) v závislosti na počtu instancí tohoto serveru, které lze spustit současně na jednom počítači.

Když požadavek na nový objekt COM přijde na server COM s více instancemi, server k vytvoření tohoto objektu použije pouze jednu instanci .exe souboru. Bez ohledu na to, kolik klientů požaduje nový objekt COM, bude existovat pouze jeden server .exe proces. Na serveru s jedním použitím (více instancí) každý požadavek na nový objekt COM spustí samostatnou instanci serveru .exe souboru. Proto může na stejném počítači běžet více než jedna instance serveru.

Současně může běžet více instancí aplikací Word (Winword.exe), Excel (Excel.exe) a Microsoft Access (MSAccess.exe). Proto jsou tyto servery definované jako servery s jedním použitím (více instancí). V daném okamžiku může běžet jenom jedna instance PowerPointu (Powerpnt.exe). PowerPoint je proto server s více instancemi (jedna instance).

Jestli je server COM jednoúčelový (více instancí) nebo multiuse (jedna instance), může mít vliv na vaše rozhodnutí použít GetActiveObject k získání odkazu na tento server. Vzhledem k tomu, že může být spuštěna více než jedna instance aplikace Word, Excel nebo Microsoft Access, může getActiveObject na konkrétním serveru vrátit instanci, kterou jste neočekávali. Instance, která je poprvé zaregistrovaná v objektu ROT, je obvykle instance vrácená objektem GetActiveObject. Pokud chcete získat odkaz automation na konkrétní spuštěnou instanci aplikace Word, Excel nebo Microsoft Access, použijte BindToMoniker s názvem souboru, který je otevřen v této instanci. U serveru Multiuse (jedna instance), jako je PowerPoint, nezáleží, protože odkaz na automatizaci odkazuje na stejnou spuštěnou instanci.

Očekává se, že se servery COM zaregistrují ve spuštěné tabulce objektů po spuštění. Aplikace Office se zaregistrují, když se ztratí fokus. Pokud se program pokusí připojit ke spuštěné instanci předtím, než program ztratí fokus, může se zobrazit chybová zpráva.

Odkazy

Další informace o různých chování aplikací Office při použití GetActiveObject klepněte na článek číslo článku databáze Microsoft Knowledge Base:

288902 INFORMACE: Chování GetObject a CreateObject serverů Office Automation Další informace naleznete na následujícím webu Microsoft Developer Network (MSDN):

Vývoj pro Microsoft Office pomocí sady Visual Studio