社区
ATL
帖子详情
如果调用unadvise断开事件连接失败,会有什么后果?
liumeiqinyang
2009-03-06 02:16:32
在断开事件连接后要释放资源,release掉CreateInstance产生的对象,但是如果万一unadvise失败,返回值不是S_OK,该如何处理?
让程序返回?还是继续执行释放资源等?
程序返回会有泄漏吧,事件断开失败后继续执行直到进程结束,会不会也有泄漏?
请问:该如何善后处理?
...全文
102
4
打赏
收藏
微信扫一扫
点击复制链接
分享
下载分享明细
分享
举报
写回复
4 条
回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
jameshooo
2009-03-06
对,无需检查。
当advise的时候,组件会保存连接点的IDispatch指针,同时会增加连接点的引用计数;当Unadvise的时候组件会调用连接点的Release。只要把生命周期交给Release来管理就不会出错。
打赏
举报
回复
赞
liumeiqinyang
2009-03-06
很久以前胡兄答过我问的关于outlook开发的问题,
我保存了CreateInstance(&pEvent)创建的实例创建的实例,然后在onclose时断开挂接的事件连接,
然后pEvent->Release();
这样,是否说,无需检查unadvise的返回值,调用unadvise后pEvent->Release()即可?
打赏
举报
回复
赞
jameshooo
2009-03-06
正常情况下unadvise是不会失败的,除非组件或者连接点实现者已经被提前释放了,但如果都按照AddRef/Release机制来处理的话不会发生提前释放的问题。
如果连接点实现者的生命周期比组件长,那么即使不调用unadvise一般也不会有问题,通常情况下一个组件被释放时它会自动清理所有连接点(要看个人的实现习惯)。
如果连接点实现者的生命周期比组件短,那么客户端必须显式调用unadvise,然后才能释放连接点实现者实例,否则组件在激发事件时程序会发生异常,因为回调接口已经不存在了。
打赏
举报
回复
赞
oyljerry
2009-03-06
查看unadvise返回值什么,根据返回结果再做处理...
打赏
举报
回复
赞
相关推荐
基于VC编写COM
连接
点
事件
的分析介绍
本篇文章是对VC编写COM
连接
点
事件
进行了详细的分析介绍,需要的朋友参考下
C++
调用
ATL
事件
连接
点
在
调用
者工程中,需要增加“接收器”对象,添加一般的C++类对象,从IDispatch 派生,然后完成继承的虚函数,如创建 CSink类,继承自IDispatch ,完成Simple16库中触发
事件
的接收器。 // 头文件 #pragma once #...
VC编写COM
连接
点
事件
VC编写COM
连接
点
事件
COM 中的典型方案是让客户端对象实例化服务器对象,然后
调用
这些对象。然而,没
有
一种特殊机制的话,这些服务器对象将很难转向并回调到客户端对象。COM
连接
点便提供了这种特殊机制,实现了...
COM
连接
点
事件
event
COM 中的典型方案是让客户端对象实例化服务器对象,然后
调用
这些对象。然而,没
有
一种特殊机制的话...
有
了
连接
点,服务器可通过定义一个接口来指定它能够引发的
事件
。服务器上引发
事件
时,要采取操作的客户端
会
向服务器
19.MFC中实现可
连接
对象和接收器
可
连接
对象是COM中观察者模式实现,非常
有
用,特别和IE组件打交道时候要用到。本文使用MFC实现可
连接
对象和对应的接收器,提供完整代码实现,可对比学习。
发帖
ATL
微信扫一扫
点击复制链接
分享社区
下载分享明细
3233
社区成员
4.8w+
社区内容
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
帖子事件
创建了帖子
2009-03-06 02:16
社区公告
暂无公告