- •107 Методические указания «Программное обеспечение сетей эвм. Часть 4. Версия 2. Развитие схемы «клиент-сервер» в com и corba»
- •Введение
- •1.1. Необходимость использования компонент
- •1.2. Методы встраивания компонентов
- •1.3. Основы com
- •1.4. Типы компонентов
- •1.5. Размещение управляющих элементов при помощи cWnd
- •1.6. Использование директивы #import
- •1.7. Компоновка тестовой программы
- •1.7.1 О компонентах
- •1.7.2 Регистрация компонентов
- •1.7.3 Импортирование библиотеки типов
- •1.7.4 Определение членов cDemoClientView
- •1.7.5 Создание компонентов
- •1.7.6 Создание точек взаимодействия
- •1.7.7 Синхронизация параметров
- •1.7.8 Обработка событий от компонентов
- •1.7.9 Очистка
- •1.7.10 Шаблонный код
- •1.9. Индивидуальные задания на работу
- •2.1. Проект. Основные принципы
- •2.2. Как создать компонент
- •Шаг 2: Создание компонента:
- •2.3. Значения по умолчанию
- •2.5. Индивидуальные задания на работу
- •3.1. Cоздание сервера com
- •3.2. Использование com-объектов
- •3.3. Индивидуальные задания на работу
- •Лабораторная работа № 4. Использование atl
- •4.1 Создание dcom-сервера с использованием atl
- •4.1.1 Введение в atl
- •4.1.2 Что такое atl?
- •4.1.3 Разделение труда
- •4.1.4 Создание хранилища компонентов с помощью atl Com AppWizard
- •4.1.5 Вставка кода заглушки/прокси-объекта.
- •4.1.7 Atl com-карта
- •4.1.9 Класс cComModule
- •4.1.10 Язык скриптов реестра в atl
- •4.1.11 Распределенная com (dcom)
- •4.1.12 Dcom и службы nt
- •4.1.13 Структура службы nt
- •4.1.14 Основанный на службах nt сервер сом
- •4.1.15 Создание проекта при помощи atl
- •4.1.16 Добавление функциональных средств
- •4.1.17 Функция CacheQuotes (dcomServiceXdcomService.Cpp)
- •4.1.18 Функция GetQuote (dcomServiceXdcomService.Cpp)
- •4.2 Создание dcom сервера
- •4.3 Создание dcom клиента
- •4.4 Индивидуальные задания на работу
- •Лабораторная работа № 5. Разработка corba приложений
- •5.1. Конфигурирование
- •5.2. Порядок действий
- •5.3. Объектно-ориентированный анализ и моделирование
- •5.4. Описание и трансляция объектов
- •5.5. Создание сервера
- •5.6. Создание клиента
- •5.7. Отладка объектов
- •5.8. Индивидуальные задания на работу
- •Лабораторная работа № 6. Адаптер роа
- •6.1. Архитектура poa
- •6.2. Политики poa
- •Политика обработки запросов
- •6.3. Создание серверов на основе poa
- •6.4. Индивидуальные задания на работу
- •Лабораторная работа № 7. Прикладная задача связи
- •7.1. Постановка задачи
- •7.1.1. Сотовая станция
- •7.1.2. Телефоны
- •7.1.3. Система
- •7.2. Функционирование системы
- •7.3. Индивидуальные задания на работу
- •Лабораторная работа № 8. Работа по умолчанию
- •8.1. Сервер с сервантом по умолчанию
- •8.2. Индивидуальные задания на работу
- •Лабораторная работа № 9. Создание менеджеров сервантов
- •9.1. Менеджеры сервантов
- •ServantActivator
- •ServantLocator
- •9.2. И снова практика
- •9.3. Индивидуальные задания на работу
- •Лабораторная работа № 10. Сервис именования
- •10.1. Сервис для именования (Naming Service)
- •10.2. Индивидуальные задания на работу
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, поддержка саморегистрации).
