Шаг 26 - Реализуем фабрику классов

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

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