Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Delphi (Колосов).pdf
Скачиваний:
77
Добавлен:
11.05.2015
Размер:
2.57 Mб
Скачать

Обычно создание COM–сервера сопровождается созданием соответствующей библиотеки типов, предназначенной для документирования информации об объектах, интерфейсах, функциях и т.д. Для ее создания на страничке ActiveX есть значок Type Library. Традиционно для создания библиотек типов предназначен язык описания интерфейсов IDL (Interface Description Language). В Delphi в качестве основного варианта используются синтаксис и операторы языка Object Pascal. Для работы с библиотекой типов используется специальный редактор, который можно найти, пройдя путь Windows *_TLB.pas Editor. Библиотека создается как обычный текстовый файл с расширением Pas и окончанием _TLB в названии. Редактор типов может экспортировать библиотеку из текстового формата в формат IDL (двоичный), что обеспечивает использование созданных объектов в любых других приложениях Windows. Библиотека типов дает возможность при создании клиента контролировать правильность обращения к методам сервера еще на этапе проектирования. С другой стороны, можно импортировать в проект любую библиотеку типов, зарегистрированную в системе. Для этого следует пройти путь Project Import Type Library.

27. ТЕХНОЛОГИЯ АВТОМАТИЗАЦИИ

27.1. Основы OLE Automation

Стандарт COM основан на едином для всех языков программирования формате таблицы, описывающей ссылки на методы объекта, реализующего интерфейс. Однако вызов методов из этой таблицы доступен только для тех языков программирования, для которых есть трансляторы, переводящие весь текст программы в язык машинных кодов. Такой доступ к методам называется ранним связыванием. Для использования возможностей COM в интерпретирующих (скриптовых) языках программирования, таких как

VBScript, Java, Perl и др., была разработана технология OLE Automation,

которая позволяет вызывать методы объекта не по адресу, а по имени. Технология автоматизации базируется на COM, однако накладывает на

COM–серверы ряд дополнительных требований:

1.Интерфейс, реализуемый COM–сервером, должен наследоваться от

IDispatch.

2.Должны использоваться типы данных из числа поддерживаемых OLE Automation (Byte, SmallInt, Integer, Currency, Single, Real48, Real, Double, ShortString, AnsiString, TDateTime, WordBool, Variant, OLEVariant).

3.Все методы должны быть процедурами или функциями, возвращающими значение типа HResult.

4.Все методы должны иметь соглашение о вызовах, соответствующее директиве safecall.

Центральным элементом технологии автоматизации является интерфейс

IDispatch. В нем определяются методы GetIdsOfNames и Invoke, позволяющие клиенту узнать, поддерживает ли сервер метод с указанным именем, а затем, если метод поддерживается, вызвать его. Такой способ доступа к методам

132

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

Для контроля правильности вызова методов на этапе проектирования используется дополнительный диспинтерфейс (DispInterface). Он имеет тот же GUID, что и основной интерфейс, только его имя дополняется окончанием disp и каждому методу или свойству присваивается уникальный номер, который называется диспетчерским идентификатором (DISPID). Теперь методы сервера можно вызывать прямо через Invoke, передавая ему значение DISPID соответствующего метода. Следует отметить, что в описании диспинтерфейса могут присутствовать не все методы и свойства основного интерфейса.

Например, в библиотеке типов MS Office дано следующее определение интерфейса ICommandBarsEvents и его диспинтерфейса:

ICommandBarsEvents = interface(IDispatch) ['{55F88892-7708-11D1-ACEB-006008961DA5}'] procedure OnUpdate; stdcall;

end;

ICommandBarsEventsDisp = dispinterface ['{55F88892-7708-11D1-ACEB-006008961DA5}'] procedure OnUpdate; dispid 1;

end;

Такое двойное описание интерфейса позволяет клиентам обращаться к методам сервера или по стандартам COM раннего связывания через таблицу виртуальных методов (VTable) или использовать позднее связывание через методы IDispatch. Большинство OLE–серверов реализуют двойной интерфейс.

27.2. Примеры использования серверов автоматизации

Позднее связывание

В данном примере создается Ole объект Word приложения из MS Office, в нем создается новый документ, в который записывается текущая дата, и он сохраняется на диске.

Users ….ComObj;

procedure TForm1.Button1Click(Sender: TObject); var v:olevariant;

begin

v:=CreateOleObject('Word.Application'); // Создание Word сервера V.Application.documents.add(); // Создание нового документа

//Записываем текущую дату v.Application.ActiveDocument.Range.InsertAfter(Now);

//Сохраняем документ на диске

v.Application.ActiveDocument.SaveAs('d:\my\d1.doc'); v.Application.Quit(True,0); // Закрываем сервер

end;

133

На этапе проектирования данной программы Delphi не дает никаких подсказок по написанию методов и свойств объектов и не проверяет правильность их использования. Ошибки могут возникнуть только на этапе выполнения программы.

Использование Dispatch–интерфейса

Здесь создается Word–сервер с помощью методов Dispatch–интерфейса и открывается существующий на диске файл. При этом не используются никакие компоненты доступа к серверам автоматизации:

Users …comobj, OleServer, WordXP;

procedure TForm1.Button2Click(Sender: TObject); var v:OLEVariant;

Word1:_ApplicationDisp; // Определяем указатель на DispInterface begin

v:='d:\my\d1.doc'; // Задаем имя файла

//Создаем Word–сервер с помощью метода диспетчерского интерфейса

Word1:=CoWordApplication.Create as _ApplicationDisp;

//Открываем документ

(Word1.Documents as DocumentsDisp).Open(v,

//Далее идут пустые параметры типа OleVariant

Emptyparam,Emptyparam,Emptyparam,Emptyparam,Emptyparam,

Emptyparam,Emptyparam,Emptyparam,Emptyparam,Emptyparam,

Emptyparam,Emptyparam,Emptyparam,Emptyparam);

//Показываем имя файла документа и путь к нему

ShowMessage((Word1.Application as _application). ActiveDocument.Path+' '+

(Word1.Application as _application).ActiveDocument.Name);

// Закрываем сервер

Word1.Quit(Emptyparam,Emptyparam,Emptyparam);

end;

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

Использование VTable интерфейса

В этом примере из странички компонентов Servers на форму помещается компонент WordApplication1. После нажатия кнопки Button3 открывается документ d1.doc и в нем производится замена набора символов «@1» на текущую дату и время. Измененный таким образом документ записывается в файл d2.doc:

procedure TForm1.Button3Click(Sender: TObject); var v1,v2,oldstr,newstr,replaceend:OleVariant; begin

v1:='d:\my\d1.doc';// Исходный документ v2:='d:\my\d2.doc';// Выходной документ WordApplication1.Documents.Open(v1, // Открываем документ

Emptyparam,Emptyparam,Emptyparam,Emptyparam,Emptyparam,

134

Emptyparam,Emptyparam,Emptyparam,Emptyparam,Emptyparam,

Emptyparam,Emptyparam,Emptyparam,Emptyparam); Replace:=1; // Определяем параметр замены Oldstr:='@1'; // Заменяемый шаблон

Newstr:=Datetostr(now); // Строка замены

While // Цикл замен

WordApplication1.ActiveDocument.Range(Emptyparam,Emptyparam). Find.Execute(oldstr, Emptyparam,Emptyparam,Emptyparam,Emptyparam,Emptyparam, Emptyparam,Emptyparam,Emptyparam,Newstr,replace, Emptyparam,Emptyparam,Emptyparam,Emptyparam)

do;

WordApplication1.ActiveDocument.SaveAs(v2, // Сохраняем документ

Emptyparam,Emptyparam,Emptyparam,Emptyparam,Emptyparam,

Emptyparam,Emptyparam,Emptyparam,Emptyparam,Emptyparam,

Emptyparam,Emptyparam,Emptyparam,Emptyparam,Emptyparam);

// Закрываем сервер

WordApplication1.ActiveDocument.Close(Emptyparam,Emptyparam,

Emptyparam);

end;

В данном примере методы сервера вызываются напрямую с использованием таблицы VTable, что значительно ускоряет работу программы по сравнению с применением позднего связывания.

27.3. Компоненты ActiveX

Задачу визуального представления COM–объектов выполняет технология ActiveX. С точки зрения программиста, ActiveX – это черный ящик, обладающий свойствами, методами и событиями. С точки зрения модели объектов COM, элемент управления ActiveX – это сервер, поддерживающий технологию автоматизации, реализованный в виде динамической библиотеки, исполняемый в адресном пространстве клиента и допускающий визуальное редактирование.

С Delphi поставляется ряд компонентов ActiveX, которые находятся на одноименной страничке палитры компонент.

Можно включить в палитру компонентов Delphi любой компонент ActiveX, зарегистрированный в системном реестре. Для этого нужно пройти путь: Component Import ActiveX Control, выбрать нужный компонент и нажать клавишу Install. С другой стороны, можно любой компонент или любую форму Delphi сделать компонентом ActiveX. В первом случае, пройдя путь: File New, на страничке ActiveX выберем значок ActiveX Control. В появившемся окне зададим необходимые параметры для реализации нового ActiveX компонента. Во втором случае на страничке ActiveX выберем значок Active Form. Задав имя нового компонента ActiveX, имя модуля Unit для реализации компонента, имя проекта, тип потоковой модели элемента ActiveX и сохранив

135