Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Программы Обои   Экспорт RSS E-Books
 
 

   Программирование -> C/C++ -> Сущность технологии COM


QueryInterface транзитивна

Спецификация СОМ требует также, чтобы, если запрос QueryInterface на интерфейс В удовлетворяется через интерфейсный указатель типа A, а второй запрос QueryInterface на интерфейс C удовлетворяется через указатель типа В, то запрос QueryInterface на интерфейс C через исходный указатель типа A был бы также успешным. Это означает, что если верно

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

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

QI(A)->C

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

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

Рис. 4.3. QueryInterface и транзитивность

Из транзитивности QueryInterface следует, что все интерфейсы, которые выставляет объект, равноправны и не требуют, чтобы их вызывали в какой-то определенной последовательности. Если бы это было не так, то клиентам пришлось бы заботиться о том, какой указатель на объект использовать для различных запросов QueryInterface. Из транзитивности и симметричности QueryInterface следует, что любой интерфейсный указатель на объект выдаст тот же самый ответ "да/нет" на любой запрос QueryInterface. Единственная ситуация, не охватываемая транзитивностью и симметричностью, это повторные запросы одного и того же интерфейса. Эта ситуация требует, чтобы QueryInterface был и рефлективным.

QueryInterface рефлективна
Объекты имеют статический тип
Единственность и идентификация
QueryInterface и IUnknown
Множественные интерфейсы и имена методов
Динамическая композиция
Двоичная композиция
Включение
Где мы находимся?

 

 
Интересное в сети
 
10 новых программ
CodeLobster PHP Edition 3.7.2
WinToFlash 0.7.0008
Free Video to Flash Converter 4.7.24
Total Commander v7.55
aTunes 2.0.1
Process Explorer v12.04
Backup42 v3.0
Predator 2.0.1
FastStone Image Viewer 4.1
Process Lasso 3.70.4
FastStone Image Viewer 4.0
Xion Audio Player 1.0.125
Notepad GNU v.2.2.8.7.7
K-Lite Codec Pack 5.3.0 Full


Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
Реклама на сайте. Размещая рекламу у нас, вы получите новых посетителей, которые могут стать вашими клиентами.
 
Это интересно
 

Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.
 
Rambler's Top100