Крім підтримки одного або декількох інтерфейсів, які походять від ін терфейс IUnknown, і реалізації лічильника посилань для відстеження свого терміну су ществованія, об'єкти COM мають ще одну специфічну особливість: вони ство ються спеціальними об'єктами, званими фабриками класів (class factories). Кожен клас COM має відповідну фабрику класу, яка відповідає за створення ек земпляров об'єктів даного класу COM. Фабрика класу - це спеціальний об'єкт COM, що підтримує інтерфейс IClassFactory. Даний інтерфейс визначений в модулі ActiveX наступним чином:
function CreateInstance (const unkOuter: IUnknown;
const iid: TIID; out obj): HResult; stdcall;
function LockServer (fLock: BOOL): HResult; stdcall;
Метод 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
Windows, ActiveX, Classes, ComObj;
TSomeComObject = class (TComObject, підтримувані інтерфейси)
Тут оголошуються методи класу і інтерфейсу
implementation uses ComServ;
Тут знаходиться реалізація об'єкта TSomeComObject
'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) або зовнішнім (додаток).