• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 关于<<com技术内幕>>第八章聚合中的一个问题

关于<<com技术内幕>>第八章聚合中的一个问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了&lt gt,&lt br gt,阿长与 lt 山海经 gt,jquery gt lt,&lt br gt lt br gt等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 关于<<com技术内幕>>第八章聚合中的一个问题
描述:

在第八章中的一个例子,组件CA实现了接口IX,CB实现了接口IY,CA聚合CB。如下
CA::Init()
{
...
HRESULT hr =
::CoCreateInstance(CLSID_Component2,   
                   pUnknownOuter, // Outer component's IUnknown @N
                   CLSCTX_INPROC_SERVER,
                   IID_IUnknown,  // IUnknown when aggregating  @N
                   (void**)&m_pUnknownInner) ; 
hr = m_pUnknownInner->QueryInterface(IID_IY, (void**)&m_pIY) ; 
//此时m_pUnknownInner应该指向内部组件的非代理未知接口,问题1.内部组件的非代理未知接口,
//并未实现QueryInterface(IID_IY, (void**)&m_pIY),为什么在此可以调用QueryInterface
//(IID_IY, (void**)&m_pIY)。问题2.当调用这个m_pUnknownInner->QueryInterface(IID_IY, 
//(void**)&m_pIY) ;后,内部组件将调用转给外部组件的QueryInterface。外部组件是这样实现的
// else if (iid == IID_IY)
// {
// trace("Return inner component's IY interface.") ;
//#if 1
// You can query for the interface.
// return m_pUnknownInner->QueryInterface(iid,ppv) ; //@N
//#else
// Or you can return a cached pointer.
// *ppv = m_pIY ;   //@N
//这样外部组件m_pUnknownInner->QueryInterface(iid,ppv),相当于又调用内部组件的
//QueryInterface,这样形循环调用,不就出错了吗,为什么,初学请高手帮忙
...
}


解决方案1:

是这样的:
1.虚函数的调用是基于虚表的,而不是函数名称,举个简单的例子
Class A
{
    virtual void PrintA()
    {
        printf("A::PrintA()\n");
    }
}
class B
{
    virtual void PrintB()
    {
        printf("B::PrintB()\n");
    }
}
main()
{
    A* pA = new A;
    B* pB = (B*)pA;
    pB->PrintB();
}
com里面的那个m_pUnknownInner用的是同样的方式,委托IUnknown和非委托IUnknown虚表结构完全相同,所以和上面的例子类似,pB->PrintB()输出A::PrintA()
2.同样的道理m_pUnknownInner->QueryInterface(IID_IY, (void**)&m_pIY)
调用的是非委托的QueryInterface,请求IID_IY

解决方案2:

1、非代理IUnknown接口和代理IUnknown接口内存布局一致(函数原型和地址顺序一致),可以互相强制转换(必须使用reinterpret转换)。
2、外部组件m_pUnknownInner->QueryInterface(iid,ppv),调用的是内部组件非代理IUnknown接口上的QueryInterface实现,这时调用不会再转发给外部组件的QueryInterface,不会造成循环。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 求<<com技术内幕>>的配书光盘
  • 求电子书-------<<COM原理与应用>>
  • 谁有<COM原理与应用>电子书,给小弟传一份!
  • 求<<InsideOLE>>中文版。
  • 求<<Atlinternals>>电子书
  • 如何用模板<class>实现一个树类型
  • 求<com技术内幕>英文版电子书,pdforchm,谢谢
  • 求<teechartv5开发资料>
  • ATL的CSimpleArray<>问题,愁死我啦
  • 为什么说CComQIPtr<IUnknown>是不合法的?

相关文章

  • 2017-06-04 组件实现屏蔽浏览器(ie,firefox中的”另存为“和“查看源代码”菜单的功能。急!!!
  • 2017-06-05 线程的简单问题求救谢谢大家200分
  • 2017-06-05 客户程序中显式加载dll时,如何使用dll中导出的类
  • 2017-06-04 连三次就不让回复了,也不让我提前了,索性再加100分只为求知。。
  • 2017-06-05 windows服务器,默认带了MTS吗?
  • 2017-06-05 怎样在多个线程中开多个开窗口?
  • 2017-06-05 如何读取客户端目录下文件?
  • 2017-06-04 一个关于ISAPIFilter的问题?
  • 2017-06-04 再问个串口发送的小问题
  • 2017-06-05 mfcdll中使用shockwaveflashobject控件遇到问题很纠结请大家帮忙!

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 线程与对话框
    • dll中能否使用SQLDMO啊?我怎么在stdafxh加入如下语句后编译,很多错误呢?在Win32Application中的exe工程中没有问题
    • 遇到错误了调不过去!!大家帮我看看~~~谢谢
    • import一个dll的作用是什么?
    • _bstr_t类型的变量怎么用类似LEFT(),RIGHT(),MID()之类的截取?不用MFC)
    • 弱弱的问几个名词activex,ocx,atl,com
    • DLL的一个问题
    • 钩子函数的问题!
    • ActiveX添家CHAR型属性的时候出错。
    • 如何让按钮的Click事件失效,不过按钮仍旧要保持Enabled状态?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有