Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Графика -> Гончаров Д. -> "DirectX 7.0 Для программистов" -> 43

DirectX 7.0 Для программистов - Гончаров Д.

Гончаров Д., Салихо Т. DirectX 7.0 Для программистов — Спб.: Питер, 2001. — 528 c.
ISBN 5-318-00173-4
Скачать (прямая ссылка): dirext7dlyaprogrammistov2001.djvu
Предыдущая << 1 .. 37 38 39 40 41 42 < 43 > 44 45 46 47 48 49 .. 229 >> Следующая

Два других метода интерфейса IUnknown позволяют вести учет ссылок на интерфейс. Это метод ULONG AddRef(void);
увеличивающий значение счетчика количества ссылок на 1, и метод ULONG Release(void); уменьшающий значение этого счетчика на 1.
И тот и другой метод возвращают текущее значение счетчика ссылок, которое, впрочем, может использоваться лишь в диагностических целях.
Эти методы позволяют управлять временем существования компонента. Вместо того чтобы позволить клиенту уничтожить компонент по завершении работы с ним, СОМ возлагает всю ответственность по удалению компонента на сам компонент. Каждый компонент должен поддерживать счетчик количества ссылок на себя со стороны клиентов. Если счетчик становится равным нулю, то компонент должен себя удалить. После этого указатели на его интерфейсы становятся недействительными. Такой подход позволяет избежать ситуации, когда один из клиентов попытается удалить компонент, а второй будет продолжать с ним работать.
Когда компонент создается, его счетчик количества ссылок принимает значение 1. Любая функция, возвращающая указатель на интерфейс, должна увеличивать значение этого счетчика вызовом AddRef. Например, именно так поступает метод Querylnterface, поэтому для интерфейса, получаемого через Querylnterface, метод AddRef вызывать не нужно. Это необходимо делать, например, если происходит копирование указателя на интерфейс в другую переменную, то есть тогда, когда компонент не имеет возможности отследить увеличение числа ссылок.
Практика COM
95
Вообще, метод AddRef в программах, лишь использующих компоненты СОМ, встречается довольно редко, а иногда вовсе отсутствует. В отличие от другого метода, Release, вызов которого встречается всегда. Общее правило гласит: как только интерфейс перестает быть нужным, для него необходимо вызвать метод Release. Впрочем, это не догма; обычно программы, работающие с DirectX, освобождают занятые интерфейсы в ответ на сообщение WMDESTROY, до того как указатель на интерфейс будет разрушен. Метод Release должен вызываться для всех интерфейсов, полученных от метода Query Interface или функций типа DirectSoundCreate.
Физическая реализация интерфейсов
Мы много раз повторяли, что СОМ — это двоичный стандарт, обеспечивающий построение компонентов. Но что представляет собой этот стандарт?
Физически двоичная структура интерфейса аналогична двоичной структуре, которую компиляторы C++ генерируют для абстрактного класса C++. Абстрактным обычно называют класс, содержащий чисто виртуальные функции-методы, то есть такие методы, для которых отсутствует реализация. Причиной создания таких методов является возможность вызывать в базовом классе методы, которые будут определены лишь в производных классах. Таким образом, можно задать поведение базового класса, даже если часть методов будут определены лишь в производных классах. Нельзя создать экземпляр абстрактного класса. Каждый класс, производный от абстрактного класса, должен определить свою реализацию чисто виртуальных методов. Лишь после этого появляется возможность создания экземпляров производного класса. Чисто виртуальные методы, которые производный класс переопределяет, для него становятся просто виртуальными.
Для каждого класса, содержащего виртуальные методы, компилятор создает специальную таблицу, в которой содержатся указатели на конкретные реализации виртуальных методов. Если класс переопределяет виртуальный метод базового класса, то в таблицу заносится указатель на переопределенный метод. Физически для класса, содержащего виртуальные методы, указатель на таблицу виртуальных методов, обычно называемую vtable, хранится в первых четырех байтах конкретного экземпляра класса. То есть указатель на экземпляр класса фактически ссылается на таблицу виртуальных методов этого класса. Это важная информация, и ее стоит запомнить.
Структура класса, содержащего виртуальные методы, приведена на рис. 3.3.
Другой особенностью методов класса C++ (а следовательно, и интерфейсов СОМ) является то, что первым параметром при вызове метода класса ему передается указатель this на экземпляр этого класса. Данная особенность существенна, так как влияет на использование интерфейсов в языках, отличных от C++.
ПРИМЕЧАНИЕ Поскольку методы интерфейса IUnknown располагаются первыми для любого интерфейса, то указатель на любой интерфейс можно рассматривать как указатель на IUnknown.
В документации DirectX SDK прототипы методов для всех интерфейсов приведены в виде объявления методов классов. То есть указатель на экземпляр интерфейса для методов не указывается. В языках, отличных от C++, необходимо явно передавать методу указатель на его интерфейс.
96
Урок 3 • Технология СОМ
Указатель на интерфейс
Клиент
Указатель на viable
Адрес 1-го метода
Адрес 2-го метода
Адрес 3-го метода
Адрес n-го метода
Интерфейс
Рис. 3.3. Двоичная структура интерфейса аналогична структуре абстрактного класса
Выбор между С и C++
Остается рассмотреть различия между использованием COM-интерфейсов на С и C++. При разработке программ для DirectX наиболее серьезными вариантами являются языки С и C++. С недавних пор в этом ряду пытается разместиться Visual Basic, но это уже совсем другая история.
Предыдущая << 1 .. 37 38 39 40 41 42 < 43 > 44 45 46 47 48 49 .. 229 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.