Библиотека типов — это специальный двоичный ресурс, описывающий интерфейсы и методы, реализуемые 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 … 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).
![]() |
![]() |