Шрифт:
В конструкторе обнуляется счетчик ссылок на фабрику класса — член класса m ref count (как всегда при создании любого объекта СОМ) и увеличивается на единицу глобальный счетчик числа активных объектов данного сервера (g objCount).
В деструкторе на единицу уменьшается глобальный счетчик активных объектов данного сервера.
Реализация методов интерфейса IUnknown стандартная и уже обсуждалась ранее.
Перейдем теперь к обсуждению реализации методов интерфейса IClassFactory и начнем с метода CreateInstance.
Во-первых, не предполагается агрегация класса CоBооk. В связи с этим выдается ошибка CLASS_E_NOAGGREGATION, если первый параметр не равен NULL.
В следующих строках кода и проявляется связь данной фабрики класса именно с классом CоBооk. Создается экземпляр класса CоBооk и запрашивается указатель на некоторый интерфейс этого класса:
CoBook* pBookObj = NULL;
HRESULT hr;
pBookObj = new CoBook;
hr = pBookObj — > QueryInterface(riid, ppv);
При неудаче получения интерфейса, созданный объект уничтожается.
В методе LockServer глобальный счетчик блокировок сервера в памяти увеличивается или уменьшается на единицу в зависимости от значения параметра fLock.
Совершенно аналогично определяется и реализуется фабрика класса CoJournalFactory для кокласса СоJournal.
//////////////////////////////////////////////////
// СоJournalFactory.h: заголовочный файл для класса
// CoJournaiFactory — фабрики класса для класса CoJournal
//////////////////////////////////////////////////
#ifndef _CoJournalFactory_
#define _CoJournalFactory
#include "CoJournal.h"
class CoJournalFactory: public IClassFactory
{
public:
CoJournalFactory ;
virtual ~CoJournalFactory;
//IUnknown
STDMETHODIMP Querylnterface(REFIID riid, void** pIFace);
STDMETHODIMP_(ULONG)AddRef;
STDMETHODIMP_(ULONG)Release;
//IClassFactory
STDMETHODIMP LockServer(BOOL fLock);
STDMETHODIMP Createlnstance(LPUNKNOWN pUnkOuter,
REFIID riid, void** ppv);
private:
ULONG m_refCount;
};
#endif
И теперь реализация фабрики класса СоJournalFactory для класса CoJournal.
//////////////////////////////////////////////////
// СоJournalFactory.срр: реализация фабрики класса СоJournalFactory
// для кокласса CoJournal
//////////////////////////////////////////////////
#include "СоJournalFactory.h"
extern ULONG g_lockCount;
extern ULONG g_objCount;
//////////////////////////////////////////////////
// Конструктор и деструктор
//////////////////////////////////////////////////
CoJournalFactory::СоJournalFactory
{
m_refCount = 0;
g_objCount++;
}
CoJournalFactory::~CoJournalFactory
{
g_obj Count-;
}
//IUnknown
STDMETHODIMP_(ULONG) CoJournalFactory::AddRef {
return ++m_refCount;
}
STDMETHODIMP_(ULONG) CoJournalFactory::Release
{
if (-m_refCount == 0)
{
delete this;
return 0;
}
else
return m refCount;
}
STDMETHODIMP CoJournalFactory::Querylnterface(REFIID riid, void** ppv)
{
if(riid == IID_IUnknown)
{
*ppv = (IUnknown*)this;
}
else if(riid == IID_IClassFactory)
{
*ppv = (IdassFactory*) this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
(IUnknown*)(*ppv)) — >AddRef;
return S OK;
}
//IClassFactory
STDMETHODIMP CoJournaiFactory::Createlnstance(
LPUNKNOWN pUnkOuter, REFIID riid, void** ppv)