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