
- •Тема 6. Особенности разработки пакетов прикладных программ
- •Определение ппп и его составные части
- •. 2.16. Вариант классификации ппп по функциональному назначению
- •Иными словами, функциональная связь в модели предметной области представляется:
- •Способы применения ппп и задача управления процессами
- •Способы динамического запуска вычислительных процессов
- •. Рис. 2.18. Запуск внешней программы с замещением родительского процесса
- •Например, оператор
- •If (execlp("f1.Ехе","Fl.Exe", null)) ShowMessage ("Программа Fl.Exe не выполнена");
- •Реализация динамического обмена данными методом dde
- •Таким образом, взаимодействие dde может выполнять следующие операции:
- •Во время же выполнения программы эти свойства могут быть установлены методом SetLink, который описывается следующим образом:
- •Основы архитектуры сом
- •Основы автоматизации ole
- •Элементы управления ActiveX
- •Организация приложений с несколькими потоками
- •Заголовочный файл Unit2.H:
Основы автоматизации ole
Технология автоматизации (OLE Automation) разработана на основе технологии СОМ. Так же как и СОМ, автоматизация позволяет использовать функции одних приложений в других приложениях. Автоматизация — это механизм обмена информацией между процессами в операционной системе Windows, с помощью которого одна прикладная программа может управлять другой. Технология OLE Automation обеспечивает выполнение базовых функций, позволяющих обособленным программным модулям связываться и обмениваться информацией.
Многие используемые в технологии автоматизации термины подобны тем, которые применяются при описании технологии СОМ.
Объект автоматизации не имеет принципиальных отличий от объекта СОМ и представляет собой отдельный, самодостаточный объект, разработанный для выполнения специфической задачи или функции. Отличие от объекта СОМ заключается только в том, что доступ к объектам автоматизации осуществляется через специальные интерфейсы, называемые интерфейсами диспетчеризации (dispinterface). Интерфейсы диспетчеризации похожи на обычные интерфейсы СОМ, но позволяют упростить обращение к объекту автоматизации.
Сервер и контроллер автоматизации
Сервер автоматизации представляет собой исполняемый модуль, который может включать в себя несколько объектов автоматизации.
Серверы автоматизации также подразделяются на внутренние (in-process) и внешние (out-process). Внутренние серверы являются динамическими библиотеками, которые выполняются в адресном пространстве клиента автоматизации. Внешние серверы представляют собой самостоятельные приложения, которые выполняются в отдельных процессах по отношению к клиенту автоматизации. Каждый из типов серверов имеет свои преимущества. Главным достоинством внутренних серверов является высокая скорость обмена данными с клиентом, которая достигается за счет того, что DLL-библиотеки работают в одном процессе с клиентом. Кроме того, DLL-серверы обычно более просты в отладке и тестировании, чем серверы-приложения. С другой стороны, внешние серверы более выгодны с точки зрения изоляции ошибок. В случае использования внешних серверов даже аварийное завершение работы клиента не приведет к сбою в работе сервера.
Контроллером автоматизации принято называть клиентское приложение, управляющее объектом автоматизации.
Контроллер автоматизации для управления объектом автоматизации использует методы интерфейсов этого объекта. Для получения информации об интерфейсах служат библиотеки типов.
Библиотеки типов, интерфейс IDispatch
Информация о типах обычно хранится в файлах формата tlb (Type Library) или olb (Object Library). В библиотеках типов содержится следующая информация:
информация о перечислениях;
описания интерфейсов и интерфейсов диспетчеризации;
описания классов составных объектов;
ссылки на описания типов из других библиотек типов.
Для доступа к объектам автоматизации не требуется информации о типах. Однако наличие информации о типах позволяет производить проверку синтаксиса кода, используемого для обращения к методам интерфейсов объектов автоматизации, на стадии компиляции приложения.
Базовый интерфейс автоматизации (интерфейс диспетчеризации) называется IDispatch и представляет собой интерфейс СОМ, являющийся наследником интерфейса IDnknown. Отличие интерфейса диспетчеризации от обычного интерфейса СОМ заключается в способе вызова методов интерфейса. Методы интерфейса вызываются с помощью специального метода Invoke. Объект автоматизации обязательно должен иметь дополнительный интерфейс, в котором указываются все методы, доступные через метод Invoke. Каждому методу этого интерфейса соответствует идентификатор, который называется диспетчерским (dispid). Реализация этого метода подобна оператору case: на основе указанного диспетчерского идентификатора выбирается метод, который должен быть выполнен. Благодаря такой организации объекту автоматизации требуется всего одна таблица виртуальных методов — для интерфейса IDispatch. Все остальные методы вызываются посредством метода Invoke этого интерфейса.
Создание серверов автоматизации в Delphi
Создание сервера автоматизации в Delphi в целом подобно созданию сервера СОМ Однако объекты автоматизации обладают рядом дополнительных функциональных возможностей, а их создание имеет ряд особенностей.
Объект автоматизации в Delphi создается на основе класса TAutoObject, который является потомком класса TTypedCOMObject.
Разработка клиента автоматизации
Использование объекта автоматизации в приложениях не вызывает особых сложностей. Мы уже довольно подробно обсуждали этот вопрос в предыдущей главе, рассматривая взаимодействие с приложениями MS Office.
При использовании позднего связывания создание экземпляра объекта автоматизации и получение указателя на его интерфейс выполняется с помощью функции CreateOleObject(const ClassName: string): IDispatch. В качестве параметра данной функции передается строка, содержащая имя сервера автоматизации и имя объекта автоматизации. Для сервера, рассмотренного в приведенном выше примере, эта строка выглядит следующим образом: 'AutoServer.TestAuto'.
Для работы с объектами автоматизации используется специальный тип переменных — OleVariant. Таким образом, чтобы получить доступ к методам объекта автоматизации, следует объявить переменную типа OleVariant и создать объект с помощью функции CreateOleObject:
var S: OleVariant; ... S := CreateOleObject('AutoServer.TestAuto');
После этого методы объекта автоматизации можно вызывать как обычные методы любого объекта ObjectPascal: S.Method1(Param1.Param2);
Однако при этом следует помнить, что компилятор не может проверить корректность вызова методов, так как не имеет о них никакой информации. Поэтому предпочтительнее использовать позднее связывание. Для этого в модуле приложения-клиента следует объявить модуль библиотеки типов объекта автоматизации и работать с ним как с обычным СОМ-объектом.