Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Интерфейс IUnknown и функция QueryInterfaceСтр 1 из 2Следующая ⇒ Давайте вернемся к тому, как получить указатель на интерфейс. Для этого в 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).
|