Поведение 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 всегда выполняется при выпуске последней ссылки.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по