Сущность технологии СОМ. Библиотека программиста | страница 99



0,

// no explicit host/security info

// нет явной информации о хосте и безопасности

2,

// asking for two interfaces – запрашиваем 2 интерфейса

rgmqi);

// array of MULTI_QI structs – массив структур

MULTI_QI

if (SUCCEEDED(hr)) {

// hr may be CO_S_NOTALLINTERFACES, so check each result

// hresult может быть равен CO_S_NOTALLINTERFACES,

// поэтому проверяем каждый результат

if (hr == S_OK || SUCCEEDED(rgmqi[0].hr)) {

// it is safe to blindly cast the resultant ptr to the type

// that corresponds to the IID used to request the interface

// безопасно вслепую преобразовать результирующий

// указатель к типу, соответствующему тому IID,

// который использовался при запросе интерфейса

IАре *рАре = reinterpret_cast(rgmqi[0].pItf);

assert(pApe);

HRESULT hr2 = pApe->EatBanana();

assert(SUCCEEDED(hr2));

pApe->Release();

}

if(hr == S_OK || SUCCEEDED(rgmqi[1].hr)) {

IEgghead *peh = reinterpret_cast(rgmqi[1].pItf);

assert(peh);

HRESULT hr2 = peh->ContemplateNavel();

assert(SUCCEEDED(hr2));

peh->Release();

}

} }



Рисунок 3.3 показывает шаги, которые предпринимаются CoCreateInstanceEx для создания нового объекта. Важно отметить, что оба результирующих указателя будут указывать на один и тот же объект. Если нужны два различных объекта, то требуются и два отдельных вызова CoCreateInstanceEx.


Использование СоСrеateInstanceЕх достаточно просто, если нужен только один интерфейс:


HRESULT CreateChimpAndEatBanana(void)

{

// declare and Initialize a MULTI_QI

// определяем и инициализируем MULTI_QI

MULTI_QI mqi = { &IID_IApe, 0, 0 };

HRESULT hr = CoCreateInstanceEx( CLSID_Chimp,

// make a new chimp – создаем нового шимпанзе

0,

// по aggregation – без агрегирования CLSCTX_ALL,

// any locality – любое расположение

0,

// no explicit host/security Info

// нет явной информации о хосте/безопасности

1,

// asking for one interface – запрашиваем один интерфейс

&mqi);

// array of MULTI_QI structs – массив структур

MULTI_QI

if (SUCCEEDED(hr))

{

IApe *pApe = reinterpret_cast(mqi.pItf);

assert(pApe);

// use the new object – используем новый объект

hr = pApe->EatBanana();

// release the Interface pointer

// освобождаем указатель интерфейса

pApe->Release();

}

return hr;

}


Если нужен только один интерфейс и не передается COSERVERINFO, то СОМ предусматривает несколько более удобную версию CoCreateInstanceEx, именуемую CoCreateInstance[1]:


HRESULT CoCreateInstance( [in] REFCLSID rclsid,

// what kind of object? – какой тип объекта?

[in] IUnknown *pUnkOuter,