Перейти к основному контенту
Поддержка
Войдите с помощью учетной записи Майкрософт
Войдите или создайте учетную запись.
Здравствуйте,
Выберите другую учетную запись.
У вас несколько учетных записей
Выберите учетную запись, с помощью которой нужно войти.

Аннотация

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

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

    179706 HowTO Use MFC to Automate Excel & создания и форматирования новой книги

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

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

    • С помощью MFC используйте Visual C++ ClassWizard для создания "классов-оболочки" из библиотек типов 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++.
     

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

    Автоматизация основана на компонентной объектной модели (COM). COM — это стандартная архитектура программного обеспечения, основанная на интерфейсах и предназначенная для разделения кода на автономные объекты. Это можно рассматривать как расширение парадигмы объектно-ориентированного программирования (ООП), но применимо к отдельным приложениям. Каждый объект предоставляет набор интерфейсов, и все взаимодействие с объектом, например инициализация, уведомления и передача данных, происходит через эти интерфейсы.

    COM также представляет собой набор служб, предоставляемых библиотеками динамической компоновки (DLL), установленными в операционной системе. Автоматизация использует многие из этих служб. Одним из примеров является служба маршаллинга, которая упаковывает вызовы клиентского приложения в функции-члены интерфейсов серверного приложения и передает их с их аргументами в серверное приложение. Это делает вид, что интерфейсы сервера предоставляются в пространстве памяти клиента, что не происходит, когда клиент является .exe работает в собственном пространстве процессов. Маршаллинг также получает возвращаемые значения из методов сервера обратно через границы процесса и безопасно в руки вызова клиента. Существует множество других служб, необходимых для автоматизации, которые предоставляются различными библиотеками COM. Источники информации о них включают "Inside Ole - Second Edition" Крайга Брокшмидта, ISBN 1-55615-843-2, "Inside COM" Дейла Роджерсона - ISBN 1-57231-349-8 и "Automation Programmer's Reference", 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 для поиска определенного документа, прикрепив к нему, а затем получив из него объект Application.
    Вам не нужно делать это для PowerPoint, так как это приложение с одним экземпляром; Вы можете запустить только один экземпляр.

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

    Некоторые методы имеют необязательные параметры. В Visual Basic их можно случайно опустить при вызове метода . Однако при вызове с помощью Visual C++ необходимо передать специальное значение VARIANT, поле .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?

    В основном вы реализуете интерфейс событий, который требуется перехватывать ("приемник"), и настраиваете консультативное подключение с приложением ("источник").

    Как правило, чтобы настроить подключение рекомендаций, вы получаете сервер IConnectionPointContainer и вызываете FindConnectionPoint() с IID интерфейса события. Это предоставляет интерфейс IConnectionPoint, и все, что осталось, — вызвать Advise() с экземпляром интерфейса событий. Затем сервер будет выполнять обратный вызов через этот интерфейс при возникновении этих событий.

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

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

    179706 ПРАКТИЧЕСКОЕ РУКОВОДСТВО. Использование MFC для автоматизации Excel и создания и форматирования новой книги
    Кроме того, важно отметить, что иногда использование буфера обмена может повысить производительность. Например, можно скопировать данные в буфер обмена, а затем использовать автоматизацию, чтобы сообщить серверу о необходимости вставки. Или наоборот; сообщите серверу о копировании в буфер обмена и вставьте его в приложение.

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

    Эти значения называются HRESULT и определены в winerror.h. Числа настолько велики, так как первый бит представляет, является ли это результатом ошибки. Для преобразования этих чисел в осмысленные описания можно использовать служебную программу ErrLook.Exe, которая поставляется с Visual C++.

    Если вы хотите программно получить описание ошибок, можно использовать API FormatMessage().

    ПРИМЕЧАНИЕ. Если вы используете Visual C++ 6.0 и имеете переменную, содержащую это значение в окне контрольных значений отладки, добавьте ", hr" (без кавычек) к ней, чтобы visual C++ переведет его за вас!

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

    Библиотека типов аналогична файлу заголовка C/C++. Он содержит интерфейсы, методы и свойства, которые публикует сервер. Библиотеку типов можно просмотреть с помощью средства просмотра объектов OLE/COM (Oleview.exe), которое поставляется с Visual C++. Ниже приведен список имен файлов библиотек типов для Microsoft Office 95, 97 и 2000:



    Office Application | Библиотека
    типов ------------------------+----------------
    Word 95 и предыдущие | wb70en32.tlb
    Excel 95 и предыдущие | xl5en32.olb
    PowerPoint 95 и предыдущие | Powerpoint.tlb
    Доступ к версии 95 и более | msaccess.tlb
    Binder 95 | binder.tlb
    Планирование и | 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
    Граф 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 "Member not found". Чтобы избежать этой ошибки, необходимо убедиться, что базовый интерфейс IDispatch, из которых вы выполняете вызовы, является семантически правильным.
     

  2. Приложение, которое я автоматизую, остается в памяти после завершения программы. Что происходит?

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

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

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

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

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

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

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

    Вас интересуют объекты, методы и свойства, которые необходимо использовать. Лучший способ узнать, как перемещаться по объектным моделям Word, Excel и Powerpoint в зависимости от того, что вы хотите сделать в качестве пользователя, — использовать средство записи макросов. Просто выберите Макрос\'Записать новый макрос' в меню Сервис, выполните интересующую вас задачу, а затем выберите Макрос\'Остановить запись'. Завершив запись, выберите Макрос\Макросы в меню Сервис, выберите записанный макрос и нажмите кнопку Изменить. Это приведет к созданному коду VBA, который выполнит записанную задачу. Имейте в виду, что записанный макрос в большинстве случаев не будет лучшим возможным кодом, но он очень хорошо подходит для быстрого примера.

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

    Абсолютно. Фокус заключается в получении указателя IDispatch: он указан в техническом примечании 39 Visual C++ (TN039).
     

  5. Разделы справки доступ к свойствам документа в документе Office?

    Свойства документа доступны через службу автоматизации или напрямую через IPropertyStorage.
     

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

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.

В сообществах можно задавать вопросы и отвечать на них, отправлять отзывы и консультироваться с экспертами разных профилей.

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

Насколько вы удовлетворены качеством перевода?
Что повлияло на вашу оценку?
После нажатия кнопки "Отправить" ваш отзыв будет использован для улучшения продуктов и служб Майкрософт. Эти данные будут доступны для сбора ИТ-администратору. Заявление о конфиденциальности.

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

×