,,C++ COM编程之QueryInterface函数(二)

,,C++ COM编程之QueryInterface函数(二)

本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • vs2015打包安装程序,vs2015程序打包,VS2022实现VC++打包生成安装文件图文详细历程
  • vc++6.0的快捷键,vc 快捷键
  • vc++6.0的快捷键,vc 快捷键,VC6.0常用快捷键大全
  • 绘制圆角矩形的方法,c++ 画矩形,C#画圆角矩形的方法
  • 懒汉式和饿汉式代码,单列模式懒汉和饿汉,C++单例模式的懒汉模式和饿汉模式详解
  • 好用的C++编译器,c++编译软件哪个好
  • semaphore c#,c++ semaphore
  • semaphore c#,c++ semaphore,C++中Semaphore内核对象用法实例
  • dev-c++使用教程,dev c++安装教程
  • dev-c++使用教程,dev c++安装教程,Dev C++ 安装及使用方法(图文教程)
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针,简单总结C++中指针常量与常量指针的区别
  • com组件初始化失败,c#开发com组件,C++中COM组件初始化方法实例分析
  • c++静态成员变量使用,c++静态成员函数和静态成员变量
  • c++静态成员变量使用,c++静态成员函数和静态成员变量,详解c++ 静态成员变量
  • 留言与评论(共有 条评论)
       
    验证码: