Сущность технологии COM


Оптимизации - часть 4


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<IApe*>(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<IEgghead*>(rgmqi[1].pItf); assert(peh); HRESULT hr2 = peh->ContemplateNavel(); assert(SUCCEEDED(hr2)); peh->Release(); } } }

Рис. 3.3. CoCreateInstanceEx

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

Использование СоСге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 - создаем нового шимпанзе О, // по aggregation - без агрегирования CLSCTX_ALL, // any locality - любое расположение О, // 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<IApe*>(mqi.pItf); assert(pApe); // use the new object - используем новый объект hr = pApe->EatBanana(); // release the Interface pointer // освобождаем указатель интерфейса pApe->Release(); } return hr; }




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



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