我在BHO中使用DispEventAdvise来捕获特定复选框的onclick事件。您可以在my previous question中查看代码(尽管它并不相关)。

为了以后可以调用DispEventUnadvise,我保留了对复选框的IHTMLElement对象的引用。

  • 我什么时候应该调用DispEventUnadvise?有没有办法知道复选框何时消失?
  • 保留对IHTMLElement对象的引用甚至合法吗?我的意思是,当页面被破坏时,仍然有对该复选框对象的引用,它会发生什么?
  • 最佳答案

    当您不再希望接收事件时,应该从事件源/连接点取消建议。该调用尤其使连接点释放您的接收器接口(interface)指针。取消建议之前,连接点将保留一个引用并延长接收器对象的寿命。

    也就是说,您可以随时选择退出,除了一般注意事项外,没有任何具体的好时机。

    然而,问题“复选框何时消失”的另一部分则没有直接关系。连接到连接点时,您不会收到“离开”通知。即使整个页面都消失了,也要保持接口(interface)指针是合法的:该复选框(单独或与其所有者一起)将保持终止状态,直到释放所有外部引用(包括您的引用)为止。作为安全终止的一部分,当页面/文档消失时,它可能会从其侧面剥离连接点连接,因为将不会发生任何事件,并且文档会进行完整性清理,以避免循环引用和泄漏。

    对于您而言,我想您最好的出路是找到另一个合适的事件,以查看整个文档何时消失,并假定复选框也消失了。另一个[较不安全]的选择是监视您的接收器接口(interface)对象:一旦连接点意外释放了它的外部引用,这意味着其清理和复选框将消失。

    关于c++ - 建议HTML控件:何时应调用DispEventUnadvise?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21110352/

    10-08 21:14