Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Интерфейс IUnknown и функция QueryInterface





Давайте вернемся к тому, как получить указатель на интерфейс. Для этого в COM определен специальный интерфейс IUnknown. Фактически все интерфейсы произведены от IUnknown, который содержит чисто виртуальную функцию-член QueryInterface, возвращающую указатель ни интерфейс по переданному ей идентификатору интерфейса. Это предполагает, что у клиента есть указатель на какой-то интерфейс: либо на IUnknown, либо на производный от него.

Учет ссылок: функции AddRef и Release

В COM существует строгий протокол удаления объектов, ключевая роль в котором отводится двум IUnknown-функциям: AddRef и Release. Каждый COM-класс имеет переменную-член, в котором хранится текущее число «пользователей» данного объекта. Всякий раз, когда компонент возвращает указатель на новый интерфейс, он вызывает AddRef, а та увеличивает значение m_dwRef на единицу. Программа-клиент, закончив работу с указателем на интерфейс, вызывает Release, и та уменьшает значение m_dwRef на единицу. Когда значение m_dwRef уменьшается до нуля, объект самоуничтожается.

Фабрики класса

Терминология объектно-ориентированного программирования иногда весьма туманна. Например, программисты на Smalltalk говорят об объектах там, где программисты на С++ говорят о классах. В литературе по COM по отношению к объекту и ассоциированному с ним коду часто используется термин «компонентный объект» (component object). Наряду с ним используется термин «класс объекта» (class object) или «фабрика класса» (class factory). Большей точности ради его следовало бы назвать «фабрикой объектов» (object factory). Объект класса в COM представляет собой глобальную статическую область данного конкретного COM-класса. Объект класса часто называют фабрикой класс, так как он часто поддерживает особый COM-интерфейс под названием IClassFactory. Как и другие интерфейсы, этот тоже произведен от IUnknown. Главной функцией-членом в IClassFactory является CreateInstance:

virtual BOOL CreateInstance(int& nIid, void** ppvObj) = 0;

Для чего нужна фабрика классов? Как Вы уже видели, мы не в состоянии напрямую вызывать конструктор класса, но должны предоставить компоненту самому выбрать способ создания объектов. Для этого компонент предоставляет фабрику класса, инкапсулируя тем самым этап создания объекта. Поиск и запуск компонентных программных модулей для создания фабрики класса – операция «дорогая», а создание объектов посредством CreateInstance – «дешевая». Поэтому лучше использовать одну фабрику класса для создания множества объектов.

Реальная COM

Хватит моделей. Теперь мы готовы пример с космическим кораблем по истинную COM. Но сначала надо познакомится с функцией CoGetClassObject, затем узнать, как COM использует реестр Windows при загрузке компонента, в чем состоит различие между внутренними компонентами (in-process) (DLL) и внешним компонентом (out-of-process) (EXE или суррогатной DLL).

Date: 2016-05-25; view: 322; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию