首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

QueryInterface的本质初探

QueryInterface接口对COM的重要性不言而喻,该接口的实现有个规则——由QueryInterface返回的IUnknow接口指针必须相同,我的疑问是微软是如何使用C++实现这一COM规则的呢...这个问题的回答归总如下: 实现组件的类实现了IUnkown中的虚函数QueryInterface,这一点保证实现组件的类维护的虚表VTBL中存储的是该类中实现的QueryInterface函数地址,而不是父类中的...QueryInterface函数地址。...COM的QueryInterface函数也就是使用了C++虚函数的这一技术规则;只要COM组件类实现了QueryInterface接口函数,无论怎么调用该函数,该函数中使用的this指针始终指向组件类的实例...以上解释可以能比较啰嗦,但是看官要定下神来慢慢缕缕就能理解QueryInterface的本质了,要通晓COM本质,这点必须弄明白,因为QueryInterface对COM来说实在是太重要了。

37320

COM聚合技术中的QueryInterface

最近在看COM聚合技术时遇到一个关于QueryInterface的问题。在《COM技术内幕》和《COM原理与应用》中都是寥寥数句带过,看起来很易理解,我却看了许久才有所领悟。...(const IID& iid, void** ppv) { return m_pUnknownOuter->QueryInterface(iid, ppv); } 现在假设外部组件CB实现了接口...,通过上述代码来看,理论上应该会调用CA::QueryInterface(),而根据QueryInterface的实现,又会调用回外部组件的查询函数CB::QueryInterface(),从而形成了一个死循环...而实际运行当然不会出现这种情况,在查询IY接口时,会调用NondelegatingQueryInterface而非QueryInterface!原因何在?...简单来说,问题是明明调用了QueryInterface函数,结果却是调用了NondelegatingQueryInterface。

87120
领券