С помощью Visual C++ автоматизации Office
support.microsoft
В данной статье приведены ответы на часто задаваемые вопросы, касающиеся автоматизации в корпорацию Майкрософт Office из Visual C++.
Оглавление
- Что такое автоматизация?
- Я новый автоматизации, где найти хорошие ресурсы для получения дополнительных?
- Существуют различные способы автоматизации можно использовать?
- Что такое COM?
- Как вложить запущенный экземпляр приложения Office?
- Как передавать необязательные параметры?
- Как перехватывать события, доступных в приложениях Microsoft Office?
- Мой код автоматизации слишком медленно. Как ускорить вещи работу?
- Что означают эти значения огромные ошибки -2147352573 или 0x80030002,
- Что такое библиотека типов?
- Мой код автоматизации работы с Microsoft Excel 95, но дает сбой Microsoft Excel 97. Почему?
- Почему does приложения, я уверен, автоматизация остаются в памяти после моей программы закончено?
- Я знаю, что я хочу сделать как пользователь приложения Microsoft Office, но как это сделать с помощью автоматизации?
- Можно автоматизировать встроенных приложений Microsoft Office?
- Как получить доступ к моей свойства документа в документ Microsoft Office?
Вопросы и ответы
- Что такое автоматизация?
Автоматизации (ранее называвшейся OLE-автоматизацией) - это технология, позволяющая преимущества функциональности существующих программ и внедрение его в собственных приложениях. Например можно использовать Microsoft Слово проверки правописания возможности в приложение без видимых пользователям Microsoft Word. Можно даже использовать все Microsoft Excel построения диаграмм, печати и данные средства анализа. Это технологии могут значительно упростить и ускорить разработку.
- Я новый автоматизации, где найти хорошие ресурсы для получения дополнительных? Глава 24 Дэвида Kruglinski "Внутри Visual C++" (ISBN:1-57231 - 565 - 2) предоставляет общие сведения, а также некоторых замечательных примеров. Кроме того, в базе знаний корпорации Майкрософт является хорошим источником информации. Это статья сама является хорошим началом, и можно найти более конкретные ссылки в следующей статье Microsoft Knowledge Base:
152023 (http://support.microsoft.com/kb/152023/EN-US/ ) Поиск ресурсов для изучения OLE-автоматизации Если вы предпочитаете обучения на примере, пожалуйста обратитесь к следующей статье в в Microsoft Knowledge Base:
179706 (http://support.microsoft.com/kb/179706/EN-US/ ) Методические УКАЗАНИЯ Использование MFC для автоматизации Excel & создания и форматирования новой книги
- Существуют различные способы автоматизации можно использовать?
Существуют три основных способа использования автоматизации: MFC, # import, и C/C++:
- С MFC используйте Visual C++ ClassWizard для создания программы-оболочки библиотеки типов классов" из Microsoft Office. Эти классы как также для других классов MFC, таких как COleVariant, COleSafeArray, COleException, упрощение задач автоматизации. Этот метод является Обычно рекомендуется использовать другие и большая часть Microsoft Примеры знаний с помощью MFC.
- # import, новая директива, ставшие доступными с помощью Visual C++ 5.0 Создает VC ++ "смарт-указатели" из указанной библиотеки типов. Он является очень мощный, но часто не рекомендуется из-за ссылки - Подсчет проблем, которые обычно возникают при использовании Microsoft Приложения Office.
- Автоматизация C/C++ - большая сложнее, но иногда требуется Избегайте издержек с MFC или проблем с помощью директивы # import. По сути вы Работа с интерфейсами API, такие как CoCreateInstance() и COM-интерфейсов Например, интерфейс IDispatch и IUnknown.
Следует отметить, что существуют некоторые различия между Автоматизация из C++, так как COM была разработана в сравнении с простой c класс C++. Для получения дополнительных сведений обратитесь к следующей статье в в Microsoft Knowledge Base C пример:
181473 (http://support.microsoft.com/kb/181473/EN-US/ ) МЕТОДИЧЕСКИЕ Указания: Использование средств автоматизации OLE в приложении c
- Что такое COM?
Автоматизация базируется на модели компонентных объектов (COM). COM - Архитектура стандартного программного обеспечения на основе интерфейсов и рассчитаны на код, разделенных на автономные объекты. Его можно представить как расширение концепции программирования объектов ориентированного (ООП), но применимо к отдельным приложениям. Каждый объект предоставляет набор интерфейсов и все связь объектов, таких как инициализация, уведомления, и Передача данных происходит через следующие интерфейсы.
COM является также набор услуг, предоставляемых библиотек динамической компоновки (DLL) При установке операционной системы. Многие из них использует автоматизации службы. Одним из примеров является служба "Marshalling", какие пакеты клиентское приложение вызовы функции-члены сервера приложения, интерфейсы и передает тех своих аргументов для приложение-сервер. Он оказывается, что интерфейсы сервера в пространстве памяти клиента, это не так при клиент является EXE-файла выполняется внутри собственного пространства процесса. Также упаковки Получает возвращаемые значения методов сервера через процесс границы и спокойно в руки вызов клиента. Существуют многие другие службы, необходимые для автоматизации, предоставляемых различные библиотеки COM. Источники информации о тех включают "Внутри Ole - второе издание", Kraig Brockschmidt, ISBN 1-55615-843-2 "Внутри COM", Dale Rogerson - ISBN 1-57231-349-8 и"автоматизации Справочник программиста,"ISBN 1-57231-584-9.
- Как вложить запущенный экземпляр приложения Office?
Использование интерфейса API GetActiveObject(). Серверы автоматизации регистрируются в ROT (выполнение объекта таблицы), через RegisterActiveObject() API. Клиенты автоматизации можно получить на запущенный экземпляр с кодом такие как:
// 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, поиск определенного документа Присоединение к нему, а затем получение объекта приложения из него. Не существует часть кода в следующей статье Microsoft Knowledge Base для Итерация ROT и ищет имя документа:
190985 (http://support.microsoft.com/kb/190985/EN-US/ ) Методические УКАЗАНИЯ: Получение IDispatch Excel или документ Word OCX Не придется сделать это для PowerPoint, так как это одно- экземпляр приложения; может иметь только один экземпляр его выполнение.
- Как передавать необязательные параметры?
Некоторые методы имеют параметры "необязательные". В Visual Basic можно случайного исключить их при вызове метода. Тем не менее при вызове с - Visual C++, необходимо передать специальный ВАРИАНТ, у которых поле .vt VT_ERROR, DISP_E_PARAMNOTFOUND, и .scode поля. Это:
// VARIANT used in place of optional-parameters.
VARIANT varOpt;
varOpt.vt = VT_ERROR;
varOpt.scode = DISP_E_PARAMNOTFOUND;
Это действительно действия Visual Basic незаметными.
- Как перехватывать события, доступных в приложениях Microsoft Office?
По существу реализует интерфейс события, чтобы перехватить ( "приемник") и установить вспомогательное соединение с приложением ( "Источник"). В следующей статье дается пошаговое описание примеров для Microsoft Word:
183599 (http://support.microsoft.com/kb/183599/EN-US/ ) Методические УКАЗАНИЯ: Перехвата событий приложения Microsoft Word 97 с набором, с помощью VC ++ В общем случае для установки вспомогательное соединение, вы получаете сервера IConnectionPointContainer на доступный и вызвать FindConnectionPoint() с IID интерфейс событий. Это предоставляет интерфейс IConnectionPoint и Осталось является вызов выполнить Advise() для экземпляра события интерфейс. Сервер будет затем вызов через этот интерфейс, когда Эти события происходят.
- Мой код автоматизации слишком медленно. Как ускорить вещи работу?
С помощью повторяющихся является типичной причиной возникновения проблемы скорости с помощью автоматизации чтение и запись данных. Это характерно для автоматизации Excel Клиенты. Однако большинство людей не известно, что эти данные обычно можно все письменные или чтения на один раз, используя массив SAFEARRAY. Следующий см Статьи базы знаний для получения дополнительных сведений и соответствующие примеры.
186120 (http://support.microsoft.com/kb/186120/EN-US/ ) Использование MFC для автоматизации Excel и заполнение диапазона ячеек с массивом
186122 (http://support.microsoft.com/kb/186122/EN-US/ ) Использование MFC для автоматизации Excel & получения массива из диапазона
179706 (http://support.microsoft.com/kb/179706/EN-US/ ) Использование MFC для автоматизации Excel и создания и форматирования новой книги Кроме того важно отметить, что использование буфера обмена может Иногда повысить производительность. Например можно скопировать данные с целью буфер обмена, а затем сообщить серверу, чтобы вставить с помощью автоматизации. Или наоборот- наоборот; сообщить серверу, чтобы скопировать в буфер обмена и вставить в ваш приложения.
- Что делать эти огромные ошибки значений, таких как -2147352573 или 0x80030002 означает ли это?
Эти значения называются значений HRESULT и определенные в файле winerror.h. В номера настолько велики, поскольку первый бит представляет ли он Это результат ошибки. Можно использовать программу ErrLook.Exe, который поставляется с Visual C++ для преобразования числа в значимые описания.
Если требуется, чтобы программно получить описание ошибок, которые можно использовать API-Интерфейс FormatMessage(). Отображается следующий набор знаний Microsoft Дополнительные сведения и примеры использования статей FormatMessage():
186063 (http://support.microsoft.com/kb/186063/EN-US/ ) ИНФОРМАЦИЯ: Перевод ошибок автоматизации для VB/VBA
122957 (http://support.microsoft.com/kb/122957/EN-US/ ) Пример: Decode32 и Decode16 OLE код ошибки декодер Сервис ПРИМЕЧАНИЕ: При использовании Visual C++ 6.0 и иметь переменную, содержащую это значение в окне отладки Дозаписать ", hr" (без кавычек) к нему имеют Visual C++ перевод для вас!
- Что такое библиотека типов?
Библиотека типов похож на файл заголовка 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
- Мой код автоматизации работы с Excel 95, но дает сбой в Excel 97. Что происходит?
Объектной модели Excel внесения значительных изменений в версии 95 97. Microsoft Excel 95 реализованы все методы и свойства в одном Реализация интерфейса IDispatch. Это означало, что часто можно назвать методы, предназначенные для объекта x из y объекта. Это не было хорошей архитектуры Поэтому в Office 97, каждый объект имеет свой собственный отдельный интерфейс Idispatch Реализация. Это означает, что если приглашение для метода или свойства из объект x из Y, отдельный объект возникает ошибка 0x80020003, -2147352573, "Участник не найден". Чтобы избежать этой ошибки, необходимо сделать том, что базового интерфейса IDispatch делая вызов из является семантически ее. Отображается следующий набор знаний Microsoft Статей для получения дополнительной информации:
172108 (http://support.microsoft.com/kb/172108/EN-US/ ) Методические УКАЗАНИЯ: Устранение неполадок "Член не найден", 0x80020003 ошибка
- Я уверен, Автоматизация приложения остается в памяти после моей программы завершено. Что происходит?
Скорее, это обусловлено тем, что вы забыли освободить полученные интерфейс и необходимо отслеживать. Ниже приведены некоторые общие предложения и действия, которые можно будет выглядеть для:
- При использовании директивы # import, скорее всего, вам может быть запущен в одной из ошибок подсчета ссылок, связанных с ним. Зачастую ошибок может быть найдено альтернативное решение, но обычно он предпочтителен для использования одного другие методы автоматизации. директива # import не работает очень хорошо с приложениями Office так как его библиотеки типов и использование достаточно сложны. Кроме того трудно таких проблем подсчета ссылок Чтобы проследить за много вызовов COM уровня интерфейса При использовании директивы # import, обеспечивающий передачу.
- Проверьте, если вызова любых методов, таких как открытие или создание что возвращают IDispatch * (LPDISPATCH) и Игнорирование возвращаемого значение. Затем вы обрыв этот Возвращенный интерфейс и нужно будет изменить код таким образом, чтобы освободить его, когда нет нужны.
- Постепенно комментарий разделы кода, пока проблема исчезает, а затем добавить его внимательно, чтобы отследить где проблема начинается.
- Обратите внимание, некоторые приложения будут оставаться под управлением, если у пользователя "затронуты" приложения. Если это происходит во время автоматизации, Затем приложение скорее всего будет оставаться под управлением впоследствии. В Приложения Office имеют свойство "usercontrol" в приложение Объект, который пользователь может считывать и записывать изменять это поведение.
- Кроме того некоторые приложения решите остаться, если недостаточно Ошибка интерфейса пользователя "действие". Если планируется приложения, чтобы выйти из программы, затем вызвать его метод Quit() для приложения объект. Подсчет Word отключается вне зависимости от его ссылки при Выйдите из вызова. Это не ожидаемое поведение COM. Microsoft Excel, однако правильно просто скрыть сам но оставаться под управлением до всех ожидающих интерфейсы, будут освобождены. В общем случае следует освободить все необработанных ссылок, а только вызов Quit(), если предполагается приложение, чтобы завершить работу.
- Я знаю, что я хочу сделать как пользователь приложения Microsoft Office, но как сделать это программными средствами автоматизации?
Что вас интересует - это объекты, методы и свойства, необходимо использовать. Лучший способ научиться перемещаться объектные модели - Word, Excel и Powerpoint, в зависимости от того, необходимо выполнять от имени пользователя, Чтобы использовать средство записи макросов. Просто выберите "Начать запись" Macro\ Выполнение задач, которые заинтересованы в меню Сервис, затем выберите Macro\ "остановить запись." По завершении записи, выберите Macro\Macros в меню "Сервис" выберите макрос, а затем нажмите кнопку Изменить. Это требуется для созданного кода VBA, будут выполнены записанные задачи. Помните, записанный макрос не будет наилучшим образом Это возможно в большинстве случаев, но это делает код очень хорошо для быстрого пример.
- Можно автоматизировать встроенных приложений Office?
Абсолютно. Том, как получить указатель интерфейса IDispatch: предоставляется Visual C++ Техническое примечание 39 (TN039). Следующий см Статьи базы знаний для пошаговый пример:
184663 (http://support.microsoft.com/kb/184663/EN-US/ ) Методические УКАЗАНИЯ: Внедрение и автоматизировать лист Microsoft Excel С MFC
- Как получить доступ к моей свойства документа в документ Office?
Свойства документов доступны с помощью автоматизации, или непосредственно через IPropertyStorage. Следующие статьи базы знаний Майкрософт демонстрации каждого метода:
179494 (http://support.microsoft.com/kb/179494/EN-US/ ) Использование автоматизации для извлечения встроенных свойств документа
186898 (http://support.microsoft.com/kb/186898/EN-US/ ) Методические УКАЗАНИЯ: Чтение свойств составных документов непосредственно с VC ++
|