Поделиться через


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

Итоги

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

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

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

GetObject

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

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, другой серверный процесс может быть запущен или не запущен. Это может быть важное различие для принятия решения о том, следует ли принудительно завершить работу экземпляра службы автоматизации. Например, с сервером MultiUse, если экземпляр уже запущен перед подключением к нему, может потребоваться избежать программного завершения работы сервера при завершении его автоматизации.

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

Приложения Видимо Создание экземпляров Имеет UserControl Has QuitClassName Имя класса
Excel 97, 2000, 2002, 2003, 2007 No SingleUse Да Да XlMain
Word 97, 2000, 2002, 2003, 2007 No SingleUse Да Да OpusApp
PowerPoint 97 No MultiUse No Да PP97FrameClass
PowerPoint 2000 No MultiUse No Да PP9FrameClass
PowerPoint 2002 No MultiUse No Да PP10FrameClass
PowerPoint 2003 No MultiUse No Да PP11FrameClass
PowerPoint 2007 No MultiUse No Да PP12FrameClass
Access 97 Да SingleUse Да Да OMain
Access 2000, 2002, 2003, 2007 No SingleUse Да Да OMain
Project 98, 2000 No MultiUse Да Да JWinproj-WhimperMainClass

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

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

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

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