COM编程中QueryInterface

scutcsxiao 2009-07-27 04:17:25
在网上看到关于QueryInterface实现的介绍,有些不懂。

HRESULT 实现类::QueryInterface( const IID& iid,void **ppv)
{
if( iid== IID_接口一)
*ppv=(j接口一*) this
else if( iid== IID_接口二)
*ppv=(j接口二*) this

//其他以此类推
}
QueryInterface中查询的时候,是将实现类的this指针强制转换成要查询的接口的类型,这个时候在内存中发生的操作是将this的内存块切割成要查询的接口的内存大下,然后将这块内存填入传入的void指针。这就获取了要查询的接口。因为实现类的内存中是包含了要查询的接口的内存结构,因此,上面的操作是可实现的。
原文网址是:http://blog.csdn.net/dotnet90/archive/2009/02/14/3890251.aspx


我不明白的是当一个实现类中有多个接口的时候,为什*ppv都等于this,强制转换可以改变它的值吗?

...全文
88 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
socoola 2009-07-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 scutcsxiao 的回复:]
了解了,谢谢socoola
[/Quote]
我也要谢谢你:),之前我没注意过这个问题,看到你提问才弄明白。
scutcsxiao 2009-07-27
  • 打赏
  • 举报
回复
了解了,谢谢socoola
socoola 2009-07-27
  • 打赏
  • 举报
回复
估计楼主跟我一样,是一个C语言程序员:)
C++的类型转换与C的类型转换不同,编译器帮你处理了不少东西,对一个子类转换成基类时编译器自动帮你完成处理指针的转换(子类包含了所有父类的拷贝,编译器应该只需要把指针偏移就可以实现),楼主疑惑的地方要看编译器如何处理类的实现才行,这里有一篇文章估计可以解惑。
http://edu.codepub.com/2009/0725/10979.php C++类对象内存结构
http://os.deepin.org/read-htm-tid-1087179.html 标准C++类型转换符
z888c 2009-07-27
  • 打赏
  • 举报
回复
static_cast<>
scutcsxiao 2009-07-27
  • 打赏
  • 举报
回复
子类能够转换成父类我能理解,关键是这句话“这个时候在内存中发生的操作是将this的内存块切割成要查询的接口的内存大下,然后将这块内存填入传入的void指针”。类型转换操作是怎么做到这些的。
ouyh12345 2009-07-27
  • 打赏
  • 举报
回复
com是基于多继承的,子类当然能转换成父类

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧