Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы Мартын 1(ComCorbaLab2004).doc
Скачиваний:
32
Добавлен:
10.02.2016
Размер:
1.81 Mб
Скачать

4.1.7 Atl com-карта

Чтобы реализация IUnknown средствами ATL функционировала корректно, кокласс должен определить так называемую СОМ-карту (COM map). COM-карта задается с использованием макросов begin_com_map и end_com_map. COM-карта объекта содержит список всех интерфейсов, поддерживаемых коклассом. Если не внести интерфейс в СОМ-карту, то клиент не сможет получить доступ к нему через Querylnterface. IUnknown представляет здесь исключение, поскольку его указатель рассчитывается неявно с помощью первого входа в СОМ-карту, и он не обнаружится в списке.

ATL СОМ-карта может включать в себя семнадцать различных интерфейсных. Многие из них потребуются только в случае, если кокласс построен с использованием сложных техник СОМ, таких как агрегирование или "сбрасываемые" интерфейсы. Наиболее популярным является com_interface_entry, который возвращает vPtr для указанного интерфейса. Надо отметить, что макрос com_interface_entry принимает IDL-имя интерфейса, а не соответствующие интерфейсам IID.

4.1.8 Класс CComCoClass<>

Второй шаблон ATL, от которого производится кокласс, задает объект класса для класса. Определение CComCoClass<> задает макрос declare_ classfactory, который при развертывании специфицирует фабрику класса по умолчанию, реализующую IClassFactory. Кроме того, CComCoClass<> определяет поведение кокласса в случае, если другой объект просит его служить составным (aggregate).

Агрегация — это способ повторного использования объектов в СОМ, при котором внешний объект создает и хранит внутренний объект. Интерфейсы внутреннего объекта экспонируются внешним объектом, создавая иллюзию, что внешний объект состоит из большего числа интерфейсов, чем он имеет в реальности. CComCoClass<> определяет макрос DECLARE_AGGREGATABLE, который сообщает, что кокласс может функционировать как составной (aggregated) объект, если поступит соответствующий запрос.

4.1.9 Класс cComModule

Саморегистрирующийся СОМ-сервер знает, что делать, когда ему поступает команда зарегистрироваться или снять регистрацию. В ATL класс CComModule отвечает за внесение (удаление) информации в реестр для каждого кокласса, перечисленного в карте объектов. Выполняя процедуру регистрации, CComModule пишет макрос declare_registry_re source id в заголовочном файле кокласса. При раскрытии этот макрос предоставляет реализацию метода UpdateRegistry(), и вызывается классом CComModule во время регистрации и снятии регистрации ваших коклассов. Единственным параметром declare_registry_resourceid является ID ресурса серверного двоичного RGS-файла. Если посмотреть вкладку ResourceView, то обнаружится, что появился новый подкаталог ресурса REGISTRY.

4.1.10 Язык скриптов реестра в atl

Что же такое RGS-файл (ReGistryScript)?ATLподдерживает простой и элегантный язык скриптов для задания, что вставить (удалить) в (из) реестр системы в процессе инсталляции. Этот язык скриптов реестра устраняет необходимость поддерживатьREG-файл, чтобы регистрировать СОМ-серверы. По умолчанию,RGS-файл задаетProgIDс версией,ProgIDбез версии и идентификаторыclsid. Информация об интерфейсах сервера иTypeLibвносится программно.

Синтаксис RGS построен по стандартному иерархическому принципу, с идентификацией каждого "узла" парой скобок ({}). Самый верхний узел (в данном случае HKCR) используется для задания улья, который будет модифицироваться скриптом. Синтаксис RGS позволяет заносить информацию в любой улей реестра. Список допустимых значений приводится в табл. 4.2.

Конструкции языка скриптов реестра ATL Таблица 4.2.

Сокращенное обозначение улья

Значение

HKCR

HKCR

HKML

HKU

HKPD

HKDD

HKCC

HKEY_CLASSES_ROOT

HKEY_CURRENT_USER

HKEY_LOCAL_MACHINE

HKEY_USERS

HKEY_PERFORMANCE_DATA

HKEY_DYN_DATA

HKEY_CURRENT_CONFIG

Подузлы могут иметь модификаторы. Узел CLSID принимает NoRemove, означающий, что любые записи, вносимые в HKCR\CLSID, требуют сохранять все другие подключи нетронутыми. С другой стороны, запись {<GUID>} для класса снабжена модификатором ForceRemove, сообщающим ATL, что необходимо убрать все имеющиеся под этим ключом записи и заменить их на требуемые. И, наконец, хотя это и отсутствует в RGS-файле, узел может получить модификатор Delete, используемый для удаления (без замены) существующего ключа.

Подключ может содержать различные величины. В синтаксисе RGS именованные величины маркируются модификатором val. Синтаксис RGS позволяет вносить строковые (S), численные (D для DWORD) или двоичные (В) величины.И последнее, что нас интересует, — это тэг %module%. Синтаксис RGS позволяет определять метки-заполнители, которые динамически добавляются в скрипт во время процесса регистрации/дерегистрации. %module% — один из таких предопределенных заполнителей, заменяющийся на вызов функции Win32 GetModuleFileName(). Имеется возможность определить и свои собственные метки-заполнители.

Библиотека выполняет довольно большую работу, предоставляя код хранилища компонентов, а также базовой "оснастки" СОМ (фабрика класса, реализация IUnknown, поддержка саморегистрации).