Учебник по Visual C++ .Net


Фабрика классов Логика функционирования


!gLockCount && IgObjCount ? S_OK : S_FALSE;

}

В конструктор класса coSay добавьте код, увеличивающий счетчик числа пользователей объектом Со Say:

gObjCount++;

а в деструктор — уменьшающий:

gObjCount--;

Важным шагом, о котором, тем не менее, легко забыть, является своевременная коррекция файла MyCom.def. Вставьте в конец этого файла строку

DllCanUnloadNow PRIVATE

которая добавляет в список экспортируемых функций еще один элемент. В файл MyCom. h добавьте декларацию нового класса CoSayFactory, реализующего интерфейс iclassFactory. Отметьте, что он произведен от интерфейса iClassFactory, который, как и положено, имеет родителя I unknown. Вы помните, что на плечи класса ложится бремя реализации всех методов своих предков. По той же причине мы вновь заводим счетчик числа пользователей классом (m_ref):

//====== Фабрика классов СОМ DLL-сервера

class CoSayFactory : public IClassFactory

{

public:

CoSayFactory() ;

virtual ~CoSayFactory() ;

// lUnknown

HRESULT _stdcall Querylnterface(REFIID riid,

void** ppv);

UbONG _stdcall AddRefO; ULONG _stdcall Release();

// IClassFactory

HRESULT _stdcall Createlnstance(LPUNKNOWN pUnk,

REFIID riid, void** ppv);

HRESULT _stdcall LockServer(BOOL bLock); private:

ULONG m_ref; };

Реализацию тел заявленных методов вставьте в файл МуСоm.срр. Здесь мы вынуждены повторяться,

вновь прокручивая логику управления временем жизни объектов СОМ:

//========== Фабрика классов

CoSayFactory::CoSayFactory()

{

m_ref = 0; gObjCount++;

}

CoSayFactory::-CoSayFactory()

{

gObjCount--;

}

//====== Методы lUnknown

HRESULT _stdcall CoSayFactory

::QueryInterface(REFIID riid, void** ppv)

{

*ppv = 0;

//=== На сей раз обойдемся без шаблона static_cast<>

if (riid == IID_IUnknown)

*ppv = (lUnknown*)this;

else if (riid == IID_IClassFactory)

*ppv = (IClassFactory*)this;

else

return E_NOINTERFACE;

AddRef();

return S_OK;

}

ULONG _stdcall CoSayFactory:rAddRef()

{

return ++m_ref;




Начало  Назад  Вперед



Книжный магазин