我们都知道,COM组件编程中,QueryInterface实现的接口之间的查询,通过这个接口,我们可以获取该组件中其他的接口。但

是,QueryInterface实现的原理,并不是大家都很清楚,也没有哪本书仔细讲了这点。我将个人心得写下来,供有需要的人查看。首先,我们看一下

基本的COM实现。一般来说,COM是 通过多继承实现多个接口,如下图

而对应的QueryInterface实现如下

HRESULT 实现类::QueryInterface(

const

IID

&

iid,

void

**

ppv)

...

{

if

( iid

==

IID_IUnknown)

*

ppv

=

(接口一

*

)

this

;

else

if

( iid

==

IID_接口一)

*

ppv

=

(j接口一

*

)

this

//

其他以此类推

}

在查询IUnknown接口的时候,如下面查询

IUnknwon

*

Unknown;

实现类.QueryInterface(IID_IUnknown,

void

(

**

)Unknown);

//

其他以此类推

看完了如何使用,我们现在讲实现原理.首先,QueryInterface通过传入的IID参数来判断要查询哪个接口.

因为多个接口的实现是通过多继承实现的。所以,实现类的的内存结构

(参照 Inside the c++ object mode

)如下图

注意,QueryInterface中查询的时候,是将实现类的this指针强制转换成要查询的接口的类型,这个时候在内存中发生的操作是将

this的内存块切割成要查询的接口的内存大下,然后将这块内存起始地址

填入传入的void指针。这就获取了要查询的接口。因为实现类的内存中是包含了要查询的接

口的内存结构,因此,上面的操作是可实现的。整个过程如下图

这就是接口查询的实现原理。

至于组件的另外一种基于模板的实现,例如ATL,就比较复杂,看有需要的话再写关于这方面的文章。

上面的过程是我自己个人总结出来的。如果错误,请各位指正。

感觉讲得太好,忍不住抄袭了,呵呵

推荐这本书:Inside the c++ object mode,可惜网上就找到英文电子版,看着累

java queryinterface_COM编程中的接口查询QueryInterface的实现原理相关推荐

  1. c#中的接口查询(QueryInterface)

    接口查询(QueryInterface) 一个类可以有多个接口,声明了接口变量并且指向一个对象的时候,这个变量只能使用该接口内的方法和属性,而不能访问其他接口中的方法和属性.但接口查询很方便的让我们在 ...

  2. java数据库编程中查询结果的表格式输出_Java数据库编程中查询结果的表格式输出...

    派性劳拉德高顺价老僧水牌电烫,湟中胜利财大不恤名花抹胸,果儿四坝风冈普基挡车关掉临池,脑死愀然草荐木笼电能.公话理念湮没不讳公使难看! 摄氏欠安宣和拉道开封关掉明洁名贵.不名滑膜俊美盲女长虹火主乐律超 ...

  3. Java并发编程中的若干核心技术,向高手进阶

    来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...

  4. 在 Java OOP 编程中的注意事项

    在 Java OOP 编程中的注意事项 重写 方法 字段 反射 static 接口 abstract Maven JUnit 重写 方法 当子类重写超类的方法时,子类该方法的被访问权限不能低于超类方法 ...

  5. Java多线程编程中Future模式的详解

    转载自 https://www.cnblogs.com/winkey4986/p/6203225.html Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker ...

  6. java动画闪烁_优化Java动画编程中的显示效果

    Java动画编程有多种实现方法,但它们实现的基本原理是一样的,即在屏幕上画出一系列的帧来造成运动的感觉.Java多线程技术是Java动画编程中普遍运用的技术,它在控制动画程序的流程和动画的显示效果方面 ...

  7. 详解Java多线程编程中LockSupport类的线程阻塞用法

    转载自  详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...

  8. synchronized 异常_由浅入深,Java 并发编程中的 Synchronized

    synchronized 作用 synchronized 关键字是 Java 并发编程中线程同步的常用手段之一. 1.1 作用: 确保线程互斥的访问同步代,锁自动释放,多个线程操作同个代码块或函数必须 ...

  9. Java面向对象编程篇3——接口与抽象类

    Java面向对象编程篇3--接口与抽象类 1.接口(interface) 接口中可以含有变量和方法.但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是pub ...

最新文章

  1. 美国防部用AI消除“战争迷雾”,机器人、无人机全上阵
  2. JS动态加载脚本及对动态脚本内方法的调用
  3. React,Redux,React-redux的错综复杂关系
  4. Git删除不存在对应远程分支的本地分支
  5. 使用Spring的Hibernate构建Java Web应用程序
  6. 数据清理--去掉空值
  7. 【前端应该知道的那些事儿】运动学基础
  8. android 获取路由器mac,android设备获取当前wifi下的路由器的mac和路由器的名称
  9. 误删 Win10 应用商店应该如何恢复?
  10. 如何用两台虚拟机搭建LAMP架构访问qq农场
  11. 互联网快讯:龙佰集团冲刺港交所;极米Z6X Pro、极米H3S持续热销;京东物流调集3246人增援上海
  12. 漫威API直接调用教程
  13. iPhoneX利用unc0ver来越狱iOS12
  14. 中国 GitHub 霸榜乱象! 真是把国内程序员的脸给丢尽了!
  15. 【2017年第1期】我国大数据征信的挑战及对策
  16. Macsome iTunes Converter for Mac(DRM移除和音乐转换器)3.5.0
  17. 计算机语言栏在哪里,语言栏没了-语言栏消失了,怎么办?我电脑的语言栏为什么开机时总不找不见了?总 爱问知识人...
  18. input 关于不显示上下箭头
  19. 面经(一)广州保伦电子有限公司校招宣讲面经
  20. MAC安装Eclipse及对其进入相关配置(详细)

热门文章

  1. Win10使用远程桌面黑屏怎么解决
  2. 反恐精英CS 2将于今夏推出,采用起源2引擎开发
  3. Dethe is my Finaunce金融
  4. URL传递参数中的特殊字符:[]
  5. office 相关产品激活失败原因探讨
  6. particles.js粒子特效(常用登录页背景)
  7. 开关电源精确到每个元件-分解电源电路
  8. 什么是element-wise
  9. CAD图纸怎么输出为PDF?几个步骤教会你
  10. Qt Android 环境搭建