• 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组件release接口的问题

COM组件release接口的问题

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

佚名通过本文主要向大家介绍了com组件接口,com组件,com组件是什么,com组件下载,com组件注册等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: COM组件release接口的问题
描述:

有这样一个类:
CMyClass()
{
   ...
   IMember *pMember;
    ...
   virtual ~CMyClass();
   CMyClass(IMember *p);  // CMyClass的创建需要一个IMember指针,该IMember对象已经创建,传入一个有效的*p
}
在构造函数中
CMyClass(IMember *p)
{
    pMember = p; // 经过这个赋值,p的引用计数是不是+1了?
    ...
}
在析构函数中:
~CMyClass()
{
    if(pMember)
    {
      // 问题在这里,如果上面pMember=p增加了引用计数,这里是该这样释放以减少引用计数么? 
      pMember->Release();
      pMember = NULL;} 
}
按我的理解好像是要这样做的,但偏偏这样做会出现“访问冲突”,去掉Release这一段就没问题了,不解,请大家指教。
《COM本质论》中有这样讲:
调用AddRef:
A1. 将非空指针写局部变量中;A2. 被调用方把一个非空指针写到方法输出参数中;
A3. 被调用方返回一个非空指针;
A4. 把一个非空指针写到对象的数据成员中.
调用Release
R1. 改写一个非局部变量或数据成员之前;
R2. 离开非空局部变量的作用域之前;
R3. 被调用方改写方法的参数,且参数为非空;
R4. 改写一个对象的非空数据成员之前;
R5. 在离开一个对象的析构函数之前, 并且这时还有一个非空接口接口指针作为数据成员.


解决方案1:

CMyClass(IMember *p)
{
    pMember = p; // 经过这个赋值,p的引用计数是不是+1了?
    ...
} 
不会+1 除非你显示的调用AddRef
建议你用CComPtr来封装这些COM指针, 这样你就不用考虑这个问题了

解决方案2:

构造的时候没有+1
析构的时候  有-1
收支不平衡

解决方案3:

你需要自己实现AddRef等来实现计数,同时第一次调用应该是new一个对象,以后使用QueryInterface,都是传递new的指针,同时AddRef计数
当你Release的时候,判断是不是计数为0了,为0了,就delete释放·

解决方案4:

构造函数中应该调用接口的AddRef


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

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

  • 怎样定义接口,使com组件能够返回一个二进制的流(比如图片数据)
  • 那个接口能在COM组件中实现可控制的定时器?
  • 如何将现有的项目,加些接口,变成进程外组件?
  • 服务组件的接口住息
  • 组件实现什么接口,可以读取或设置到IE的打印设置内容?
  • 初学COM,征集方案:你会怎么设计下面的组件和接口?
  • com组件能不能引出继承来的父接口?
  • 如何在COM组件中添加设置回调函数的接口?
  • 如何将COM+组件的接口方法设置为只能被COM+应用程序内部使用?
  • 关于组件接口的应用问题

相关文章

  • 2017-06-04 关于拖拽时的内存释放
  • 2017-06-04 100分~BHO的问题
  • 2017-06-05 钩子函数如何正确卸载?我应该在合适的时候调用卸载函数?
  • 2017-06-04 插入ActiveX后为什么关闭时有内存泄露
  • 2017-06-05 为什么我不能在类中定义线程函数?
  • 2017-06-04 关于WMPACTIVEX控件的创建时传送的容器句柄
  • 2017-06-05 如何使自己的进程不被用户使用任务管理器结束掉?怎样编写,请高手指点,如果有源代码就更好了!
  • 2017-06-04 请问哪里可以弄到3DActiveButtonMagic解密版阿?谢谢
  • 2017-06-04 如何增加一个ActiveX控件的属性页
  • 2017-06-04 atl项目为什么不能用sprintf啊,一编译就报错,不认识sprintf,需要加什么头文件么?

文章分类

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

最近更新的内容

    • 请教:如何把现有的工程vc6可执行程序做成dll?来者有分
    • 关于VC++与AJAX
    • H264视频数据每一帧的前后有多余内容要边剥离边解码播放有什么实现方案可以介绍下吗?
    • 急急急关于ActiveX引入FormView结构技术关闭释放问题
    • 帮帮我这个初学者
    • 关于ADO抛出异常问题
    • 急!!如何把splash组件删除重新再加一个
    • 打开文件对话框的难题!
    • activex开发与测试难题,请各位高手帮忙!谢谢
    • 很菜的问题。加载DLL出现的问题

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

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