Интерфейс фабрики классов и его методы в Delphi


Фабрики классов используются для создания экземпляров объектов СОМ-объекты не порождаются приложением-клиентом. Вместо этого в СОМ используется механизм, названный генератором классов. Генераторы классов — это объекты, чье главное предназначение — создавать другие объекты. В Delphi фабрики классов для СОМ-объектов создаются автоматически.

Фабрики классов являются полноценными СОМ-объектами и доступ к ним также осуществляется через интерфейсы. Фабрики классов реализуют интерфейс IClassFactory, производного от интерфейса IUnknown и содержащего всего два дополнительных метода:
CreateInstance(Const unkOuter: IUnknown; Const IID: TGUID; Out Obj) — создает новый экземпляр класса, объекты которого может создавать данная фабрика.

LockServer(fLook: BOOL) — позволяет управлять загрузкой сервера в памяти, принудительно увеличивая (fLook=Trm) или уменьшая (fLook=False) счетчик ссылок.

Внутренние («in-process») серверы должны экспортировать стандартную функцию (DllGetClassObject), которая после запуска сервера создает экземпляр фабрики класса. Он с помощью метода Createlnstance и создает экземпляр объекта.

Локальные серверы также реализуют фабрику классов, и после запуска сервера регистрируют ее в таблице активных объектов, чтобы механизм peaлизации СОМ мог получить указатель на интерфейс IClassFactory и создать экземпляр объекта.

Для запуска СОМ-сервера и получения ссылки на фабрику класса можно воспользоваться вызовами следующих функций из приложения-клиента:
CoGetClassObject — запускает фабрику класса, используя CLSID класса объекта и IID интерфейса фабрики класса (обычно это интерфейс IClassFactory) ProglDToClassID(Const ProgID: String): TGUID;- запускает фабрику класса используя имя СОМ-сервера для получения идентификатора. Далее происходит так, как
при использовании функции CoGetClassObject (ProgID — программный идентификатор, например, WordBasic или Excel.Chart).

Первоначально клиент должен получить указатель (назовем его pClFr) на интерфейс IClassFactory, например с помощью функции CoGetClassObject.CoGetClassObject(Class Com, I, Nil, IID IClassFactory, pCIFr);

Механизм создания объекта с помощью фабрики класса
(после активизации самой фабрики классов) поясняется следующим рисунком:

Механизм создания объекта с помощью фабрики класса

Последовательность действий после получения указателя следующая:
• Вызывается метод Createlnstance интерфейса IClassFactory с передачей ему IID требуемого интерфейса и переменной-указателя (рСоm) на него.
pClFr.createInstance(Nil, IID, pCom);
• В ответ Фабрика классов создает (2) объект, получает указатель на заданный интерфейс и возвращает 3 этот указатель клиенту.
• Получив указатель рСом на интерфейс, реализуемый объектом, клиент Может вызывать (4) методы этого интерфейса,
для реализации фабрики классов в Delph. в модуле ComObj предусмотрен клacc TComObjectFactory, производный ОТ TObject И поддерживающий интерфейсы IUnknown, IClassFactory, IClassFactory2. СОМ-объект связывается со своей фабрикой класса С ПОМОЩЬЮ свойства Factory.

Система времени выполнения
Реализация СОМ включает и систему времени выполнения, поддерживающую структуру данных, известную как таблица активных объектов (Active Object Table). В этой таблице хранятся CLSID и указатели на фабрики классов активных объектов. Когда клиент вызывает функцию API CoGetClassObject, то система времени выполнения СОМ первоначально ищет CLSID в этой таблице, и, если в ней CLSID не находит, то ищет по заданному CLSID значение ключа LocalServer32 (с указанием пути до файла сервера) в реестре Windows и запускает сервер.


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




Статистика