- •Изучение способов разработКи простейших com-объектов в среде delphi.
- •5.6 Методические указания.
- •5.6.1 Основные сведения о сом-объектах
- •5.6.2 Составляющие com-приложений
- •5.6.2.1 Способы взаимодействия com-клиентов с com-серверами
- •5.6.2.2 Регистрация com-сервера
- •5 .6.2.3 Библиотека com
- •1.6.2.4 Hresult.
- •5.6.2.5 Библиотека типов.
- •5.6.2.6 Общие сведения о com-клиентах
- •5.6.3 Объекты com в среде Delphi.
- •5.6.3.1 Средства реализации интерфейсов в среде Delphi.
- •5.6.3.2 Классы TcomObj, Coclass и tTypedComObject.
- •5.6.3.3 Пример простейшего приложения с применением интерфейсов.
- •ShowMessage(MyInterface.GetName);
- •5.6.4 Разработка структуры клиентского и серверного приложений.
- •5.6.5 Создание внутреннего сервера сом.
- •5.6.5.1 Создание динамической библиотеки.
- •5.6.5.2 Создание объекта сом.
- •5.6.5.3 Создание интерфейсов объекта сом.
- •5.6.5.4 Задание кода методов интерфейса.
- •5.6.6 Разработка клиентского приложения для внутреннего сервера
5 .6.2.3 Библиотека com
Для выполнения базовых функций и использования интерфейсов, в ОС Windows существует специальная библиотека COM. Набор ее функций можно рассматривать как подмножество функций Windows API, поэтому к ним всегда возможен доступ стандартным способом – вызовом соответствующих функций. Согласно спецификации СОМ, имена всех функций этой библиотеки начинаются с приставки “Co” (например, CoCreateInstance, CoGetClassObject и т. п.).
С помощью этой библиотеки можно осуществлять запуск серверов объектов.
На рис. 5. показан процесс создания первого экземпляра объекта с помощью библиотеки COM и системного реестра. Допустим, что клиент пытается обратиться к объекту COM, который до этого момента не использовался. Следовательно, клиент не имеет указателя на нужный объект и интерфейс. Для получения этих данных, ему необходимо обратиться к библиотеке COM для вызова (1) специального метода CoCreateInstance, передавая ему в качестве параметра CLSID нужного класса (CLSID_2), IID интерфейса (IID2_A) и требуемый тип сервера. Здесь (и далее) числовой номер в скобках соответствует номеру в последовательности выполнения операций, который на рис. 5. указывается в кружках на стрелках.
Затем, библиотека (2) при помощи диспетчера управления службами SCM (Service Control manager) обращается (3) к системному реестру по идентификатору класса (CLSID_2), и, если такой сервер в реестре зарегистрирован, то, взяв оттуда необходимую информацию о сервере, запускает его (4). Когда клиент запрашивает услугу от СОМ-объекта, он передает СОМ-объекту идентификатор класса (CLSID). CLSID - всего лишь GUID, который применяется при обращении к СОМ-объекту. После передачи CLSID, СОМ-сервер должен обеспечить так называемую фабрику класса, которая собственно, и создает экземпляры СОМ-объектов (5).
В общих чертах, СОМ-сервер должен выполнять следующие действия:
-
регистрировать данные в системном
реестре Windows для связывания модуля
сервера с идентификатором класса
(CLSID);
- предоставлять фабрику СОМ-класса, создающую экземпляры СОМ-объектов;
- обеспечивать механизм, который выгружает из памяти серверы СОМ, которые в текущий момент времени не предоставляют услуг клиентам.
После создания фабрикой классов СОМ-объекта, вызывается метод QueryInterface (6) интерфейса IUnknown, который возвращает указатель на запрошенный интерфейс IAnyInterface (с идентификатором IID2_A) библиотеке COM (7), а та, в свою очередь, - передает его клиенту (8), который после этого получает возможность обращаться непосредственно к СОМ-объекту (9). Кроме того, при вызове метода QueryInterface автоматически выполняется так же и метод AddRef, увеличивающий счетчики ссылок внутри COM-объекта и сервера на единицу.
Фабрика класса. Как отмечалось выше, для запуска экземпляра класса используется специальный объект - фабрика класса. С его помощью можно создать как один объект, так и несколько экземпляров. Для каждого класса должна существовать собственная фабрика класса.
Согласно спецификации СОМ фабрика класса также является объектом СОМ. Объект СОМ имеет право называться фабрикой класса, если он поддерживает интерфейс iclassFactory. В нем реализованы всего два метода:
- CoCreatelnstance - создает новый экземпляр класса. Все необходимые параметры, кроме iid, метод получает от фабрики класса. В этом его отличие от одноименной общей функции Windows API;
- LockServer - оставляет сервер функционировать после создания объекта.
Для вызова фабрики класса существует специальная функция библиотеки классов coGetclassObject:
В
function
CoGetclassObject( const
clsid: TCLSID; // clsid
нужного
класса dwClsContext:
Longint;
pvReserved:
Pointer; const
iid: TIID; //
iid
интерфейса
(iclassFactory) var
pv): HResult; stdcall;
