Автоматизация Office с помощью Visual C++

Аннотация

В этой статье приведены ответы на часто задаваемые вопросы об автоматизации для Microsoft Office из Visual C++.

Дополнительная информация

Оглавление

  1. Что такое автоматизация?

  2. Я не знаю, где я могу найти хорошие ресурсы для получения дополнительных сведений?

  3. Существуют ли различные способы использования автоматизации?

  4. Что такое COM?

  5. Как присоединиться к запущенному экземпляру приложения Office?

  6. Как передавать необязательные параметры?

  7. Как перехватить события, предоставленные приложениями Office?

  8. Мой код автоматизации слишком медленный. Как можно ускорить работу?

  9. Что такое огромные значения ошибки, например 2147352573 или 0x80030002, означают?

  10. Что такое библиотека типов?

  11. Мой код автоматизации работал в Microsoft Excel 95, но не работает в Microsoft Excel 97. Именно?

  12. Почему приложение, которое я автоматизирую, остается в памяти после завершения работы программы?

  13. Я знаю, что я хочу сделать в качестве пользователя приложения Microsoft Office, но как это сделать с помощью автоматизации?

  14. Можно ли автоматизировать внедренное приложение Microsoft Office?

  15. Как получить доступ к свойствам документа в документе Microsoft Office?

Вопросы и ответы

  1. Что такое автоматизация? Автоматизация (ранее — OLE Automation) — это технология, которая позволяет использовать возможности существующей программы и внедрять ее в свои собственные приложения. Например, вы можете использовать возможности проверки орфографии и грамматики Microsoft Word в приложении без отображения Microsoft Word для пользователей. Вы также можете использовать все инструменты для построения диаграмм, печати и анализа данных в Microsoft Excel. Эта технология может значительно упростить и ускорить разработку.

  2. Я не знаю, где я могу найти хорошие ресурсы для получения дополнительных сведений? Глава 24 из Дэвида Kruglinski "в Visual C++" (ISBN: 1-57231-565-2) предоставляет общий обзор, а также некоторые полезные примеры. Кроме того, база знаний Майкрософт — это хороший источник информации. Эта статья является хорошим запуском, и вы можете найти более конкретные ссылки в следующей статье базы знаний Майкрософт:

    152023 Обнаружение ресурсов для изучения OLE Automation Если вы предпочитаете изучить пример, ознакомьтесь со статьей ниже в базе знаний Майкрософт:

    179706 Использование MFC для автоматизации Excel & создание и форматирование новой книги

  3. Существуют ли различные способы использования автоматизации? Существует три основных способа использования автоматизации: MFC, #import и C/C++.

    • В MFC используйте ClassWizard Visual C++ для создания "класс-оболочки" из библиотек типов Microsoft Office. Эти классы, а также другие классы MFC, такие как COleVariant, COleSafeArray, COleException, упрощают задачи автоматизации. Этот метод обычно рекомендован для других пользователей, и большинство примеров базы знаний Майкрософт используют MFC.

    • #import, Новая директива, которая стала доступна в Visual C++ 5,0, создает смарт-указатели VC + + из заданной библиотеки типов. Это очень мощное, но часто не рекомендуется из-за проблем с подсчетом ссылок, которые обычно возникают при использовании с приложениями Microsoft Office.

    • Программирование на языке C/C++ значительно сложнее, но иногда необходимо для устранения непроизводительных ресурсов MFC или проблем с #import. По сути, вы работаете с такими API как CoCreateInstance () и COM-интерфейсы, например IDispatch и IUnknown.

    Важно отметить, что между автоматизацией в C++ и в сравнении с простым C, поскольку модель COM была разработана на основе класса C++. Для получения дополнительных сведений обратитесь к следующей статье Microsoft Knowledge Base для примера C:

    181473 Использование OLE Automation из приложения C

  4. Что такое COM? Автоматизация основывается на модели компонентных объектов (COM). COM — это стандартная архитектура программного обеспечения, основанная на интерфейсах, и разработанная для разделения кода на автономные объекты. Рассматривайте его как расширение парадигмы объектно-ориентированного программирования (OOP), но применимо для отдельных приложений. Каждый объект предоставляет набор интерфейсов и все коммуникации между объектом, например инициализация, уведомления и передача данных, выполняются через эти интерфейсы. COM также является набором служб, предоставляемых библиотеками динамической компоновки (DLL), которые устанавливаются вместе с операционной системой. Автоматизация использует многие из этих служб. Одним из примеров является служба маршалирования, которая упаковывает вызовы клиентским приложением функций-членов интерфейсов серверного приложения и передает эти данные вместе с их аргументами в серверное приложение. Это означает, что интерфейсы сервера выводятся в пространстве памяти клиента, что не так, когда клиент является исполняемым exe-приложением, работающим в собственном пространстве процесса. Кроме того, упаковка возвращает возвращаемые значения из методов сервера обратно в рамках процесса и безопасно в руки звонка клиента. Существует множество других служб автоматизации, предоставляемых различными библиотеками COM. Источники информации об этих возможностях включают "внутренняя версия OLE-Second Edition" с помощью Kraig Brockschmidt, ISBN 1-55615-843-2, "Inside COM", Николай Rogerson-ISBN 1-57231-349-8 и "Справочник программиста по автоматизации", ISBN 1-57231-584-9.

  5. Как присоединиться к запущенному экземпляру приложения Office? Используйте API GetActiveObject (). Серверы автоматизации регистрируются в таблице ROT (на запущенных таблицах объектов) с помощью API RegisterActiveObject (). Клиенты автоматизации могут получить доступ к запущенному экземпляру с помощью такого кода, как:

          // Translate server ProgID into a CLSID. ClsidFromProgID      // gets this information from the registry.      CLSID clsid;      CLSIDFromProgID(L"Excel.Application", &clsid);        // Get an interface to the running instance, if any..      IUnknown *pUnk;      HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);      ASSERT(!FAILED(hr));      // Get IDispatch interface for Automation...      IDispatch *pDisp;      hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);      ASSERT(!FAILED(hr));      // Release the no-longer-needed IUnknown...      pUnk->Release();

    Примечание. Если вы хотите прикрепить несколько экземпляров приложения Office, вы сможете присоединиться только к первому экземпляру, который был запущен с помощью API GetActiveObject (). Теоретически вы можете выполнить итерацию объектов ROT для каждого отдельного экземпляра, но приложения Office не регистрируют себя, если другой экземпляр уже находится в таблице ROT, так как моникер для самого себя всегда одинаков (в этом случае он не может быть различен). Это означает, что вы не можете присоединиться к экземпляру, кроме первого. Тем не менее, так как приложения Office также регистрируют свои документы в таблице ROT, вы можете успешно присоединиться к другим экземплярам, выполнив итерацию в таблице ROT для определенного документа, подключив его и получая из него объект приложения. Ниже приведен код для итерации в таблице ROT и поиск имени документа в следующей статье Microsoft Knowledge Base:

    190985 Практическое руководство: получение IDispatch документа Excel или Word из OCX Это не требуется для PowerPoint, так как это приложение с одним экземпляром; Вы можете использовать только один экземпляр программы.

  6. Как передавать необязательные параметры? Некоторые методы имеют "необязательные" Параметры. В Visual Basic можно случайно опустить их при вызове метода. Однако при вызове с помощью Visual C++ необходимо передать специальный вариант, поле VT которого имеет VT_ERROR и поле. SCODE DISP_E_PARAMNOTFOUND. То есть:

          // VARIANT used in place of optional-parameters.      VARIANT varOpt;      varOpt.vt = VT_ERROR;      varOpt.scode = DISP_E_PARAMNOTFOUND;

    На самом деле, Visual Basic выполняется за кулисами.

  7. Как перехватить события, предоставленные приложениями Office? По сути, вы реализуете интерфейс событий, который вы хотите перехватить ("Sink"), и намерены настроить советы-связь с приложением ("источник"). В следующей статье приведены пошаговые примеры для Microsoft Word.

    183599 Практическое руководство: перехват событий приложения Microsoft Word97 с помощью VC + + Как правило, для настройки вспомогательного подключения вы получаете сервер IConnectionPointContainer и вызовите FindConnectionPoint () с IID интерфейса события. Таким образом, вы получаете интерфейс IConnectionPoint, и все осталось вызвать метод advise () с экземпляром интерфейса события. После этого сервер снова будет вызывать этот интерфейс при возникновении этих событий.

  8. Мой код автоматизации слишком медленный. Как можно ускорить работу? Наиболее распространенной причиной проблем с производительностью при автоматизации является повторяющиеся чтение и запись данных. Это типично для клиентов автоматизации Excel. Однако большинство пользователей не знают о том, что эти данные могут быть написаны и прочитаны сразу с помощью SAFEARRAY. Дополнительные сведения и информативные примеры описаны в указанных ниже статьях Microsoft Knowledge Base.

    186120 Использование MFC для автоматизации Excel и заливка диапазона с помощью массива.

    186122 Использование библиотеки MFC для автоматизации Excel & получения массива из диапазона

    179706 Использование библиотеки MFC для автоматизации Excel и создания и форматирования новой книги Кроме того, важно отметить, что использование буфера обмена может иногда повысить производительность. Например, вы можете скопировать данные в буфер обмена, а затем использовать автоматизацию, чтобы сообщить серверу о необходимости вставки. Или наоборот; Запросите сервер копировать в буфер обмена и вставьте в приложение.

  9. Что эти огромные значения ошибки, такие как-2147352573 или 0x80030002, означают? Эти значения известны как HRESULTs и определяются в файле Winerror. h. Числа очень велики, так как первый бит указывает на то, что это является результатом ошибки. Вы можете использовать служебную программу ErrLook. exe, которая входит в состав Visual C++, чтобы перевести эти числа в осмысленные описания. Если вы хотите программно получить описание ошибок, можно использовать API FormatMessage (). Для получения дополнительных сведений и примеров использования FormatMessage () обратитесь к следующим статьям Microsoft Knowledge Base.

    186063 ИНФОРМАЦИЯ: перевод ошибок автоматизации для VB/VBA

    122957 Пример: инструменты декодера кода ошибки OLE Decode32 и Decode16Примечание. Если вы используете visual c++ 6,0 и у вас есть переменная, содержащая это значение в окне контрольного значения отладки, добавьте ", HR" (без кавычек), чтобы приложение Visual C++ переменяло его.

  10. Что такое библиотека типов? Библиотека типов аналогична файлу заголовка C/C++. Он содержит интерфейсы, методы и свойства, которые публикует сервер. Библиотеку типов можно просмотреть с помощью средства просмотра объектов OLE/COM (oleview. exe), которое входит в состав Visual C++. Ниже приведен список имен файлов библиотеки типов для Microsoft Office 95, 97 и 2000. Office Application | Type library ------------------------+---------------- Word 95 and prior | wb70en32.tlb Excel 95 and prior | xl5en32.olb Powerpoint 95 and prior | Powerpoint.tlb Access 95 and prior | msaccess.tlb Binder 95 | binder.tlb Schedule+ | sp7en32.olb Project | pj4en32.olb Team Manager | mstmgr1.olb Word 97 | msword8.olb Excel 97 | excel8.olb Powerpoint 97 | msppt8.olb Access 97 | msacc8.olb Binder 97 | msbdr8.olb Graph 97 | graph8.olb Outlook 97 | msoutl8.olb Outlook 98 | msoutl85.olb Word 2000 | msword9.olb Excel 2000 | excel9.olb Powerpoint 2000 | msppt9.olb Access 2000 | msacc9.olb Outlook 2000 | msoutl9.olb Word 2002 | msword.olb Excel 2002 | excel.exe Powerpoint 2002 | msppt.olb Access 2002 | msacc.olb Outlook 2002 | msoutl.olb

  1. Мой код автоматизации работал с приложением Excel 95, но не работает в Excel 97. Что происходит? Объектная модель для Excel внесла существенные изменения с версии 95 на 97. В Excel 95 реализованы все методы и свойства в одной реализации интерфейса IDispatch. Это означало, что часто вы можете вызвать методы, предназначенные для объекта X, от объекта Y. Это не было хорошим дизайном, поэтому в Office 97 у каждого объекта есть своя отдельная реализация IDispatch. Это означает, что если вы запрашиваете метод или свойство из объекта X из отдельного объекта Y, вы получаете сообщение об ошибке 0x80020003,-2147352573, "член не найден". Чтобы избежать этой ошибки, необходимо убедиться, что базовый интерфейс IDispatch, из которого вы звоните, является семантически правильным. Для получения дополнительных сведений обратитесь к следующим статьям Microsoft Knowledge Base.

    172108 Практическое руководство: Устранение неполадок "участник не найден", ошибка 0x80020003

  2. Приложение, которое я автоматизирую, остается в памяти после завершения работы программы. Что происходит? Скорее всего, это обусловлено тем, что вы захотите выпустить приобретенный интерфейс, и вам нужно его отслеживать. Ниже приведены некоторые общие рекомендации и элементы, которые необходимо искать.

    • Если вы используете #import, это может быть вызвано тем, что вы работаете в одной из ошибок, связанных с подсчетом ссылок. Часто ошибки можно обойти, но обычно предпочтительнее использовать один из других методов автоматизации. #import не прекрасно работает с приложениями Office, так как их библиотеки типов и использование довольно сложны. Кроме того, проблемы, связанные с подсчетом ссылок, трудно отслеживать, так как при использовании #import используются многие вызовы COM на уровне интерфейсов.

    • Убедитесь, что вы вызываете какие-либо методы, такие как Open или New, которые возвращают IDispatch * (LPDISPATCH), и не пропускает возвращаемое значение. Если это так, то вы отпадаете от этого возвращаемого интерфейса и вам потребуется изменить код таким образом, чтобы отпустить его, если он больше не нужен.

    • Постепенно закомментируйте разделы кода, пока проблема не исчезнет, а затем снова добавьте ее, чтобы отслеживать начало проблемы.

    • Обратите внимание, что некоторые приложения будут оставаться на связи, если пользователь "затронут" приложение. Если это произошло при автоматизации, приложение, скорее всего, не будет выполняться позже. В приложениях Office есть свойство UserControl для объекта Application, которое можно прочитать или записать, чтобы изменить это поведение.

    • Кроме того, некоторые приложения будут продолжать работу, если на вашем компьютере возникло достаточное действие. Если вы планируете выйти из приложения, вызовите его метод Quit () для объекта Application. Приложение Word будет закрыто независимо от количества ссылок при вызове "выход". Это не является ожидаемым поведением COM. Тем не менее Excel будет правильно скрываться, но продолжать работу, пока не будут освобождены все необработанные интерфейсы. В общем случае следует освобождать все необработанные ссылки, и только вызывайте функцию Quit (), если вы планируете завершить работу приложения.

  3. Я знаю, что я хочу сделать в качестве пользователя приложения Office, но как это сделать с помощью автоматизации? Интересующий вас объект, методы и свойства, которые нужно использовать. Лучший способ научиться переходить по объектной модели Word, Excel и PowerPoint в зависимости от того, что вы хотите сделать, — это использование средства записи. Просто выберите макрос "записать новый макрос" в меню Сервис, выполните требуемую задачу, а затем выберите макрос "остановить запись". Завершив запись, выберите в меню Сервис пункт Macro\Macros, выберите записанный макрос и нажмите кнопку Изменить. Откроется созданный код VBA, который будет выполнять записанную задачу. Имейте в виду, что записанный макрос не является лучшим кодом в большинстве случаев, но это очень удобно для быстрого примера.

  4. Можно ли автоматизировать внедренное приложение Office? Позиционирование. Хитрость получает указатель IDispatch: это задается в технической заметке Visual C++ 39 (TN039). Пошаговые инструкции можно найти в следующей статье Microsoft Knowledge Base:

    184663 Практическое руководство: внедрение и автоматизация листа Microsoft Excel с помощью MFC

  5. Как получить доступ к свойствам документа в документе Office? Свойства документа можно получить с помощью автоматизации или напрямую через IPropertyStorage. В следующих статьях базы знаний Майкрософт показано каждый из этих методов.

    179494 Выбор: использование автоматизации для извлечения встроенных свойств документов

    186898 Практическое руководство: чтение свойств составных документов непосредственно с помощью VC + +

Нужна дополнительная помощь?

Совершенствование навыков
Перейти к обучению
Первоочередный доступ к новым возможностям
Присоединение к программе предварительной оценки Майкрософт

Были ли сведения полезными?

Спасибо за ваш отзыв!

Благодарим за отзыв! Возможно, будет полезно связать вас с одним из наших специалистов службы поддержки Office.

×