Comportamiento de GetObject y CreateObject de los servidores de automatización de Office

Resumen

En este artículo se describen los diferentes comportamientos que se producen al usar las funciones GetObject y CreateObject con varias versiones de aplicaciones de Microsoft Office.

GetObject y CreateObject son funciones proporcionadas por Microsoft Visual Basic y Microsoft Visual Basic para Aplicaciones (VBA). Sin embargo, la información también es aplicable a Microsoft Visual C++ si trata las referencias a GetObject como llamadas a la API GetActiveObject y las referencias a CreateObject como llamadas a CoCreateInstanceAPI.

Más información

GetObject

GetObject se usa para asociar a una instancia en ejecución de un servidor de automatización. Hay varias maneras diferentes de llamar a GetObject, pero la sintaxis recomendada para las aplicaciones de Microsoft Office es la siguiente:

set xlApp = GetObject(, "Excel.Application")

Si se ejecuta una instancia de Microsoft Excel cuando se ejecuta este código, tiene acceso al modelo de objetos de la instancia en ejecución a través de la variable xlApp. Si no se está ejecutando ninguna instancia, recibirá el siguiente mensaje de error en tiempo de ejecución capturable:

Run-time error '429':
ActiveX component can't create object  

Si se ejecutan varias instancias de Microsoft Excel, GetObject se asocia a la instancia que se inicia primero. Si cierra la primera instancia, otra llamada a GetObject se asocia a la segunda instancia que se inició, etc.

Puede asociar a una instancia específica si conoce el nombre de un documento abierto en esa instancia. Por ejemplo, si una instancia de Excel se ejecuta con un libro abierto denominado Book2, el código siguiente se asocia correctamente a esa instancia aunque no sea la primera instancia que se inició:

Set xlApp = GetObject("Book2").Application

CreateObject

CreateObject se usa para iniciar una nueva instancia de un servidor de Automation. Por ejemplo:

set xlApp = CreateObject("Excel.Application")

Dependiendo de si el servidor está diseñado como SingleUse o MultiUse, es posible que se inicie o no otro proceso de servidor. Esta podría ser una distinción importante para decidir si debe apagar por la fuerza una instancia de Automation. Por ejemplo, con un servidor multiuso, si una instancia ya se está ejecutando antes de adjuntarla, es posible que quiera evitar apagar el servidor mediante programación cuando haya terminado de automatizarlo.

La tabla siguiente sirve de referencia útil al implementar una solución con Microsoft Office. Enumera los comportamientos y atributos de las distintas versiones y aplicaciones de Microsoft Office, como si el servidor es visible de forma predeterminada cuando se inicia, si es SingleUse o MultiUse, si tiene una propiedad UserControl, si tiene un método Quit y el nombre de la clase para su ventana principal.

Aplicaciones Visible Instancia Tiene UserControl Tiene QuitClassName Nombre de clase
Excel 97, 2000, 2002, 2003, 2007 No SingleUse XlMain
Word 97, 2000, 2002, 2003 y 2007 No SingleUse OpusApp
PowerPoint 97 No Multiusos No PP97FrameClass
PowerPoint 2000 No Multiusos No PP9FrameClass
PowerPoint 2002 No Multiusos No PP10FrameClass
PowerPoint 2003 No Multiusos No PP11FrameClass
PowerPoint 2007 No Multiusos No PP12FrameClass
Access 97 SingleUse OMain
Access 2000, 2002, 2003, 2007 No SingleUse OMain
Proyecto 98, 2000 No Multiusos JWinproj-WhimperMainClass

El nombre de la clase de ventana principal es útil para llamar a la API FindWindow cuando desea averiguar convenientemente si alguna instancia ya se está ejecutando. La propiedad UserControl es una propiedad booleana que indica si la aplicación de servidor se cierra automáticamente cuando se libera su última referencia (establecida en nada). El método Quit permite invalidar la propiedad UserControl en los casos en los que sea necesario (por ejemplo, cuando una instancia no se cierra después de que se publique la última referencia).

En general, Microsoft recomienda usar una nueva instancia de una aplicación de Office en lugar de asociarse a una instancia que el usuario pueda estar usando. Es mejor crear una instancia mediante Application ProgID y, a continuación, abrir o crear nuevos objetos desde allí. Otros progID, como Excel.Sheet y Word. El documento, etc., está pensado para su uso en OLE (vinculación de objetos e incrustación) y puede dar resultados incoherentes cuando se usa con CreateObject. Mediante el uso de Application ProgID, se evitan posibles problemas iniciando explícitamente el servidor para Automation (no para insertar).

Cuando haya terminado con el servidor de Automation, libere todas las referencias a él y llame a su método Quit (si está disponible) para que el servidor se cierre según lo previsto. Si desea configurar una instancia a través de Automation y, a continuación, dejarla abierta para que el usuario la use, debe establecer la propiedad UserControl en TRUE y, a continuación, liberar todas las referencias. A continuación, el servidor permanece en ejecución (porque la propiedad UserControl es TRUE) y se cierra correctamente cuando el usuario cierra la aplicación (porque no hay referencias pendientes).

Nota Para Word, la propiedad UserControl es de solo lectura. No se puede establecer en True o False. Word siempre permanece en ejecución cuando se publica la última referencia.