我在BHO中使用DispEventAdvise
来捕获特定复选框的onclick
个事件。您可以在my previous question中看到代码(虽然它不相关)。
为了能够稍后致电DispEventUnadvise
,我会继续引用该复选框的IHTMLElement
对象。
我应该何时致电DispEventUnadvise
?有没有办法知道复选框什么时候消失?
保持对IHTMLElement
对象的引用是否合法?我的意思是,当页面被销毁,并且仍然存在对该复选框的对象的引用时,它会发生什么?
答案 0 :(得分:2)
当您不想再接收事件时,您应该从事件源/连接点取消监控。特别是,调用使连接点释放接收器接口指针。在取消设置之前,连接点会保留一个引用并扩展您的接收器对象的生命周期。
也就是说,只要您想要退出,就可以在任何时候打电话给它,除了一般考虑因素之外,没有特别的好时机。
问题的另一部分“当复选框何时消失”但是没有直接相关。连接到连接点后,您不会收到“离开”通知。即使整个页面消失,保持一个接口指针也是合法的:复选框,单独或与其所有者一起,将保持终止状态,直到释放所有外部引用(包括你的引用)。作为安全终止的一部分,当页面/文档消失时,它可能会从其侧面剥离连接点连接,因为不会发生任何事件,文档正在进行完整性清理以避免循环引用和泄漏。
在您的情况下,我认为您最好的方法是找到另一个合适的事件,以查看整个文档什么时候消失,并假设复选框也会消失。另一个[安全性较低]选项是观察您的接收器接口对象:一旦其外部引用被连接点意外释放,这意味着它正在进行清理并且复选框将消失。