Cómo usar Visual C# para automatizar una instancia en ejecución de un programa de Office

Resumen

En este artículo paso a paso se muestra cómo crear un cliente .NET de Microsoft Visual C# 2005 o Microsoft Visual C# que obtiene una referencia de Automation a una instancia en ejecución de un programa de Office.

Creación de una aplicación .NET de Visual C# 2005 o Visual C# que automatice una instancia en ejecución de un programa de Office

Los programas cliente que automatizan Office pueden crear una nueva instancia de ese programa de Office o obtener una referencia a la instancia que ya se está ejecutando. Por lo general, Microsoft recomienda crear una nueva instancia en lugar de asociarla a una instancia en ejecución. Sin embargo, en algunos escenarios, el programa cliente debe automatizar una instancia ya en ejecución de un programa de Office. En este caso, el cliente de Automation obtiene la referencia al objeto Del modelo de objetos componentes (COM) del servidor de Automation de la tabla de objetos en ejecución (ROT).

Si el servidor de Automation se registró en la tabla de objetos en ejecución, un cliente de .NET puede obtener una referencia a la instancia en ejecución llamando a lo siguiente:

System.Runtime.InteropServices.Marshal.GetActiveObject

o:

System.Runtime.InteropServices.Marshal.BindToMoniker

Código de ejemplo

  1. Inicie Microsoft Visual Studio 2005 o Microsoft Visual Studio .NET. En el menú Archivo, haga clic en Nuevo y, a continuación, haga clic en Proyecto. En Tipos de proyecto, haga clic en Proyectos de Visual C# y, a continuación, en Plantillas, haga clic en Aplicación de Windows. Form1 se crea de forma predeterminada.

    Nota En Visual C# 2005, haga clic en Visual C# en lugar de Proyectos de Visual C#.

  2. Agregue una referencia a la Biblioteca de objetos de Microsoft Excel y a la Biblioteca de objetos de Microsoft Word. Para ello, siga estos pasos:

    1. On the Project menu, click Add Reference.

    2. En la pestaña COM, busque laBiblioteca de objetos de Microsoft Excel y, a continuación, haga clic en Seleccionar.

      Nota En Visual C# 2005, no es necesario hacer clic en Seleccionar.

      Nota Microsoft Office 2003 incluye ensamblados de interoperabilidad primarios (PIA). Microsoft Office XP no incluye los PIA, pero se pueden descargar.

    3. Busque la biblioteca de objetos de Microsoft Word y, a continuación, haga clic en Seleccionar.

      Nota En Visual C# 2005, no es necesario hacer clic en Seleccionar.

    4. En el cuadro de diálogo Agregar referencias, haga clic en Aceptar para aceptar las selecciones.

  3. En el menú Ver, haga clic en Cuadro de herramientas para mostrar el cuadro de herramientas. Agregue tres botones y un cuadro de texto a Form1. Escriba el texto de estos controles de la siguiente manera:

    Id. Text
    button1 Obtener referencia de Automatización a la instancia de Excel en ejecución
    button2 Obtener referencia de Automation a Excel mediante Moniker de archivo
    button3 Shell Word y obtener referencia de Automatización
    textBox1 Escriba el nombre de archivo del archivo xls guardado.
  4. Configure los controladores de eventos Click de los controles de botón, como se indica a continuación:

    1. Haga doble clic en el botón1 y, a continuación, haga clic en Diseñador en el menú Ver.
    2. Haga doble clic en el botón2 y, a continuación, haga clic en Diseñador en el menú Ver.
    3. Haga doble clic en el botón3.
  5. Agregue el código siguiente a la parte superior de Form1.cs, después de las demás instrucciones using:

    using Excel = Microsoft.Office.Interop.Excel;
    using Word = Microsoft.Office.Interop.Word;
    
  6. Agregue el código siguiente a los controladores de eventos:

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

    Nota En button3_click(), reemplace Path to Winword.exe por la ruta de acceso correcta a Winword.exe. La ubicación predeterminada de Microsoft Word es C:\Archivos de programa\Microsoft Office\Office\Winword.exe.

  7. En el menú Compilar, seleccione Compilar solución para compilar la aplicación.

Prueba de la aplicación

  1. Presione F5 para compilar y ejecutar la aplicación.
  2. Cierre todas las instancias en ejecución de Excel.
  3. Inicie Excel con un nuevo libro.
  4. Haga clic en el botón Obtener referencia de Automation para ejecutar la instancia de Excel .
  5. La aplicación obtiene la referencia de Automation a la instancia existente de Excel. La referencia de Automation se almacena en la variable local oExcelApp para button1_Click. Un cuadro de mensaje muestra el nombre del libro activo.
  6. Guarde el libro en el disco local. Deje el libro abierto en Excel.
  7. Escriba la ruta de acceso completa y el nombre de archivo del libro que guardó en el paso anterior en textBox1.
  8. Haga clic en el botón Get Automation Reference to Excel using File Moniker (Obtener referencia de automatización a Excel mediante el moniker de archivo ).
  9. La aplicación obtiene una referencia de Automation a la instancia en ejecución de Excel. La referencia de Automation se almacena en la variable local xlwkbookfor button2_Click. Se escribe un valor de 100 en la primera fila y la primera columna de la hoja activa.
  10. Salga de Excel sin guardar los cambios en el libro.
  11. Haga clic en el botón Get Automation Reference to Excel using File Moniker (Obtener referencia de automatización a Excel mediante el moniker de archivo ).
  12. Se crea una nueva instancia de Excel y se abre el libro guardado anteriormente. La aplicación obtiene una referencia de Automation a esta instancia de Excel. La referencia de Automation se almacena en la variable local xlwkbook para button2_Click. Se escribe un valor de 100 en la primera fila y la primera columna de la hoja activa.
  13. Cierre Excel.
  14. Haga clic en el botón Shell Word (Palabra de shell) y Get Automation Reference to it (Obtener referencia de automatización).
  15. Se inicia Word, como si lo hubiera iniciado desde un símbolo del sistema, y se muestra un cuadro de mensaje de Word iniciado. Mostrar un cuadro de mensaje obliga a enviar un mensaje WM_SETFOCUS a la ventana de programa de Word. Esto permite que Word se registre en la tabla de objetos en ejecución (ROT).
  16. Cierre el cuadro de mensaje. El programa obtiene una referencia de Automation a la instancia de Word recién iniciada. La referencia de Automation se almacena en la variable local wdapp para button3_Click. Se muestra un cuadro de mensaje que muestra el nombre del objeto Word.Application.

Notas adicionales

Los servidores COM se pueden clasificar como Uso múltiple (instancia única) o Uso único (varias instancias), en función del número de instancias de ese servidor que se pueden ejecutar simultáneamente en un único equipo.

Cuando una solicitud para un nuevo objeto COM llega a un servidor COM multiuso (instancia única), el servidor usa solo una instancia del archivo .exe para crear ese objeto. Independientemente del número de clientes que soliciten un nuevo objeto COM, solo habrá un servidor .exe proceso. En el servidor de uso único (varias instancias), cada solicitud de un nuevo objeto COM inicia una instancia independiente del servidor .exe archivo. Por lo tanto, más de una instancia del servidor se puede ejecutar en el mismo equipo.

Se pueden ejecutar simultáneamente varias instancias de Word (Winword.exe), Excel (Excel.exe) y Microsoft Access (MSAccess.exe). Por lo tanto, estos servidores se definen como servidores de uso único (varias instancias). Solo se puede ejecutar una instancia de PowerPoint (Powerpnt.exe) en un momento dado. Por lo tanto, PowerPoint es un servidor multiuso (instancia única).

Si un servidor COM es de uso único (varias instancias) o uso múltiple (instancia única) puede afectar a la decisión de usar GetActiveObject para obtener referencia a ese servidor. Dado que potencialmente se puede ejecutar más de una instancia de Word, Excel o Microsoft Access, GetActiveObject en un servidor determinado puede devolver una instancia que no esperaba. La instancia que se registra por primera vez en rot es normalmente la instancia devuelta por GetActiveObject. Si desea obtener una referencia de Automation a una instancia en ejecución específica de Word, Excel o Microsoft Access, use BindToMoniker con el nombre del archivo que se abre en esa instancia. Para un servidor multiuso (instancia única) como PowerPoint, no importa, porque la referencia de automatización apunta a la misma instancia en ejecución.

Se espera que los servidores COM se registren en la tabla de objetos en ejecución después del inicio. Los programas de Office se registran cuando pierden el foco. Si un programa intenta asociarse a una instancia en ejecución antes de que el programa pierda el foco, puede recibir un mensaje de error.

Referencias

Para obtener información adicional sobre los diferentes comportamientos de los programas de Office al usar GetActiveObject, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

288902 INFO: GetObject y CreateObject Behavior of Office Automation Servers Para obtener más información, consulte el siguiente sitio web de Microsoft Developer Network (MSDN):

Desarrollo de Microsoft Office con Visual Studio