Является ли когда-либо абсолютно необходимым вызывать QueryInterface () в COM? - PullRequest
1 голос
/ 04 июня 2019

В этом руководстве по расширению оболочки C ++ / COM программист демонстрирует (для целей редактирования), что вы можете отказаться от вызова QueryInterface() и просто вместо этого обойти общий объект. По крайней мере, это работает при реализации DllGetClassObject(). Он говорит, что цель QueryInterface() состоит в том, чтобы каждый объект говорил сам за себя, поддерживает ли он данный интерфейс.

Между тем, Microsoft, похоже, говорит , что QueryInterface() необходимо для получения указателя на определенный интерфейс объекта.

Так в какой степени QueryInterface() необходим? Есть ли время, когда вызов QueryInterface() абсолютно необходим, и без него код не работал бы? Или технически достаточно получить сам объект, как подсказывает видеоурок?

1 Ответ

5 голосов
/ 04 июня 2019

Нет, как правило, вы не можете пропустить вызов QueryInterface, если не знаете, что указатель интерфейса у вас уже правильный.

Если мы представим объект, который реализует IFoo и IBar, макет может выглядеть примерно так:

VT
  IFoo_QueryInterface(...)
  IFoo_AddRef()
  IFoo_Release()
  IFoo_FooFight(int, int)
VT
  IBar_QueryInterface(...)
  IBar_AddRef()
  IBar_Release()
  IBar_BarBarBar(int)

Экземпляр объекта может указывать на указатель v-таблицы IFoo s или указатель v-таблицы IBar s. Вызов 4-го метода, не зная, какой это действительно, приведет к сбою, потому что количество параметров не совпадает. И даже если подпись была одинаковой, вызывать произвольные методы не очень хорошая идея.

Видео, на которое вы ссылаетесь, сходит с рук только потому, что абоненты DllGetClassObject обычно запрашивают только IClassFactory. Но даже там это небезопасно, потому что кто-то может вместо этого попросить IClassFactory2. Поэтому правильные реализации DllGetClassObject должны также вызывать QueryInterface.

Я бы порекомендовал пытаться кодировать на C вместо C ++ при изучении основ COM, это заставляет вас самостоятельно обрабатывать все перенаправления v-таблиц. Подробнее смотрите этой серии .

...