Для начала два известных нам метода 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;
}