Итак, объект должен помнить количество обращений к нему. Для этого обычно в классе заводят переменную типа 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.
Если вы обратили внимание, то эти два метода не только чего-то делают, но и возвращают информацию о том сколько сейчас ссылок.