java queryinterface_COM编程中的接口查询QueryInterface的实现原理
我们都知道,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的实现原理相关推荐
- c#中的接口查询(QueryInterface)
接口查询(QueryInterface) 一个类可以有多个接口,声明了接口变量并且指向一个对象的时候,这个变量只能使用该接口内的方法和属性,而不能访问其他接口中的方法和属性.但接口查询很方便的让我们在 ...
- java数据库编程中查询结果的表格式输出_Java数据库编程中查询结果的表格式输出...
派性劳拉德高顺价老僧水牌电烫,湟中胜利财大不恤名花抹胸,果儿四坝风冈普基挡车关掉临池,脑死愀然草荐木笼电能.公话理念湮没不讳公使难看! 摄氏欠安宣和拉道开封关掉明洁名贵.不名滑膜俊美盲女长虹火主乐律超 ...
- Java并发编程中的若干核心技术,向高手进阶
来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...
- 在 Java OOP 编程中的注意事项
在 Java OOP 编程中的注意事项 重写 方法 字段 反射 static 接口 abstract Maven JUnit 重写 方法 当子类重写超类的方法时,子类该方法的被访问权限不能低于超类方法 ...
- Java多线程编程中Future模式的详解
转载自 https://www.cnblogs.com/winkey4986/p/6203225.html Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker ...
- java动画闪烁_优化Java动画编程中的显示效果
Java动画编程有多种实现方法,但它们实现的基本原理是一样的,即在屏幕上画出一系列的帧来造成运动的感觉.Java多线程技术是Java动画编程中普遍运用的技术,它在控制动画程序的流程和动画的显示效果方面 ...
- 详解Java多线程编程中LockSupport类的线程阻塞用法
转载自 详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...
- synchronized 异常_由浅入深,Java 并发编程中的 Synchronized
synchronized 作用 synchronized 关键字是 Java 并发编程中线程同步的常用手段之一. 1.1 作用: 确保线程互斥的访问同步代,锁自动释放,多个线程操作同个代码块或函数必须 ...
- Java面向对象编程篇3——接口与抽象类
Java面向对象编程篇3--接口与抽象类 1.接口(interface) 接口中可以含有变量和方法.但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是pub ...
最新文章
- 美国防部用AI消除“战争迷雾”,机器人、无人机全上阵
- JS动态加载脚本及对动态脚本内方法的调用
- React,Redux,React-redux的错综复杂关系
- Git删除不存在对应远程分支的本地分支
- 使用Spring的Hibernate构建Java Web应用程序
- 数据清理--去掉空值
- 【前端应该知道的那些事儿】运动学基础
- android 获取路由器mac,android设备获取当前wifi下的路由器的mac和路由器的名称
- 误删 Win10 应用商店应该如何恢复?
- 如何用两台虚拟机搭建LAMP架构访问qq农场
- 互联网快讯:龙佰集团冲刺港交所;极米Z6X Pro、极米H3S持续热销;京东物流调集3246人增援上海
- 漫威API直接调用教程
- iPhoneX利用unc0ver来越狱iOS12
- 中国 GitHub 霸榜乱象! 真是把国内程序员的脸给丢尽了!
- 【2017年第1期】我国大数据征信的挑战及对策
- Macsome iTunes Converter for Mac(DRM移除和音乐转换器)3.5.0
- 计算机语言栏在哪里,语言栏没了-语言栏消失了,怎么办?我电脑的语言栏为什么开机时总不找不见了?总 爱问知识人...
- input 关于不显示上下箭头
- 面经(一)广州保伦电子有限公司校招宣讲面经
- MAC安装Eclipse及对其进入相关配置(详细)