- •Разработка объекта автоматизации в среде delphi.
- •6.6 Методические указания.
- •6.6.1 Расширения com
- •6.6.2 Мастера для создания сом-объектов
- •6.6.3 Технология автоматизации
- •6.6.4. Интерфейс iDispatch
- •6.6.5. Интерфейсы диспетчеризации
- •6.6.6 Создание серверов автоматизации в Delphi
- •6.6.6.1 Создание внешнего сервера автоматизации.
- •6.6.6.2 Разработка клиента автоматизации
- •7.6.7 Использование ole-документов в приложениях
- •6.6.7.1 Основные сведения об ole-документах
- •6 .6.7.2 Компонент tOleContainer.
- •6.6.7.3 Применение компонента tOleContainer для работы с ole-документами.
- •6.6.7.3.1 Простейший пример использования компонента tOleContainer.
- •6.6.7.3.2 Основные способы использование компонента tOleContainer.
- •6.6.7.3.3 Управление объектом внутри ole-контейнера
6.6.5. Интерфейсы диспетчеризации
При создании полноценных серверов автоматизации, к которым могут обращаться контроллеры, не имеющие полной информации о функциях сервера, необходимо реализовывать интерфейсы диспетчеризации. Они являются наследниками интерфейса IDispatch, но для их объявления используется специальное зарезервированное слово dispinterface, а перечисляемые в нем методы и свойства должны снабжаться целочисленными идентификаторами, которые вставляются в конце описания методов (свойств) после зарезервированных слов dispid (рис. 6.3):
С
войства
должны иметь атрибут только для чтения
или только для записи. Все возвращаемые
функциями и свойствами результаты, а
также все параметры обращения к методам
должны иметь один из следующих типов:
Byte, Currency, Real, Double, real48,
Integer, Single, Smallint, AnsiString, ShortString,
TDateTime, Variant, OleVariant, WordBool или любой
интерфейсный тип. За исключением
директивы default, которую можно указать
для свойства-массива, никакие другие
директивы доступа в объявлении методов
и свойств не допускаются.
Интерфейсы диспетчеризации работают на основе позднего связывания.
6.6.6 Создание серверов автоматизации в Delphi
Создание сервера автоматизации в Delphi в целом подобно созданию сервера СОМ. Однако объекты автоматизации обладают рядом дополнительных функциональных возможностей, а их создание имеет ряд особенностей.
Объект автоматизации в Delphi создается на основе класса TAutoObject, который является потомком класса TTypedCOMObject.
Рассмотрим пример создания сервера автоматизации. В качестве примера создадим объект автоматизации, выполняющий те же функции, что и рассмотренный ранее (см. лабораторную работу 5-TKP) объект СОМ. Данный объект автоматизации включим в состав внешнего сервера
6.6.6.1 Создание внешнего сервера автоматизации.
Создание внешнего сервера автоматизации в Delphi включает выполнение следующих шагов:
1. Создание нового приложения-сервера.
2. Создание объекта автоматизации.
3. Создание интерфейсов, а также заголовков методов и свойств интерфейсов объекта автоматизации.
4. Задание кода методов интерфейса.
Как видно, процесс создания сервера автоматизации включает те же действия, что и процесс создания сервера СОМ.
Создание приложения-сервера. Приложение-сервер автоматизации представляет собой обычное приложение, включающее в себя, по крайней мере один объект автоматизации. Создание такого приложения не имеет никаких особенностей. Чтобы создать новое приложение-сервер автоматизации, достаточно выбрать команду File | New Application главного меню Delphi IDE.
Создание объекта автоматизации. После того как приложение-сервер создано, следует включить в него новый объект автоматизации. Для этого выберите команду File | New, затем перейдите в открывшемся окне диалога New Items на вкладку ActiveX и щелкните на значке Automation Object. После щелчка на кнопке ОК окна диалога New Items производится запуск мастера создания объекта автоматизации, в окне которого необходимо задать параметры создаваемого объекта.
В окне Automation Object Wizard указываются следующие параметры:
CoClass Name - имя класса объекта автоматизации (в нашем примере назовем класс TestAuto);
Instancing - определяет способ создания объекта. Данный параметр аналогичен одноименному параметру объекта СОМ;
Threading Model - задает вариант работы сервера с потоками. Аналогичен параметру настройки потоков для СОМ-сервера;
Generate Event support code - определяет, включать ли в создаваемый объект автоматизации поддержку обработки событий (не устанавливать). Программирование событий в некоторой степени усложняет код модуля объекта автоматизации и представляет собой нетривиальную задачу. Поэтому, пока мы эти вопросы рассматривать не будем.
П
осле
щелчка на кнопке ОК в окне Automation
Object
Wizard
будет создан новый объект автоматизации
и откроется окно редактора библиотеки
типов. Теперь мы можем просмотреть текст
модуля объекта автоматизации (в нашем
примере назовем его AutoObjectUnit)
(рис. 6.4):
Можно просмотреть и код библиотеки типов (модуль AutoServer_TLB) вновь созданного объекта автоматизации, который, в отличие от объекта СОМ, включает описание нескольких интерфейсов.
Интерфейс ITestAuto называется дуальным и предназначен для работы с объектом TTestAuto.
Дуальные интерфейсы являются наследниками интерфейса IDispatch и обеспечивают как связывание с объектом во время компиляции (ранее связывание через таблицу виртуальных методов), так и позднее связывание, используемое в технологии автоматизации.
Интерфейс диспетчеризации ITestAutoDIsp обеспечивает взаимодействие с объектом на основе технологии автоматизации.
Создание интерфейсов и методов объекта автоматизации. Так же как и при разработке объекта СОМ, интерфейсы и методы объекта автоматизации создаются с помощью редактора библиотеки типов. Для упрощения примера создадим только один интерфейс, который будет содержать методы вычисления среднего значения и дисперсии. Следует отметить, что создание методов интерфейса для объекта автоматизации имеет одну особенность, которая заключается в том, что результат, возвращаемый функцией, может иметь только тип HRESULT. В этом случае метод является процедурой, поэтому для передачи рассчитанного значения в клиентское приложение следует использовать параметр вызова процедуры.
Таким образом, в нашем примере при вызове метода следует использовать два параметра: первый используется для передачи данных объекту автоматизации, а второй - для получения результата от объекта автоматизации. Создание нового метода интерфейса и изменение его имени производится точно так же, как и при разработке объекта СОМ. Тип результата HRESULT присваивается методу по умолчанию, поэтому обычно изменять значение в списке Return Type не требуется. Создание первого параметра метода также полностью аналогично предыдущему примеру, рассмотренному для объекта СОМ. А вот задание второго параметра имеет особенности, связанные с тем, что через этот параметр объект автоматизации возвращает результат клиентскому приложению. Поэтому данный параметр должен передаваться по ссылке, а не по значению и иметь атрибут out. Чтобы указать, что параметр передается по ссылке, следует просто добавить символ «*» к имени типа параметра в столбце Туре списка Parameters (для вещественного типа – float *).
Чтобы задать параметру атрибут out (говорящий о том, что параметр является выходным), используется столбец Modifier списка Parameters. При щелчке в этом столбце списка в поле ввода появляется кнопка с многоточием. Щелчок на этой кнопке открывает окно диалога Parameter Flags, в котором устанавливаются дополнительные атрибуты параметра. В нашем примере следует установить флажок Out.
Параметры вызова для обоих методов в рассматриваемом примере одинаковы и описываются в редакторе библиотеки типов. После создания всех методов и описания всех параметров щелкните на кнопке Refresh панели инструментов редактора библиотеки типов. При этом внесенные изменения будут отражены в файле библиотеки типов (модуль AutoServer_TLB). При просмотре этого модуля следует обратить внимание на то, что в описании каждого метода интерфейса диспетчеризации присутствует ключевое слово dispid, за которым следует целое число. Таким способом производится присваивание диспетчерских идентификаторов, которые используются при вызове методов интерфейса с помощью метода Invoke. Заголовки методов интерфейса будут добавлены и в описание класса TTestAuto.
Кроме того, в модуль описания класса объекта автоматизации будут добавлены заготовки для написания кода реализации методов, заголовки которых мы создали в редакторе библиотеки типов. Код реализации этих методов будет незначительно отличаться от кода, заданного нами в предыдущем примере (где мы рассматривали создание объекта СОМ) для аналогичных методов. Различия будут связаны только с тем, что результат возвращается не через значение функции, а через параметр процедуры (рис. 6.5):
На этом разработку объекта автоматизации можно считать завершенной. Осталось только откомпилировать приложение. Выполнять регистрацию в случае внешнего сервера автоматизации не требуется - сервер регистрируется автоматически при первом запуске приложения-сервера.
