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

4.1.5 Вставка кода заглушки/прокси-объекта.

Важна роль заглушек и прокси-объектов в модели СОМ. Если ограничивать СОМ-серверы использованием только variant-совместимых типов, то можно пользоваться процедурой универсального (библиотека типов) маршалинга, и DLL заглушки/прокси не требуется. Если использовать интерфейсы с атрибутом [oleautomation] (как и дуальные интерфейсы), то также нет необходимости выбирать эту опцию. Если же планируется создавать интерфейсы, выходящие за рамки использования variant-совместимых типов, то установка данного флажка добавит необходимые точки захвата, чтобы разместить код заглушки/прокси внутри вашего DLL-сервера — как результат, на один файл меньше распространять. Конечно, не обязательно вставлять DLL заглушки/прокси во внутрипроцессный сервер (любой DLL-сервер будет работать и без выбора этой опции). Это просто одна из возможностей проектирования СОМ-сервера.

Если флажок все-таки выбран, то мастер ATL COM AppWizard сгенерирует для проекта два дополнительных файла: dlldatax.h и dlldatax.c, так как каждый DLL-сервер в модели СОМ должен экспортировать функции DllCanUnloadNow(), DllRegisterServer(), DllUnregisterServer() и DllGetClassObject(), чтобы взаимодействовать с процедурой COM Runtime.

При создании СОМ можно выделить основные задачи, решаемые ATL:

  • Предоставляет для коклассов реализацию по умолчанию интерфейса IUnknown. Эта поддержка осуществляется с помощью ССomObjectRootBase, CComObjectRootEx<> и СОМ-карты кокласса.

  • Предоставляет родовую фабрику класса для создания объектов, при этом шаблон CComСoСlass<> определяет родовую фабрику класса.

  • Обеспечивает поддержку саморегистрации для каждого кокласса сервера. Это поддерживается с помощью реестрового скриптового файла сервера, класса CComModule и нескольких регистрационных макросов.

Простой кокласс явно производится от двух шаблонов ATL. Эти шаблоны задают потоковую модель для кокласса, уровень поддержки агрегирования, ассоциированную фабрику класса, а также поддержку IUnknown.

4.1.6 Класс CComObjectRootEx<>

Класс CComObjectRootEx<> произведен от другого класса ATL, CComObjectRootBase. Эти два класса предоставляют вспомогательные функции, вызываемые реализацией IUnknown кокласса. Кокласс не является самым последним произведенным классом, а передается как параметр шаблона в другой класс ATL (как правило, CComObject<>), который реализует три метода интерфейса IUnknown.

Классы CComObjectRootBase и CComObjectRootEx<> предоставляют функции, доступ к которым производится CComObject<> для того, чтобы завершить реализации Querylnterface(), AddRef() и Release(). CComObjectRootBase задает поведение Querylnterface(). CComObjectRootEx<> расширяет спецификацию IUnknown, добавляя в него вспомогательные функции, используемые в реализации AddRef() и Release().

Единственным параметром шаблона, передаваемым в CComObjectRootEx<>, является класс потоковой модели, определяемый в ATL. Используя этот параметр, реализация счетчика ссылок объекта демонстрирует безопасность потока. Параметр шаблона, принимаемый CComObjectRootEx<>, определяется выбором типа модели потока (Threading Model) на вкладке Attributes мастера ATL Object Wizard.