Функции для создания (активизации) СОМ объектов в Delphi


Способы активизации СОМ-объектов клиентом

В Delphi предусмотрено несколько способов для активизации СОМ-объекта клиентом:
• Для создания одного экземпляра объекта можно использовать функцию API CoCreatelnstance:
OIeCheck(CoCreateInstance(Clsid, // CLSID объекта требуемого класса
Nil, // Нужно для агрегирования (не используем)
I, // Тип сервера (1, 4, 16 удаленный)
IID, // Идентификатор требуемого интерфейса
рСоm)); // Указатель на запрашиваемый интерфейс

• Для создания одного экземпляра объекта можно также использовать функцию Delphi — CreateComObject(Const Clsid: TGUID): IUnknown:

pSum:=CreateComObject(Class_Sum) As ISum;

Эта функция фактически инкапсулирует функцию CoCreatelnstance, поэтому выполняет все необходимые действия, возлагаемые на эту функцию, но всегда возвращает указатель только на интерфейс IUnknown. Для получения указателя на требуемый интерфейс следует воспользоваться безопасным приведением типа с помощью оператора As.

• Если СОМ-объект создавался с использованием библиотеки типов, то в тексте библиотеки типов автоматически будет объявлен еще один класс -CoClass (Component Class), включающий два классовых метода: Create и СгеateRemote. Реализации этих методов фактически инкапсулируют функции Delphi по созданию локального и удаленного объекта. В частности, Create инкапсулирует функцию CreateComObject. Полное имя CoClass состоит из имени класса объекта и префикса Со.

В этом случае СОМ-объект может быть создан следующим образом:
pSum:=CoSum.Create; // Sum — имя класса
• Для создания нескольких объектов следует воспользоваться фабрикой классов и функцией API CoGetClassObject:

Var pClFr: IClassFactory;
Const IID_ IClassFactory: ТIID)='{00000001-0000-0000-СООО-000000000046}';
Begin
CoGetClassObject(Class_Sum, 1, Nil, IID_ICIassFactory, pClFr);/получ. Указат. на фабр.
pClFr.CreateInstance(Nil, ISum, pSum);

• Если Clsid класса объекта не известен, то можно воспользоваться
функцией Delphi ProglDToClassID и программным идентификатором:

Var Clid: TGUID; Begin
ClId:=ProgIDToClassID('ComDLL.Sum'); // ComDLL.Sum — программное имя. CoGetClassObject(ClId, 1, Nil, IID_ICIassFactory, pClFr);
pClFr.CreateInstance(Nil, ISum, pSum);

Регистрация и удаление СОМ-сервера из реестра

а) Системный реестр. Данные о каждом СОМ-сервере находятся в двух разделах системного реестра, доступ к которому предоставляется после активизации утилиты RegEdit:
HKEY_CLASSES_ROOT и
HKEY_LOCAL_MACHINE\SOFTWARE\Classes
Прежде всего, в каждом из разделов системного реестра размещаются секции, названия которых совпадают с именем сервера и именем фабрики класса. Если сервер имеет несколько фабрик класса, то для каждой из них создается своя секция. В подразделе Clsid находится GUID класса

Далее в реестре размещается путь и имя СОМ-сервера.
б) Для регистрации СОМ-серверов предусмотрено несколько способов:
• Run\Register ActiveX Server
• Внешние серверы саморегистрируются после первого запуска. Можно запустить приложение на соответствующем компьютере с ключом:
<имя сервера> /regserver
• Регистрацию сервера в реестре можно произвести и с помощью утилиты RegSvr32.Exe:
C:\Wmdows\System\RegSvr32 <путь>\<MyServ.Dll>
• Для регистрации может быть создан REG-файл.
Кроме того, можно создать *.Bat-файл, с помощью которого можно произвести регистрацию. Пусть имя файла — Reg.Bat и его содержимое имеет следующий вид:
RegEdit /S MyReg.Reg
• Внутренний сервер можно зарегистрировать и из программы клиента с помощью процедуры: RegisterComServer(Const DLLName: String);

в) Для удаления сервера также предусмотрено несколько вариантов:
• Удалить сведения из реестра о внутреннем сервере, созданном с помощью Delphi, можно с помощью команды системного меню Delphi:
Run\UnRegister ActiveX Server
• Можно удалить сведения из реестра о внешнем сервере, запустив приложение на соответствующем компьютере с ключом:
<имя сервера> /unregserver
• Удалить сервер можно также и с помощью утилиты RegSvr32.Exe:
C:\Windows\System\RegSvr32 /u <wymb>\<MyAuto.Ocx>


Комментарии запрещены.




Статистика