Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KNit-09_zach_Otvety.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
138 Кб
Скачать
☆

Библиотека com

Для выполнения базовых функций и использования интерфейсов, в ОС Windows существует специальная библиотека COM. Набор ее функций можно рассматривать как подмножество функций Windows API, поэтому к ним всегда возможен доступ стандартным способом – вызовом соответствующих функций. Согласно спецификации СОМ, имена всех функций этой библиотеки начинаются с приставки “Co” (например, CoCreateInstance, CoGetClassObject и т. п.).

С помощью этой библиотеки можно осуществлять запуск серверов объектов.

На рис. 2.6 показан процесс создания первого экземпляра объекта с помощью библиотеки COM и системного реестра. Допустим, что клиент пытается обратиться к объекту COM, который до этого момента не использовался. Следовательно, клиент не имеет указателя на нужный объект и интерфейс. Для получения этих данных, ему необходимо обратиться к библиотеке COM для вызова (1) специального метода CoCreateInstance, передавая ему в качестве параметра CLSID нужного класса (CLSID_2), IID интерфейса (IID2_A) и требуемый тип сервера. Здесь (и далее) числовой номер в скобках соответствует номеру в последовательности выполнения операций, который на рис. 2.6 указывается в кружках на стрелках.

Затем, библиотека (2) при помощи диспетчера управления службами SCM

(Service Control manager) обращается (3) к системному реестру по идентификатору класса (CLSID_2), и, если такой сервер в реестре зарегистрирован, то, взяв оттуда необходимую информацию о сервере, запускает его (4). Когда клиент запрашивает услугу от СОМ-объекта, он передает СОМ-объекту идентификатор класса (CLSID). CLSID - всего лишь GUID, который применяется при обращении к СОМ-объекту.

38////////////////////////////////////////////////////////////////////////////////////////////////////38/////////////////////////////////////////////////////////////////////////////////////////////38

После передачи CLSID, СОМ-сервер должен обеспечить так называемую фабрику класса, которая собственно, и создает экземпляры СОМ-объектов (5).

В общих чертах, СОМ-сервер должен выполнять следующие действия:

- регистрировать данные в системном реестре Windows для связывания модуля сервера с идентификатором класса (CLSID);

- предоставлять фабрику СОМ-класса, создающую экземпляры СОМ-объектов;

- обеспечивать механизм, который выгружает из памяти серверы СОМ, которые в текущий момент времени не предоставляют услуг клиентам.

После создания фабрикой классов СОМ-объекта, вызывается метод

QueryInterface (6) интерфейса IUnknown, который возвращает указатель на запрошенный интерфейс IAnyInterface (с идентификатором IID2_A) библиотеке COM (7), а та, в свою очередь, - передает его клиенту (8), который после этого получает возможность обращаться непосредственно к СОМ-объекту (9). Кроме того, при вызове метода QueryInterface автоматически выполняется так же и метод AddRef, увеличивающий счетчики ссылок внутри COM-объекта и сервера на единицу.

Фабрика класса. Как отмечалось выше, для запуска экземпляра класса используется специальный объект - фабрика класса. С его помощью можно создать как один объект, так и несколько экземпляров. Для каждого класса должна существовать собственная фабрика класса.

Согласно спецификации СОМ фабрика класса также является объектом СОМ. Объект СОМ имеет право называться фабрикой класса, если он поддерживает интерфейс iclassFactory. В нем реализованы всего два метода:

- CoCreatelnstance - создает новый экземпляр класса. Все необходимые параметры, кроме iid, метод получает от фабрики класса. В этом его отличие от одноименной общей функции Windows API;

- LockServer - оставляет сервер функционировать после создания объекта.

Для вызова фабрики класса существует специальная функция библиотеки

классов coGetclassObject:

В качестве параметра ей передается clsid нужного класса и iid интерфейса (iclassFactory). Функция ищет требуемую фабрику и возвращает указатель на интерфейс. С его помощью, используя метод CoCreatelnstance, клиент заставляет фабрику класса создать объект.

Ответы на 36/37/38

39/////////////////////////////////////////////////////////////////39//////////////////////////////////////////////////////////////39///////////////////////////////////////////////////////////////////39

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]