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

0

Подобно тому  как  создание внешних серверов  (out of process)   начинается с по строения отдельных приложений, создание внутренних серверов (in process) начина ется  с построения библиотек DLL. Можно  воспользоваться уже существующей  биб лиотекой DLL или создать  совершенно новую, дважды щелкнув на пиктограмме DLL в диалоговом окне New Items (меню File пункт New).

НА ЗАМЕТКУ

Более подробная информация о методах разработки библиотек DLL приведена в главе

6, “Динамически компонуемые библиотеки”. А в настоящем разделе предполагается, что читатель уже имеет представление о создании подобных приложений.Как уже упоминалось, чтобы  успешно работать в качестве внутреннего сервера ав томатизации, библиотека DLL должна  экспортировать четыре функции, определения которых  присутствуют в модуле  ComServ: DllGetClassObject(), DllCanUnload- Now(),  DllRegisterServer() и  DllUnregisterServer(). Добавьте  эти   четыре функции в раздел exports проекта так, как показано в листинге 15.5.

Листинг 15.5. IPS.dpr — файл проекта внутреннего сервераlibrary IPS;

uses

ComServ,

IPSMain in ‘IPSMain.pas’,

IPS_TLB in ‘IPS_TLB.pas';

exports DllRegisterServer, DllUnregisterServer, DllGetClassObject, DllCanUnloadNow;

{$R *.TLB}

begin end.Объект автоматизации добавляется в проект DLL точно так же, как и в проект ис полняемого файла, —  с помощью мастера объектов автоматизации Automation Object Wizard. Для данного проекта добавим  лишь одно свойство и один метод,  как показано на рис. 15.7. Текст библиотеки типов в версии Object  Pascal приведен в листинге 15.6.

Рис. 15.7. Проект IPS в окне редактора библиотеки типов

Листинг 15.6. IPS_TLB.pas — файл импорта библиотеки типов для проекта внутреннего сервера

unit IPS_TLB;

// ************************************************************ //

// ВНИМАНИЕ

// ——–

// Типы, объявленные в этом файле, были созданы из данных

// библиотеки типов. Если эта библиотека типов будет явно или

// косвенно (через другую библиотеку типов, ссылающуюся на эту

// библиотеку типа) импортирована повторно, или с помощью команды

// ‘Refresh’ в окне Type Library Editor активизирована во время

// редактирования библиотеки типа, то все содержимое этого файла

// будет создано повторно, а все изменения, внесенные

// пользователем вручную, будут утеряны.

// ************************************************************ //

// PASTLWTR : $Revision:     1.130.3.0.1.0 $

// Файл создан 10/1/2001 1:06:49 AM из библиотеки типов,

// описанной ниже.

// ************************************************************ //

// Type Lib: G:\Doc\D6DG\Source\Ch15\Automate\IPS.tlb (1)

// LIBID: {17A05B88-0094-11D1-A9BF-F15F8BE883D4}

// LCID: 0

// Helpfile:

// DepndLst:

//      (1) v1.0 stdole, (C:\WINNT\System32\stdole32.tlb)

//      (2) v2.0 StdType, (C:\WINNT\System32\olepro32.dll)

//      (3) v1.0 StdVCL, (C:\WINNT\System32\stdvcl32.dll)

// ************************************************************ //

{$TYPEDADDRESS OFF} // Модуль должен быть скомпилирован без

// указателей, проверяемых на тип.

{$WARN SYMBOL_PLATFORM OFF}

{$WRITEABLECONST ON}

interface

uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;// ************************************************************ //

// GUID объявлены в TypeLibrary. Используются следующие префиксы:

//      Type Libraries    : LIBID_xxxx

//      CoClasses         : CLASS_xxxx

//      DISPInterfaces    : DIID_xxxx

//      Non-DISP interfaces: IID_xxxx

// ************************************************************ //

const

// Главная и вспомогательные версии библиотеки типов

IPSMajorVersion = 1;

IPSMinorVersion = 0;

LIBID_IPS: TGUID = ‘{17A05B88-0094-11D1-A9BF-F15F8BE883D4}';IID_IIPTest: TGUID = ‘{17A05B89-0094-11D1-A9BF-F15F8BE883D4}'; CLASS_IPTest: TGUID = ‘{17A05B8A-0094-11D1-A9BF-F15F8BE883D4}';

type

// ************************************************************ //

// Продолжение объявления типов, определенных в TypeLibrary

// ************************************************************ //

IIPTest = interface;

IIPTestDisp = dispinterface;

// ************************************************************ //

// Объявление компонентных классов, определенных в библиотеке типа

// (ПРИМЕЧАНИЕ. Здесь описывается каждый компонентный класс со

// своим стандартным интерфейсом)

// ************************************************************ //

IPTest = IIPTest;

// ************************************************************ //

// Interface: IIPTest

// Flags:        (4432) Hidden Dual OleAutomation Dispatchable

// GUID:         {17A05B89-0094-11D1-A9BF-F15F8BE883D4}

// ************************************************************ //

IIPTest = interface(IDispatch)

[‘{17A05B89-0094-11D1-A9BF-F15F8BE883D4}’]

function Get_MessageStr: WideString; safecall;

procedure Set_MessageStr(const Value: WideString); safecall;

function ShowMessageStr: Integer; safecall;

property MessageStr: WideString read Get_MessageStr

write Set_MessageStr;

end;

// ************************************************************ //

// DispIntf:     IIPTestDisp

// Flags:        (4432) Hidden Dual OleAutomation Dispatchable

// GUID:         {17A05B89-0094-11D1-A9BF-F15F8BE883D4}

// ************************************************************ //

IIPTestDisp = dispinterface

[‘{17A05B89-0094-11D1-A9BF-F15F8BE883D4}’]

property MessageStr: WideString dispid 1;

function ShowMessageStr: Integer; dispid 2;

end;

// ************************************************************ //

// Класс CoIPTest предоставляет методы Create и CreateRemote для

// создания экземпляров стандартного интерфейса IIPTest,

// предоставляемого компонентным классом IPTest. Эти функции

// предназначены для использования клиентами, желающими с помощью

// средств автоматизации использовать объекты компонентного

// класса, предоставляемые сервером этой библиотеки типов.

// ************************************************************ //

CoIPTest = class

class function Create: IIPTest;

class function CreateRemote(const MachineName:

end; implementation uses ComObj;

string): IIPTest;class function CoIPTest.Create: IIPTest;

begin

Result := CreateComObject(CLASS_IPTest) as IIPTest;

end;

class function CoIPTest.CreateRemote(const MachineName:

string): IIPTest;

begin

Result := CreateRemoteComObject(MachineName,

CLASS_IPTest) as IIPTest;

end;

end.Очевидно, что выше приведен простейший пример сервера автоматизации, но он предназначен всего  лишь  для иллюстрации. Свойству  MessageStr может  быть  при своено значение, которое затем  можно  отобразить с помощью функции ShowMes- sageStr(). Реализация интерфейса IIPTest содержится в модуле IPSMain.pas, код которого приведен в листинге 15.7.

Листинг 15.7. IPSMain.pas — главный  модуль  проекта внутреннего сервера автоматизации

unit IPSMain;

interface uses

ComObj, IPS_TLB;

type

TIPTest = class(TAutoObject, IIPTest)

private

MessageStr: string;

protected

function Get_MessageStr: WideString; safecall;

procedure Set_MessageStr(const Value: WideString); safecall;

function ShowMessageStr: Integer; safecall;

end;

implementation

uses Windows, ComServ;function TIPTest.Get_MessageStr: WideString;

begin

Result := MessageStr;

end;

function TIPTest.ShowMessageStr: Integer;

begin

MessageBox(0, PChar(MessageStr), ‘Your string is…’, MB_OK);

Result := Length(MessageStr);

end;

procedure TIPTest.Set_MessageStr(const Value: WideString);

begin

MessageStr := Value;

end;

initialization

TAutoObjectFactory.Create(ComServer, TIPTest, Class_IPTest,

ciMultiInstance, tmApartment);

end.

Как уже упоминалось в настоящей главе,  внутренние серверы регистрируются не так,  как внешние. Для регистрации в системном реестре внутреннего сервера вызы вается  функция DllRegisterServer(). В интегрированной среде разработки Delphi этот   процесс выполняется очень   просто,  достаточно выбрать в  меню  Run пункт Register ActiveX Server.

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

По теме:

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