1 c++ com winapi shell-extensions queryinterface
在此 C ++ / COM Shell扩展教程中,程序员演示了(出于启发目的)您可以放弃调用,QueryInterface()而只是传递一个通用对象。至少在实施时有效DllGetClassObject()。他说,的目的QueryInterface()仅仅是让每个对象自己说出是否支持给定的接口。
与此同时,微软似乎说的是QueryInterface()要获得一个指向特定接口的对象上。
那么到什么程度是QueryInterface()必要的?有什么时候调用QueryInterface()绝对必要的,没有它,代码将无法工作?还是像视频教程所建议的那样,使对象本身在技术上足够?
不,通常来说,QueryInterface除非知道接口指针已经正确,否则您不能跳过调用。
如果我们想象一个实现IFoo和IBar的对象,则布局可能如下所示:
VT
IFoo_QueryInterface(...)
IFoo_AddRef()
IFoo_Release()
IFoo_FooFight(int, int)
VT
IBar_QueryInterface(...)
IBar_AddRef()
IBar_Release()
IBar_BarBarBar(int)
Run Code Online (Sandbox Code Playgroud)
对象的实例可能指向IFoov表指针或IBarv表指针。在不知道它到底是哪一个的情况下调用第4个方法将崩溃,因为参数数不相同。即使签名相同,调用任意方法也不是一个好主意。
您所指的视频只是因为呼叫者DllGetClassObject通常只要求而不带它IClassFactory。但即使在那也不安全,因为有人可能会要求IClassFactory2代替。DllGetClassObject因此,正确的实现也应该调用QueryInterface。
我建议在学习COM基础知识时尝试使用C而不是C ++进行编码,这会迫使您自己处理所有v表间接操作。看看这个系列的细节。
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |