如果调用unadvise断开事件连接失败,会有什么后果?

liumeiqinyang 2009-03-06 02:16:32
在断开事件连接后要释放资源,release掉CreateInstance产生的对象,但是如果万一unadvise失败,返回值不是S_OK,该如何处理?

让程序返回?还是继续执行释放资源等?
程序返回会有泄漏吧,事件断开失败后继续执行直到进程结束,会不会也有泄漏?

请问:该如何善后处理?
...全文
135 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
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返回值什么,根据返回结果再做处理...

3,245

社区成员

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

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