Главная » Delphi » Создание сервера автоматизации

0

Delphi  существенно упрощает работу  по созданию серверов автоматизации обоих типов  — как внешнего, так и внутреннего. Процедура создания сервера автоматизации сводится к выполнению четырех действий.

1.  Создайте приложение или библиотеку DLL, которые будут субъектом  автомати зации.  В качестве отправной точки  можно  даже использовать одно из уже суще ствующих  приложений, к которому будут добавлены средства поддержки авто матизации. Это единственное действие, где проявляется реальное различие между созданием внутреннего и внешнего серверов.

2.  Создайте объект автоматизации и добавьте его в проект. Delphi  поддерживает эксперт объектов автоматизации, который позволит пройти данный этап  без особых  затруднений.

3.  Используя библиотеку типов, добавьте в объект автоматизации свойства и ме тоды.  Именно эти свойства и методы  будут предоставлены контроллерам авто матизации.

4.  Реализуйте методы, созданные Delphi  по описанию, в библиотеке типов.

Создание внешнего сервера автоматизации

В настоящем разделе речь  пойдет о создании простого внешнего сервера автоматизации. Откройте новый проект и поместите в главную форму компоненты TShape и TEdit, как показано на рис. 15.2. Сохраните проект под именем Srv.dpr.

Теперь добавим в проект объект автоматизации. Для это

го необходимо в меню  File выбрать пункт  New. В раскрыв шемся диалоговом окне  New Items перейдите во вкладку ActiveX  и   дважды   щелкните  на   пиктограмме  Automation

Object   (рис. 15.3).    Откроется   диалоговое   окно    мастера

Automation Object Wizard, показанное на рис. 15.4.

end.Рассмотрим подробнее этот модуль. Вначале  объявляется версия библиотеки типов, а затем — уникальный идентификатор GUID  для нее — LIBID_Srv. Это значение иден тификатора GUID будет использовано при регистрации библиотеки типов  в системном реестре. Затем  приводятся значения для перечисления TxShapeType. Самое  интерес ное в данном  перечислении то, что его значения объявляются как константы, а не с ис пользованием перечислимого типа  Object Pascal. Эти перечисления подобны перечис лениям в C/C++, которые, в отличие от перечислений в Object Pascal, не обязаны начи наться с нулевого элемента и представлять собой ряд последовательных значений.

Затем в модуле Srv_TLB объявляется интерфейс IAutoTest. В этом объявлении при сутствуют свойства и методы, созданные в редакторе библиотеки типов.  Кроме  того,  не трудно заметить, что методы  Get_XXX и Set_XXX создаются как методы  чтения и записи для каждого свойства.

Соглашение о вызовах Safecall

Это — стандартное соглашение о вызовах для методов, введенных в редакторе биб- лиотеки типов (см. приведенное выше объявление интерфейса IAutoTest). Однако ключевое слово safecall несет в себе несколько большую нагрузку, чем просто со- глашение о вызове. Поясним, что имеется в виду. Во-первых, метод должен вызывать- ся с использованием соглашения о вызове safecall. Во-вторых, метод будет инкап- сулирован так, чтобы возвращать значение типа HResult. Например, предположим, что существует метод, который в Object Pascal выглядит следующим образом:

function Foo(W: WideString): Integer; safecall;

На самом деле этот метод компилируется в следующую строку программного кода: function Foo(W: WideString; out RetVal: Integer): HResult; stdcall; Преимущество соглашения safecall состоит в том, что все исключения перехваты- ваются до того, как они будут переданы в вызывающий метод. При возникновении вметоде safecall необработанного исключения, оно обрабатывается неявной оболоч- кой с преобразованием в значение типа HResult, которое и возвращается вызываю- щему методу.

Далее  в модуле Srv_TLB следует  объявление dispinterface объекта автоматиза ции IAutoTestDisp. Ключевое слово dispinterface сообщает вызывающему методу о том, что методы  автоматизации могут быть выполнены с помощью метода  Invoke(), но при этом не имеется в виду пользовательский интерфейс, с помощью которого могут выполняться такие  методы.  Несмотря на то что интерфейс IAutoTest может  быть ис пользован как инструмент разработки, который поддерживает автоматизацию с приме нением раннего связывания, благодаря объявлению dispinterface объекта Iauto- TestDisp можно применять средства, поддерживающие позднее связывание.

Затем  в модуле Srv_TLB объявляется класс CoAutoTest, который весьма  облегча ет процесс создания объекта автоматизации, в результате чего  для создания экземп ляра этого объекта достаточно вызвать метод CoAutoTest.Create().

Наконец, в модуле  Srv_TLB создается класс  TAutoTest, превращающий сервер в

компонент, который можно поместить в палитру компонентов. Эта возможность появи

лась лишь в Delphi 5 и относится скорее к импортируемым, чем к вновь создаваемым сер

верам автоматизации.

Как уже упоминалось в настоящей главе,  первый раз созданное приложение запус кается  для выполнения регистрации в системном реестре. Далее  в этом  разделе речь пойдет  о том, как использовать приложение контроллер для управления сервером.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии