Delphi и COM


         

Создание обработчика событий COM


Для лучшего понимания механизма обработки событий COM создадим программу, обрабатывающую события от нашего сервера. Для этого создадим проект с одной формой и добавим в него объект, реализующий интерфейс IAutoTestEvents. Этот объект реализуется в виде Automation Object.

После этого в редакторе библиотеки типов необходимо произвести следующие действия.

  1. Для созданного объекта вводим все методы, имеющиеся в интерфейсе IAutoTestEvents.
  2. В поле GUID заменяем автоматически сгенерированный идентификатор на содержимое константы DIID_IAutoTestEvents из библиотеки типов объекта IAutoEvents. Если этого не сделать, наш обработчик не удастся зарегистрировать в объекте IAutoEvents.

Нажимаем кнопку «Обновить» и в сгенерированном модуле пишем код обработчика события:

procedure TEventSink.TestEvent; begin   MessageBox(0, 'Event Fired', NIL, 0); end;

Обработчик готов, теперь в проект надо добавить код для его использования.

Добавляем к классу формы поля для хранения необходимых данных — ссылки на экземпляр обработчика событий, экземпляр объекта, точку подключения и идентификатор подключения:



type   TForm1 = class(TForm)     Button1: TButton;     procedure Button1Click(Sender: TObject);     procedure FormCreate(Sender: TObject);     procedure FormDestroy(Sender: TObject);   private     EventSink: IEventSink;     AutoTest: IAutoTest;     ConnectionPoint: IConnectionPoint;     Cookie: Integer;   end;

При создании формы создаем COM-сервер AutoTest и COM-объект обработчика событий:

procedure TForm1.FormCreate(Sender: TObject); var   Container: IConnectionPointContainer; begin   AutoTest := CreateOleObject('Project1.AutoTest') as IAutoTest;   EventSink := TEventSink.Create as IEventSink;

Запрашиваем у COM-сервера интерфейс IConnectionPointContainer:

  Container := AutoTest as IConnectionPointContainer;

Получаем ссылку на «точку подключения»:

  OleCheck(Container.FindConnectionPoint(IEventSink, ConnectionPoint));

и регистрируем в ней свой обработчик:

  OleCheck(ConnectionPoint.Advise(EventSink, Cookie)); end;

По окончании работы отключаем обработчик:

procedure TForm1.FormDestroy(Sender: TObject); begin   ConnectionPoint.UnAdvise(Cookie); end;

Теперь можно вызвать метод объекта и убедиться, что обработчик реагирует на события в нем:

procedure TForm1.Button1Click(Sender: TObject); begin   AutoTest.FireEvent; end;

Хорошая новость: проделывать все эти сложные манипуляции не обязательно. Мы сделали это в основном для демонстрации механизмов работы COM. Можно пойти другим, более простым путем. Для этого вы можете просто импортировать библиотеку типов сервера, поддерживающего события, и в мастере импорта библиотеки типов нажать кнопку Install.

После этого на закладку ActiveX палитры компонентов будет помещен компонент для работы с этим сервером, который можно просто положить на форму.

При этом сгенерированный компонент Delphi будет иметь обработчики событий для всех событий, объявленных в COM-объекте. Остается только написать для них свой код — всю работу по созданию объекта-обработчика, подключению к серверу  и трансляции его событий в события компонента VCL Delphi возьмет на себя.

КомпьютерПресс 5'2001



Содержание раздела