Главная » Delphi » Объекты COM и фабрики классов

0

Кроме  поддержки одного  или нескольких интерфейсов, которые происходят от ин терфейса IUnknown, и реализации счетчика ссылок  для отслеживания своего  срока  су ществования, объекты COM  имеют  еще  одну специфическую особенность: они  созда ются специальными объектами, называемыми фабриками классов (class factories). Каждый класс  COM  имеет  соответствующую фабрику  класса,  которая отвечает за создание эк земпляров объектов данного класса  COM.  Фабрика класса —  это  специальный объект COM,  поддерживающий интерфейс IClassFactory. Данный интерфейс определен в модуле ActiveX следующим образом:

type

IClassFactory = interface(IUnknown)

[‘{00000001-0000-0000-C000-000000000046}’]

function CreateInstance(const unkOuter: IUnknown;

const iid: TIID; out obj): HResult; stdcall;

function LockServer(fLock: BOOL): HResult; stdcall;

end;

Метод  CreateInstance() вызывается для  создания экземпляра объекта COM, связанного с данной фабрикой класса. Параметр unkOuter этого  метода  указывает  на управляющий интерфейс IUnknown, если объект создается в качестве некоего агрега та (понятие агрегирования, или  сборки разъясняется в настоящей главе  далее).  Па раметр iid содержит идентификатор интерфейса (IID),  с помощью которого можно управлять объектом. Параметр obj должен  содержать указатель  на интерфейс, опре деленный параметром iid.

Метод LockServer() вызывается для хранения сервера COM в памяти даже в том случае, если на сервер не ссылается ни один клиент. Если параметр fLock равен True, то счетчик блокировок сервера увеличивается на единицу.  Если же параметр fLock ра вен False, то счетчик блокировок сервера уменьшается на единицу.  Если в результате счетчик ссылок сервера окажется равен  0 (означая отсутствие использующих его клиен тов), то данный сервер COM выгружается из памяти.Классы TComObject и TComObjectFactory

В Delphi  существует  два класса,  инкапсулирующие объекты COM и фабрики клас сов: TComObject и TComObjectFactory. Класс  TComObject содержит инфраструк туру необходимую  для поддержки интерфейса  IUnknown и создания объектов с по мощью  класса  TComObjectFactory. Подобным же  образом класс  TComObjectFac- tory поддерживает интерфейс IClassFactory и “умеет” создавать объекты класса TComObject. Проще всего  создать   объект COM  с  помощью мастера  COM  Object Wizard, пиктограмма которого расположена во вкладке ActiveX диалогового окна New Items. В листинге 15.1 приведен псевдокод модуля,  созданного этим  мастером. Дан ный псевдокод иллюстрирует отношения между упомянутыми классами.

Листинг 15.1. Псевдокод модуля сервера COM

unit ComDemo;

{$WARN SYMBOL_PLATFORM OFF}

interface uses

Windows, ActiveX, Classes, ComObj;

type

TSomeComObject = class(TComObject, поддерживаемые интерфейсы)

Здесь объявляются методы класса и интерфейса

end;

const

Class_SomeObject: TGUID =

‘{CB11BA07-735D-4937-885A-1CFB5312AEC8}';

implementation uses ComServ;

Здесь находится реализация объекта TSomeComObject

initialization

TComObjectFactory.Create(ComServer,

TSomeObject, Class_SomeObject,

SomeObject‘, ‘The SomeObject class‘, ciMultiInstance, tmApartment);

end;Класс,  производный от  класса  TComServer, объявляется и реализуется подобно большинству других классов  VCL. Параметры, переданные конструктору Create() класса  TComObjectFactory, связывают этот  потомок класса  TComServer с соответ ствующим объектом TComObjectFactory. Первый параметр конструктора — это объ ект  TComServer.  В  качестве  такого  параметра  практически  всегда  передается  гло бальный объект ComServer, объявленный в модуле ComServ. Вторым параметром яв ляется класс TComObject, который необходимо связать  с фабрикой класса,  а третий параметр — это идентификатор CLSID класса COM TComObject. Четвертый и пятый параметры —  это  строки имени и  описания класса,  используемые  для  регистрации класса  COM  в системном реестре.  Шестой параметр указывает   экземпляр объекта COM и, наконец, последний параметр указывает потоковую модель объекта.

Экземпляр класса  TComObjectFactory создается в разделе инициализации моду ля; в этом  случае фабрика класса  обязательно будет доступна  для создания экземпля ров  объекта COM сразу после  загрузки  сервера COM.  Выполнение загрузки  сервера COM зависит от его типа,  т.е., от того,  является ли данный сервер внутренним (DLL) или внешним (приложение).

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

По теме:

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