Поведение GetObject и CreateObject на серверах автоматизации Office

Сводка

В этой статье рассматриваются различные варианты поведения, возникающие при использовании функций GetObject и CreateObject с различными версиями приложений Microsoft Office.

GetObject и CreateObject — это функции, предоставляемые Microsoft Visual Basic и Microsoft Visual Basic для приложений (VBA). Однако эти сведения также применимы к Microsoft Visual C++, если ссылки на GetObject обрабатываются как вызовы API GetActiveObject, а ссылки на CreateObject — как вызовы CoCreateInstanceAPI.

Дополнительные сведения

GetObject

GetObject используется для подключения к работающему экземпляру сервера автоматизации. Существует несколько различных способов вызова GetObject, но для приложений Microsoft Office рекомендуется использовать следующий синтаксис:

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

Если при выполнении этого кода выполняется экземпляр Microsoft Excel, у вас есть доступ к объектной модели выполняющегося экземпляра через переменную xlApp. Если экземпляр не запущен, появляется следующее сообщение об ошибке времени выполнения с возможностью перехвата:

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

Если запущено несколько экземпляров Microsoft Excel, GetObject присоединяется к экземпляру, который запускается первым. Если после этого закрыть первый экземпляр, еще один вызов GetObject присоединяется ко второму экземпляру, который был запущен, и т. д.

Вы можете присоединиться к определенному экземпляру, если известно имя открытого документа в этом экземпляре. Например, если экземпляр Excel работает с открытой книгой с именем Book2, следующий код успешно присоединяется к этому экземпляру, даже если он не является самым ранним запущенным экземпляром:

Set xlApp = GetObject("Book2").Application

CreateObject

CreateObject используется для запуска нового экземпляра сервера автоматизации. Например:

set xlApp = CreateObject("Excel.Application")

В зависимости от того, предназначен ли сервер как SingleUse или MultiUse, может быть запущен другой серверный процесс. Это может быть важным различием при принятии решения о том, следует ли принудительно завершить работу экземпляра службы автоматизации. Например, при использовании сервера с несколькими пользованиями, если экземпляр уже запущен перед подключением к нему, вы можете избежать программного завершения работы сервера, когда вы выполняете автоматизацию.

Следующая таблица служит полезным справочником при реализации решения с помощью Microsoft Office. В нем перечислены поведение и атрибуты различных версий и приложений Microsoft Office, например, отображается ли сервер по умолчанию при запуске, имеет ли он значение SingleUse или MultiUse, имеет ли он свойство UserControl, если у него есть метод Quit, а также имя класса для окна main.

Приложения Visible Инстансирование Имеет UserControl Имеет quitClassName Имя класса
Excel 97, 2000, 2002, 2003, 2007 Нет SingleUse Да Да XlMain
Word 97, 2000, 2002, 2003, 2007 Нет SingleUse Да Да OpusApp
PowerPoint 97 Нет Многопользовательское использование Нет Да PP97FrameClass
PowerPoint 2000 Нет Многопользовательское использование Нет Да PP9FrameClass
PowerPoint 2002 Нет Многопользовательское использование Нет Да PP10FrameClass
PowerPoint 2003 Нет Многопользовательское использование Нет Да PP11FrameClass
PowerPoint 2007 Нет Многопользовательское использование Нет Да PP12FrameClass
Access 97 Да SingleUse Да Да OMain
Access 2000, 2002, 2003, 2007 Нет SingleUse Да Да OMain
Проект 98, 2000 Нет Многопользовательское использование Да Да JWinproj-WhimperMainClass

Имя класса окна main полезно для вызова API FindWindow, если вы хотите узнать, работает ли какой-либо экземпляр. Свойство UserControl — это логическое свойство, указывающее, будет ли серверное приложение автоматически завершать работу при выпуске последней ссылки (для параметра нет). Метод Quit позволяет переопределить свойство UserControl в случаях, когда это необходимо (например, если экземпляр не завершает работу после выпуска последней ссылки).

Как правило, корпорация Майкрософт рекомендует использовать новый экземпляр приложения Office вместо присоединения к экземпляру, который может использовать пользователь. Лучше всего создать экземпляр с помощью ProgID приложения, а затем открыть или создать новые объекты оттуда. Другие идентификаторы ProgID, такие как Excel.Sheet и Word. Документы и т. д. предназначены для использования в OLE (связывание объектов и внедрение) и могут давать несогласованные результаты при использовании с CreateObject. Используя ProgID приложения, можно избежать потенциальных проблем, явно запустив сервер для автоматизации (не внедрение).

По завершении работы с сервером автоматизации опубликуйте все ссылки на него и вызовите его метод Quit (если он доступен), чтобы сервер завершил работу должным образом. Если вы хотите настроить экземпляр с помощью службы автоматизации, а затем оставить его открытым для использования пользователем, необходимо задать для свойства UserControl значение TRUE, а затем освободить все ссылки. Затем сервер остается работающим (так как свойство UserControl имеет значение TRUE) и завершает работу соответствующим образом, когда пользователь закрывает приложение (так как отсутствуют незавершенные ссылки).

Примечание Для Word свойство UserControl доступно только для чтения. Ему не может быть присвоено значение True или False. Word всегда выполняется при выпуске последней ссылки.