Шаг 19 - IUnknown Методы AddRef и Relеase

Итак, объект должен помнить количество обращений к нему. Для этого обычно в классе заводят переменную типа ULONG в разделе private, так как ни кто кроме функций класса не должны иметь к нему доступ.

class COAbsatract : public COleTestAbstract,
		    public IUnknown
{
......
private:
	ULONG mRef;
};

Прежде чем реализовывать методы AddRef и Release необходимо их описать в классе. Вот можно и так например.

class COAbsatract : public COleTestAbstract,
		    public IUnknown
{
public:
........
	STDMETHOD_ (ULONG, AddRef) (THIS);
	STDMETHOD_ (ULONG, Release) (THIS);
........
};

И естественно реализация нужна.

STDMETHODIMP_(ULONG) COAbsatract::AddRef() 
{
   return mRef++;
}

STDMETHODIMP_(ULONG) COAbsatract::Release() 
{
   ULONG uRet=--mRef;
   if (!uRet) delete this;
   return uRet;
}

Как видите эти две функции увеличивают или уменьшают счетчик. То есть COM сервер считает сколько на него есть ссылок. То есть при выдаче интерфейса клиенту счетчик ссылок увеличивается. Идея в том, что до того момента пока число ссылок больше нуля сервер будет находиться в памяти. Метод AddRef вызывает сам сервер. Это логично, кто кроме него может знать кому и сколько он отдал итнтерфейсов ? Это как тайна вклада в банке :-)

Release как раз наоборот уменьшает число ссылок на сервер. Клиент вызывает этот метод при желании отпустить интерфейс. Жизненный цикл сервера находится в этих двух функциях. Не путайте. Сколько раз вызываете AddRef столько раз и вызывайте Release.

Если вы обратили внимание, то эти два метода не только чего-то делают, но и возвращают информацию о том сколько сейчас ссылок.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 10.04.2000