如果调用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返回值什么,根据返回结果再做处理...
  • 打赏
  • 举报
回复
发帖
ATL

3233

社区成员

ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
帖子事件
创建了帖子
2009-03-06 02:16
社区公告
暂无公告