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


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


// поэтому ищем DLL с его помощью, но при этом

// создается не объект CoSay, а объект CoSayFactory

// (см. код функции DllGetClassObject).

// Поэтому здесь мы просим дать адрес

// интерфейса IClassFactory

HRESULT hr = CoGetClassObject(CLSID_CoSay, CLSCTX_INPROC_SERVER,0, IID_IClassFactory,(void**)&pCF);

if (FAILED(hr))

{

MessageBox(0,"Could not Get Class Factory !

", "CoGetClassObject", MB_OK);

CoUninitialize();

return;

}

// Далее мы с помощью фабрики классов

// создаем объект CoSay и просим его

// дать нам адрес интерфеса ISay

ISay *pSay;

hr = pCF->Create!nstance(0,IID_ISay, (void**)&pSay) ;

if (FAILED(hr))

{

MessageBox(0,"Could not create CoSay and get ISay!

", "Createlnstance", MB_OK);

CoUninitialize ();

return;

}

// Уменьшаем счетчик числа пользователей

// фабрикой классов pCF->Release();

//====== Управляем объектом

pSay->Say();

BSTR word = SysAllocString(L"Yes, My Lord");

pSay->SetWord(word);

SysFreeString(word); pSay->Say();

//====== Уменьшаем число его пользователей

pSay->Release();

SCoUninitialize () ;

}

Запустите приложение (Ctrl+F5) и проверьте его работу. Алгоритм проверки остается тем же, что и ранее, но здесь мы должны по логике разработчиков СОМ, радоваться тому, что выполняем большее число правил и стандартов, а также имеем возможность одновременно создавать несколько СОМ-объектов.

На мой взгляд, не может быть ничего лучшего, чем получить код хорошо продуманного класса C++, который дает вам новую, хорошо документированную функциональность. При этом вы получаете полную свободу в том, как ее использовать, и имеете возможность развивать ее по вашему усмотрению. Использование методов класса предполагает выполнение оговоренных заранее правил игры, так же как и при использовании методов интерфейсов. Но эти правила значительно более естественные, чем правила СОМ. Вы, возможно, возразите, что для внедрения в проект нового класса, сам проект надо строить заново. Двоичный объект СОМ в этом смысле внедрить проще. Но здесь надо учитывать тот факт, что для реализации всех выгод СОМ вам придется разработать универсальный контейнер объектов, который будет способен внедрять СОМ-объекты будущих поколений и управлять ими. Это невозможно сделать, не трогая кода вашего приложения. Разработчик более или менее серьезного проекта постоянно корректирует его, изменяя код того или иного модуля. Он просто обречен на это. На мой взгляд, при реализации новых идей проще использовать исходные коды классов, чем двоичные объекты. Без сомнения, за хорошие коды надо платить, также как и за хорошие СОМ-объекты.




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



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