Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Урок 17. Интерфейс IUnknown / Библиотека ATL / Visual C++
Visual C++. ATL Урок 17. Интерфейс IUnknown
Интерфейс IUnknown - это предок для всех COM-интерфейсов. Это означает, что каждый интерфейс, который мы используем при создании ATL-компонентов, обязательно имеет те же методы которые имеет интерфейс IUnknown. Вообще говоря интерфейсы не обязательно имеют в качестве предка IUnknown (у интерфейса вообще может не быть предка), но COM-интерфейсы (и, в частности, ATL-интерфейсы) обязаны иметь этот интерфейс в качестве одного из предков (иначе они просто не будут являться COM-интерфейсами по определению).
Интерфейс IUnknown имеет три метода. Рассмотрим их всех.
AddRef - увеличивает счетик ссылок на наш компонент.
Release - уменьшает счетик ссылок на наш компонент
QueryInterface - позволяет выяснить, поддерживает ли наш объект другой COM-интерфейс (иными словами, позволяет выяснить, что в реальности записано в указателе на некоторый интерфейс).
Несколько слов по поводу первых двух методов. Дело в том, что наш компонент могут использовать несколько клиентов. Сначала один, потом еще один и т. п. При этом клиенты могут перестать использовать компонент - опять же сначала один, потом другой т. п. Спрашивается, как же компонент узнает, что его больше никто не использует? В какой момент он должен выгрузится из памяти? Для этого внутри компонента существует счетчик количества клиентов, его использующих. Каждый клиент, который начинает использовать наш компонент, вызывает AddRef и счетчик внутри компонента увеличивается на 1. Когда же клиент перестает использовать наш компонент, он вызывает Release и счетчик внутри компонента уменьшается на 1. И, как только этот счетчик станет равным 0, наш компонент уничтожается и занимаемая им память освобожается.