Для начала два известных нам метода AddRef и Release. Они увеличивают и уменьшают счетчик ссылок.
STDMETHODIMP_(ULONG) CClassFactory::AddRef() { return InterlockedIncrement( &m_lRef ); } STDMETHODIMP_(ULONG) CClassFactory::Release() { if ( InterlockedDecrement( &m_lRef ) == 0 ) { delete this; return 0; } return m_lRef; }
Соотвественно в конструкторе надо инициализировать переменную счетчик как ноль.
CClassFactory::CClassFactory() { m_lRef = 0; }
Теперь нам нужно завести переменную, которая будет отвечать за блокировку сервера COM. Опишем её в основном модуле.
// // mycom.cpp // #include "windows.h" #include "ClassFactory.h" long g_lLocks = 0;
Но она нам понадобится и для реализации метода LockServer, поэтому её надо объявить и перед объявлением фабрики класса.
// ClassFactory.h: interface for the CClassFactory class. // ////////////////////////////////////////////////////////////////////// ....... extern long g_lLocks; class CClassFactory : public IClassFactory { ...... }
Зачем нужен этот LockServer ??? Для того, чтобы сохранить в памяти модуль фабрики классов даже если к нему в данный момент нет обращения. Этому методу передаются параметры в виде FALSE и TRUE и количество вызовов этих методов долно быть пропорционально. Ну давайте этот метод реализуем.
STDMETHODIMP CClassFactory::LockServer( BOOL fLock ) { if ( fLock ) InterlockedIncrement( &g_lLocks ); else InterlockedDecrement( &g_lLocks ); return S_OK; }