Delphi и COM


         

Сервер с библиотекой типов


Библиотека типов — это специальный двоичный ресурс, описывающий интерфейсы и методы, реализуемые COM-сервером. Кроме наличия библиотеки типов сервер должен поддерживать интерфейс IProvideClassInfo. В Delphi такой сервер реализуется путем наследования его от TTypedComObject. Для этого оставьте флажок Include Type Library в мастере создания COM-объекта включенным.

Создадим COM-сервер в виде EXE (разумеется, он может быть также создан и виде DLL).

Сначала создадим новый проект — File-New Application, а затем добавим в него COM-объект.

Если не отключать флажок Include Type Library, то мастер создаст уже не один, а два модуля. Первый из них напоминает созданный ранее.

unit Unit1; interface uses   Windows, ActiveX, Classes, ComObj, Project1_TLB, StdVcl; type   TTest1 = class(TTypedComObject, ITest1)   protected     {Declare ITest1 methods here}   end; implementation

uses ComServ; initialization   TTypedComObjectFactory.Create(ComServer, TTest1, Class_Test1,     ciMultiInstance, tmApartment); end.

Наиболее интересна строка: uses … Project1_TLB. Это автоматически сгенерированный интерфейсный модуль к нашему COM-объекту (аналогично TestInterface.pas в предыдущем примере). Он содержит описание всех необходимых для работы с сервером интерфейсов. В отличие от предыдущего примера, вам не придется  редактировать его вручную. Для этого Delphi откроет редактор библиотеки типов:

Это специализированный редактор для описания интерфейсов COM-объектов. Вы должны описать все требуемые интерфейсы, методы и т.п. в этом редакторе, после чего можно нажать кнопку  «Обновить» — и изменения будут автоматически внесены во все требуемые модули. Вам останется лишь дописать реализацию методов.

Добавим описание нового метода. Для этого щелкнем правой кнопкой мыши на интерфейсе ITest и выберем из  контекстного меню опцию New->Method. Введем имя метода — ShowIt.

На закладке Parameters зададим параметр S и тип BSTR. После этого нажмем кнопку «обновить» и посмотрим, что произошло с исходными текстами нашей программы. В модуле Project1_TLB в описании интерфейса ITest1 появился метод ShowIt:

  ITest1 = interface(IUnknown)     ['{1302FB06-703F-11D4-84DD-825B45DBA617}']     function ShowIt(const S: WideString): HResult; stdcall;   end;

А в модуле Unit1:

type   TTest1 = class(TTypedComObject, ITest1)   protected     function ShowIt(const S: WideString): HResult; stdcall;   end; implementation uses ComServ; function TTest1.ShowIt(const S: WideString): HResult; begin end;

Нам остается лишь написать реализацию метода:

function TTest1.ShowIt(const S: WideString): HResult;  begin   MessageBoxW(0, PWideChar(S), NIL, 0)   Result := S_OK; // Стандартный код успешного завершения end;

Для регистрации сервера достаточно один раз запустить его на компьютере клиента.

Перейдем к написанию приложения-клиента. При наличии модуля Project_TLB оно ничем не будет отличаться от предыдущего примера. Более интересен случай, когда мы имеем только исполняемый файл с сервером. Зарегистрируем этот сервер и выберем в меню Delphi IDE команду Project -> Import Type Library.

В открывшемся окне найдем строку с описанием библиотеки типов требуемого сервера.

Если включен флажок Generate Component Wrappers, то в импортированный модуль будет добавлен код для создания компонента Delphi, который можно поместить на форму — и он автоматически создаст требуемый COM-сервер и позволит обращаться к его методам. В противном случае будет сгенерирован модуль, содержащий описание всех имеющихся в библиотеке типов интерфейсов.

Далее необходимо определить, что вы собираетесь сделать с выбранной библиотекой:

Install — создает модуль с описанием интерфейсов и автоматически регистрирует требуемые компоненты в IDE. После этого остается лишь поместить их на форму;
Create Unit — создает интерфейсный модуль, но не устанавливает его в IDE. Это удобно, если вам нужны только описания интерфейсов  либо если вы хотите вручную установить его в package, отличающийся от используемого по умолчанию.

 

Таким образом, для распространения и использования сервера не требуется ничего, кроме его исполнимого модуля. Но это не самое главное. Гораздо более важно, что вы можете импортировать и использовать в своей программе любой из имеющихся на компьютере COM-серверов. Естественно, что при передаче своей программы клиенту вы должны установить на его компьютере соответствующий COM-сервер.

Для примера используем в своем приложении процессор регулярных выражений VBScript. Импортируем библиотеку типов Microsoft VBScript Regular Expressions.

При этом будет создан файл VBScript_RegExp_TLB.pas.

Создадим форму и добавим следующий код для проверки вхождения текста, содержащегося  в компоненте Edit1, в текст, содержащийся в компоненте  Edit2:

uses   VBScript_RegExp_TLB; procedure TForm1.Button1Click(Sender: TObject); var   RE: IRegExp; begin   RE := CoRegExp.Create;   RE.Pattern := Edit1.Text;   if RE.Test(Edit2.Text) then     Caption := 'TRUE'   else     Caption := 'FALSE'; end;

Это все! Мы получили в своем приложении поддержку регулярных выражений — такую же, как и та, что включена в скриптовые языки Microsoft (VBScript и JScript).



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