Нет, как правило, вы не можете пропустить вызов 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-таблиц. Подробнее смотрите этой серии .