Вход/Регистрация
Интернет-журнал "Домашняя лаборатория", 2007 №6
вернуться

Журнал «Домашняя лаборатория»

Шрифт:

В конструкторе обнуляется счетчик ссылок на фабрику класса — член класса 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)

  • Читать дальше
  • 1
  • ...
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: