在this C++ / COM Shell扩展教程中,程序员演示了(出于教育目的)您可以放弃调用QueryInterface()
,而只是传递一个通用对象。至少在实现DllGetClassObject()
时有效。他说QueryInterface()
的目的仅仅是让每个对象自己说明是否支持给定的接口(interface)。
同时,微软似乎say,QueryInterface()
是获得指向对象上特定接口(interface)的指针所必需的。
那么QueryInterface()
在什么程度上是必要的?有什么时候调用QueryInterface()
绝对必要的,没有它,代码将无法工作?还是像视频教程所建议的那样,使对象本身在技术上足够?
最佳答案
不,通常,除非知道接口(interface)指针已经正确,否则不能跳过调用QueryInterface
。
如果我们想象一个实现IFoo和IBar的对象,则布局可能如下所示:
VT
IFoo_QueryInterface(...)
IFoo_AddRef()
IFoo_Release()
IFoo_FooFight(int, int)
VT
IBar_QueryInterface(...)
IBar_AddRef()
IBar_Release()
IBar_BarBarBar(int)
该对象的实例可能指向
IFoo
的v表指针或IBar
的v表指针。如果不知道它到底是哪一个,则调用第4个方法将崩溃,因为参数计数不同。即使签名相同,调用任意方法也不是一个好主意。您所指的视频只是因为
DllGetClassObject
的调用者通常只要求IClassFactory
而无法使用。但即使在那也不安全,因为有人可能会要求IClassFactory2
。因此,正确的DllGetClassObject
实现也应该调用QueryInterface
。我建议在学习COM基础知识时尝试使用C而不是C++进行编码,这会迫使您自己处理所有v表间接操作。查看this series了解详细信息。
关于c++ - 在COM中绝对必须调用QueryInterface()吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56435428/