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

       

QueryInterface симметрична


Спецификация СОМ требует, чтобы, если запрос QueryInterface на интерфейс B

удовлетворяется через интерфейсный указатель типа A, то запрос QueryInterface на интерфейс A того же самого объекта через результирующий интерфейсный указатель типа В всегда был успешным. Это значит, что если верно

QI(A)->B

то также должно быть верным

QI(QI(A)->B)->A

Из свойства, показанного на рис. 4.2, следует, что утверждение, заключенное в следующем коде, всегда должно быть истинным:

void AssertSymmetric(ICar *pCar) { if (pCar) { IPlane *pPlane = 0; // request a second type of interface // запрашиваем второй тип интерфейса HRESULT hr = pCar->QueryInterface(IID_IPlane, (void**)&pPlane); if (SUCCEEDED(hr)) { ICar *pCar2 = 0; // request original type of interface // запрашиваем исходный тип интерфейса hr = pPlane->QueryInterface(IID_ICar, (void**)&pCar2); // if the following assertion fails, pCar // did not point to a valid СОМ object // если следующее утверждение не будет правильным, // то pCar не укажет на правильный СОМ-объект assert(SUCCEEDED(hr)); pCar2->Release(); } pPlane->Release(); } }

Симметричность QueryInterface означает, что клиенты не должны заботиться о том, какой из интерфейсов запрашивать первым, так как любые два типа интерфейсов могут быть запрошены в любом порядке.



Содержание раздела