• 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

佚名通过本文主要向大家介绍了 COM学习屡学屡败,大家来帮帮忙等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: COM学习 屡学屡败,大家来帮帮忙
描述:

一直想好好学这个,可一直学不好,书看了不少,可是总是看到某些部分就很难理解下去。比如“连接点”,线程模式,Marshalling……都是绊脚石,一绊我就过不去。
比如这个问题,大家来解释一下:
A是被B聚合的对象,A对QueryInterface的实现是这样的:
HRESULT CB::QueryInterface(const IID& iid, void **ppv)
{
if ( iid == IID_IUnknown )
{
*ppv = (IUnknown *) this ;
((IUnknown *)(*ppv))->AddRef() ;
} else if ( iid == IID_OtherInterface ) 
{
*ppv = (IOtherInterface *) this ;
((IOtherInterface *)(*ppv))->AddRef() ;
} else if ( iid == IID_SomeInterface ) 
{
//m_pUnknownInner指向A
return m_pUnknownInner->QueryInterface(iid, ppv) ;
}
else 
{
*ppv = NULL;
return E_NOINTERFACE ;
}
return S_OK;
}
HRESULT CA::QueryInterface(const IID& iid, void **ppv)
{
if  ( m_pUnknownOuter != NULL )
//m_pUnknownOuter指向B
return m_pUnknownOuter->QueryInterface(iid, ppv);
else
return NondelegationQueryInterface(iid, ppv);
}
这代码来自潘爱民的书中,我试过了,没有问题,可我不理解。如果客户端已经获取了A的接口,并用这个接口再次请求一个A的接口,m_pUnknownOuter此时指向B,B又会指向A,A又会指向B……那这算不算死循环调用?事实上,这个函数只被调了一次。为什么?


解决方案1:

不用这么细究吧,QueryInterface不就相当于=吗?聚合不就是相当于继承吗?
而且就目前的开发环境下,直接用=就可以了,而且会有意想不到的结果(比如两个接口没任何关系,但有相同的方法或属性,
用=可以通过编译并运行)。关于连结点,找个例子看看就行了。与其深刻钻研atl com原理,不如看几本什么什么实例的书,
这样学起来快,也有信心;学那么深,万一哪天淘汰了不冤吗?
写那本很牛的STL书的人说过了:不要试图超越stl,不要去深究stl怎么实现的,要学使用stl。
借用一下:不要去研究atl什么原理了,不要去钻研atl的内幕了,要学会使用atl就行了。
实际上,作为一个过来人,在真正的com开发过程中,开始的时候,最大麻烦在于什么字符串、数组啊、类型转换啊、界面开发啊这些问题上。

解决方案2:

COM方面,最好的书还是Dan Box那本COM本质论

解决方案3:

com 当然有法调试,和调试dll差不多 ,在com中设置断点,先启动一个调用这个com的进程,,附加到这个进程当中,然后启动调用com。

解决方案4:

你调试一下就知道
虚表改变了不会死循环

解决方案5:

有IID的比较的,不会死循环的~


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

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

  • COM学习屡学屡败,大家来帮帮忙

相关文章

  • 2017-06-05 我用vc写了一个dll,里面用到了CSocket类,在pb下调用不成功,把CSocket类去了就可以,为什么?
  • 2017-06-04 关于智能指针的一个问题
  • 2017-06-05 各位老大这个是什么问题啊?
  • 2017-06-04 如何控制URL的跳转?
  • 2017-06-05 关于键盘钩子
  • 2017-06-05 vs2005创建ATLCOMServer(Exe)怎么是空的?
  • 2017-06-05 如何知道一个COM组件的接口函数
  • 2017-06-05 dfrgntfsexe进程是如何创建的
  • 2017-06-05 弱弱的问:如果我想在一个类里面执行另一个类里的public函数,怎么办?
  • 2017-06-04 一个自动化服务程序,怎么注册

文章分类

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

最近更新的内容

    • 控件下载问题,我已经弄了几天了,高手快来帮帮我!!谢!
    • 全局类的对象,在多线程中使用,要注意什么?
    • 为什么ActiveX的事件只有在OnDraw中去触发,页面才能接收到
    • 急需VS2005+VSTO+Office插件开发相关资料能提供相关资料网址最好,谢谢各位啦!!!
    • 程序只有一个线程,可是为什么在spy++里面显示有多个线程呢?
    • 我想写一个录音的dll,里面有录音,保存,暂停功能,不知道如何下手,请高手指点
    • 求助Querynterface的问题
    • Activex发布200分急!!!!!!!)
    • 用ATL的dll写过active控件的朋友进来,问个问题
    • 修改文件夹图标,就像快捷方式,如何不重启explorer使其自动显示?

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

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