本文主要介绍C COM编程中的QueryInterface函数(2)。本文是第二篇。第一种请参考相关文献,有需要的可以参考。
前言
COM编程——了解组件中也有概述。COM是一个说明如何构建动态可互换组件的规范,它提供了客户和组件应该遵循的一些标准,以确保互操作性。在实现和使用QueryInterface时,我们需要遵循一些规则。只有遵循这些规则,才能做一个正确的COM组件。只有理解了这些规则,才能真正理解COM开发。
QueryInterface的实现规则
QueryInterface的实现需要以下五个规则:
1.QueryInterface总是返回相同的IUnknown指针
组件只有一个IUnknown接口。因为当你查询一个组件实例的IUnknown接口时,无论通过哪个接口都会得到相同的指针值。要判断两个接口是否指向同一个组件,可以通过这两个接口查询IUnknown interface,然后比较返回值。
这个规则很重要。如果QueryInterface的实现不遵循这个规则,将无法决定两个接口是否指向同一个组件。
2.如果客户已经获得了一个接口,那么它将永远得到它。
此规则定义了组件实例的QueryInterface的不变性;可以想象,如果组件实例的接口集不固定,客户就无法通过编程来决定一个组件有什么功能;客户会对你的COM组件失去耐心,没人会用你的COM组件。有什么意义?
3.客户可以再次获得他们已经拥有的界面。
如果客户有一个IX接口,可以再次查询IX接口指针,一定会成功。自己查,听起来有点奇怪,但肯定是有可能的。
4.客户可以从任何界面返回到起始界面。
如果客户有一个IX接口指针,并成功地使用它来查询一个IY接口,那么它将能够使用这个IY接口来查询一个IX接口。这个规则在实际项目开发中非常有用。
5.如果你能从某个接口得到一个特定的接口,你就能从任何接口得到这个接口。
如果可以从一个组件获得一个特定的接口,那么客户可以通过这个组件支持的任何接口获得这个接口。例如,如果可以通过接口IX获得接口IY,通过IY获得IZ,那么也可以通过IX获得IZ。该规则使QueryInterface可用。
总结所有的规则,内在的一点就是不管一个组件实现了多少个接口,它只实现了一个QueryInterface。所以在所有接口的vtbl中,对应的QueryInterface就是组件实现的QueryInterface的地址。所有接口指针调用QueryInterface进行查询时,都调用同一个QueryInterface。因此,这满足了上述规则。当你看了上面的规则,难免会觉得无所谓,以为都是文字,没意思。我开始的时候也是这样。正因为如此,在实际发展中,我们吃了不少苦头。所以,今天,我们在这里重新组织这些规则。希望你在实际项目中不要磕磕绊绊,回来找原因。为什么不防患于未然呢?
添加新的接口
如前一篇博文所总结的,COM中的接口不会改变。当一个组件发布了一个接口并被一个客户使用时,这个接口永远不会改变,但会永远保持不变。这里说不变是什么意思?因为每个接口都有唯一的接口标识符IID。一般来说,我们可以创建一个新的接口并为其分配一个新的IID,而不是更改接口。当QueryInterface接收到旧IID的查询时,会返回旧接口;当它收到一个新IID的查询时,它将返回一个新的接口。对于QueryInterface,IID是一个接口。
因此,IID对应的界面永远不会改变。新接口可以继承旧接口,也可以与旧接口完全不同。由于旧界面保持不变,现有客户的操作不会受到影响。新客户可以决定是使用旧界面还是新界面,因为它可以自由决定查询哪个界面。
新接口命名
虽然每个人的命名规则和每个公司的命名规则都不一样,但是COM接口的命名一般都是一样的。例如,如果原来的接口命名为IX,那么新接口命名为IX2,而不是IXEx。我经历了那么多项目,编写和调用了很多COM组件,基本都遵循这个规律,就是在旧名上加一个数字。
总结
这篇文章总结了理论,会让不喜欢的人失望。然而,事实就是如此。没有理论作为基础的实践都是一派胡言。任何事情都要有一定的理论基础,所以我通过两篇博文对QueryInterface做了详细的总结。希望对你有帮助。最后,我希望你能和我分享你的想法。我坚信交流是一种非常强大的学习方法。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。