Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6_TKP_ObAvt.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
341 Кб
Скачать
☆

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):

На этом разработку объекта автоматизации можно считать завершенной. Осталось только откомпилировать приложение. Выполнять регистрацию в случае внешнего сервера автоматизации не требуется - сервер регистрируется автоматически при первом запуске приложения-сервера.