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


Фабрика классов Логика функционирования - часть 2


}

ULONG _stdcall CoSayFactory::Release()

{

if (--m_ref==0)

delete this;

return m_ref;

//====== Методы интерфейса IClassFactory

HRESULT _ stdcall CoSayFactory: :CreateInstance

(LPUNKNOWN pUnk, REFIID riid, void** ppv)

{

// Этот параметр управляет аггрегированием

// объектов СОМ, которое мы не поддерживаем

if (pUnk)

return CLASS_E_NOAGGREGATION;

//== Создание нового объекта и запрос его интерфейса

CoSay *pSay = new CoSay;

HRESULT hr = pSay->Query!nterface (riid, ppv) ;

if (FAILED (hr))

delete pSay; return hr;

//=== Управление счетчиком фиксаций сервера в памяти

HRESULT _stdcall CoSayFactory::LockServer(BOOL bLock)

{

if (bLock) // Если TRUE, то увеличиваем счетчик

++gLockCount;

else // Иначе — уменьшаем

--gLockCount;

return S_OK;

}

Мы должны также изменить алгоритм функции DllGetciassOb j ect, которая теперь создает объект фабрики классов и запрашивает один из двух возможных интерфейсов (lUnknown,

IClassFactory):

STDAPI DllGetClassObject (REFCLSID rclsid, REFIID riid, LPVOID* ppv)

{

if (rclsid != CLSID_CoSay)

return CLASS_E_CLASSNOTAVAILABLE;

CoSayFactory *pCF = new CoSayFactory;

HRESULT hr = pCF->Query!nterface(riid, ppv);

if (FAILED(hr))

delete pCF;

return hr;

}

На этом модификация сервера завершается. Дайте команду Build > Rebuild и устраните ошибки, если они имеются. Затем вновь откройте проект клиентского приложения SayClient и внесите изменения в функцию main, которая теперь должна работать с объектами СОМ более изощренным способом. Она должна сначала загрузить СОМ-сервер и запросить адрес его фабрики классов, затем создать с ее помощью объект CoSay, попросив у него адрес интерфейса isay, и лишь после этого можно начать управление объектом. Последовательность освобождения объектов тоже должна быть тщательно выверена. Ниже приведена новая версия файла SayClient.cpp:

#include "interfaces.h"

void main()

{

(reinitialize (0) ;

IClassFactory *pCF;

// Мы зарегистрировали только один класс CoSay,




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



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