- •Проблемы, решаемые с помощью технологии com
- •Основные понятия
- •Именование com-объектов
- •Понятие интерфейса
- •Основы компиляции
- •Простейший пример использования
- •Интерфейс iUnknown
- •Еще один пример
- •Com-сервер
- •Создание "настоящего" com-сервера.
- •Фабрика классов
- •Использование фабрики классов
- •ITypeLib, iTypeInfo, библиотеки типов и информация о методах сервера. Язык idl.
- •IDispatch и вызов методов "по имени"
- •IMarshall, маршалинг и взаимодействие клиента с внутренними, локальными и удаленными серверами
- •Технология ole Внедрение и связывание объектов - ole
- •Использование ole-документов в приложениях
- •Использование свойств OleContainer
- •Создание элементов управления ActiveX Понятие ActiveX.
- •Создание элементов управления ActiveX на основе vcl-компонентов
- •Создание страниц свойств
- •Создание активных форм
- •Создание локальных серверов и контроллеров автоматизации Понятие автоматизации.
- •Создание приложения, подлежащего автоматизации
- •Превращение приложения в сервер автоматизации
- •Библиотека типов
- •Реализация методов объекта автоматизации
- •Создание контроллера
- •Раннее и позднее связывание
- •Создание контроллеров для произвольных серверов автоматизации
- •Коллекции объектов внутри серверов автоматизации
- •Использование информации из библиотек типов
- •Создание коллекций объектов
- •Экспонируемые свойства и методы
- •Процессы в Windows Процессы
- •Планирование потоков
- •Приоритеты
- •Привязка к процессорам
- •Создание процессов
- •Завершение процессов
- •Создание потоков
- •Завершение потоков
- •Wait функции
- •Синхронизация потоков
- •Синхронизация процессов
- •Взаимодействие между процессами
- •Создание внутренних серверов и контроллеров автоматизации Внутренний сервер автоматизации и передача данных
- •Создание внутреннего сервера автоматизации
- •Манипуляция ресурсами в dll
- •Работа внутреннего сервера автоматизации в многопоточном режиме Понятие многопоточности. Синхронизация
- •Класс tThread
- •Пример многопоточного приложения
- •Применение com-объектов, входящих в состав Windows Создание ярлыков
- •Использование Internet Explorer в приложениях
Использование информации из библиотек типов
Отметим, что в приведенном выше примере рабочая книга и рабочие листы были созданы с применением параметров, предлагаемых по умолчанию. Каким образом можно изменить эти параметры?
Рассмотрим следующий пример кода:
XL = CreateOleObject ("Excel.Application.9");
XL.OlePropertySet ("Visible", true);
v0 = XL.OlePropertyGet ("Workbooks");
v0.OleProcedure ("Add", -4109);
Данный пример заставляет Excel создать пустой лист с диаграммой на основе шаблона, отличного от принятого по умолчанию.
Откуда в данном случае взялась константа -4109? Каким образом можно узнать, какими еще константами можно пользоваться при автоматизации с использованием данного сервера?
Ответы на эти вопросы можно получить, открыв библиотеку типов данного сервера. Сделать это можно, выбрав пункт меню "File/Open", указав в списке возможных файлов Type Library и выбрав соответствующую библиотеку типов (для Excel это Excel8.olb, для Word - MSWord8.olb). При этом по истечении некоторого времени (эти библиотеки очень велики) будут созданы файлы с описанием всех использованных констант, а также свойств и методов содержащихся в сервере объектов (в данном случае Excel_TLB.cppиExcel_TLB.hдля С++Builder либоExcel_TLB.pasдля Delphi). При создании этих файлов появятся сообщения об ошибках, связанные с тем, что в коде Excel и Word могут использоваться зарезервированные слова Object Pascal или С++.
Редактор библиотеки типов при этом представляет все вложенные объекты в виде иерархической структуры, внутри которой можно найти значения необходимых констант. В частности, в разделе шаблонов можно найти список констант, характеризующих различные типы шаблонов листов Excel.
Именно там и содержится ссылка на константу xlWBATChart = -4109, соответствующую шаблону диаграммы. При необходимости использовать в коде приложения-клиента именованные константы можно сослаться на файлExcel_TLB.hилиExcel_TLB.pasв тексте модуля приложения. Точно так же можно определить, каковы свойства и методы вложенных объектов данного сервера автоматизации:
Используя сведения о константах, объектах, свойствах и методах OLE-сервера, можно модифицировать приведенный выше пример. Теперь мы создадим в Excel график на основе данных из рабочих листов, скопируем его в буфер обмена и перенесем в документ Word (об объектах и константах которого узнаем из библиотеки типов Word), снабдив график подписью. Соответствующий код выглядит следующим образом:
Variant XL, v0, v1, v2, v22, vrange, WD, a, b, c;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
XL = CreateOleObject ("Excel.Application.9");
XL.OlePropertySet ("Visible", true);
v0 = XL.OlePropertyGet ("Workbooks");
v0.OleProcedure ("Add");
v1 = v0.OlePropertyGet ("Item", 1);
v0 = v1.OlePropertyGet ("Worksheets");
v22 = v1.OlePropertyGet ("Charts");
v22.OleProcedure ("Add");
v0.OlePropertyGet ("Item", 1)
.OlePropertySet ("Name", "Бухгалтерия желтая");
v0.OlePropertyGet ("Item", 2)
.OlePropertySet ("Name", "Бухгалтерия красная");
for (int j = 1; j < 3; j++)
{
v1 = v0.OlePropertyGet ("Item", j);
for (int i = 1; i < 11; i++)
{
v1.OlePropertyGet ("Cells").OlePropertyGet ("Item", i, 1)
.OlePropertySet ("Value", i);
v1.OlePropertyGet ("Cells").OlePropertyGet ("Item", i, 2)
.OlePropertySet ("Value", i * 5);
v2 = v1.OlePropertyGet ("Cells").OlePropertyGet ("Item", i, 2);
v2.OlePropertyGet ("Font").OlePropertySet ("Color", clBlue);
v2.OlePropertyGet ("Font").OlePropertySet ("Bold", true);
v2.OlePropertyGet ("Interior")
.OlePropertySet ("ColorIndex", 9 - 3 * j);
}
v1.OlePropertyGet ("Cells").OlePropertyGet ("Item", 11, 1)
.OlePropertySet ("Value", "=SUM(A1:A10)");
v1.OlePropertyGet ("Cells").OlePropertyGet ("Item", 11, 2)
.OlePropertySet ("Value", "=SUM(B1:B10)");
}
vrange = v0.OlePropertyGet ("Item", 1)
.OlePropertyGet ("Range", "A1:A10");
v1 = v22.OlePropertyGet ("Item", 1);
v2 = v1.OlePropertyGet ("SeriesCollection");
v2.OleProcedure ("Add", vrange);
vrange = v0.OlePropertyGet ("Item", 1)
.OlePropertyGet ("Range", "B1:B10");
v2.OleProcedure ("Add", vrange);
v1.OleProcedure ("Select");
XL.OlePropertyGet ("Selection").OleProcedure("Copy");
WD = CreateOleObject ("Word.Application.9");
WD.OlePropertySet ("Visible", true);
WD.OlePropertyGet ("Documents").OleProcedure ("Add");
a = WD.OlePropertyGet ("Documents");
b = a.OleFunction ("Item", 1);
for (int i = 1; i < 5; i++)
{
b.OlePropertyGet ("Paragraphs").OleProcedure("Add");
}
c = b.OleFunction ("Range", 1, 2);
c.OleProcedure ("Paste");
c = b.OleFunction ("Range", 3, 3);
c.OlePropertySet ("Text", "График, скопированный из рабочей книги Excel");
XL.OlePropertySet ("DisplayAlerts", false);
XL.OlePropertyGet ("Workbooks").OlePropertyGet ("Item", 1)
.OleProcedure ("SaveAs", "test.xls");
XL.OleProcedure ("Quit");
WD.OlePropertySet ("DisplayAlerts", false);
b.OleProcedure ("SaveAs", "test2.doc");
WD.OleProcedure ("Quit");
}
Итак, создав код, подобный приведенному выше, мы можем автоматизировать довольно сложный набор рутинных пользовательских операций, что может быть весьма удобно, если такие операции часто повторяются. При этом создание такого кода в общем случае, безусловно, требует гораздо меньших усилий, чем написание отдельного приложения, реализующего какие-то части функциональности Word или Excel.