为 HTML 控件提供建议:我应该何时调用 DispEventUnadvise?

Posted

技术标签:

【中文标题】为 HTML 控件提供建议:我应该何时调用 DispEventUnadvise?【英文标题】:Advising an HTML control: when should I call DispEventUnadvise? 【发布时间】:2014-02-02 07:46:43 【问题描述】:

我在 BHO 中使用 DispEventAdvise 以捕获特定复选框的 onclick 事件。你可以在my previous question 中看到代码(虽然它不是那么相关)。

为了以后能够调用DispEventUnadvise,我保留了对复选框IhtmlElement对象的引用。

    我应该何时致电DispEventUnadvise?有没有办法知道复选框何时消失?

    保留对IHTMLElement 对象的引用是否合法?我的意思是,当页面被销毁时,仍然有对该复选框对象的引用,它会发生什么?

【问题讨论】:

【参考方案1】:

当您不再希望接收事件时,您应该从事件源/连接点取消通知。特别是,该调用使连接点释放您的接收器接口指针。在 unadvising 之前,连接点持有一个引用并延长您的接收器对象的生命周期。

也就是说,您可以在任何时候选择退出,除了一般考虑之外,没有具体的好时机应该这样做。

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

在您的情况下,我认为您最好的出路是找到另一个合适的事件来查看整个文档何时消失并假设复选框也消失。另一个 [不太安全] 选项是监视您的接收器接口对象:一旦它的外部引用被连接点意外释放,这意味着它正在清理并且复选框将消失。

【讨论】:

谢谢,您的回答解决了这两点,尽管我希望获得有关“另一个合适的事件”的更多信息。我想我会继续尝试。也许建议文档“onunload”事件可以解决问题。 您确实会收到某种“离开”通知:当元素被销毁时,它会在接收器上调用Release。所以基本上,接收器上的引用计数达到零是你的信号源正在被破坏。不幸的是,像IDispEventImpl 这样的库存ATL 接收器类不容易拦截Release - 为此需要一个自定义接收器类。我过去做过。当然,当源被销毁并释放你的接收器时,调用DispEventUnadvise 是毫无意义的。

以上是关于为 HTML 控件提供建议:我应该何时调用 DispEventUnadvise?的主要内容,如果未能解决你的问题,请参考以下文章

我应该何时调用 StateHasChanged 以及 Blazor 何时自动拦截某些更改?

我应该何时调用 CancellationToken.ThrowIfCancellationRequested?

何时应该实现刷新令牌以及如何保持无状态?

何时何地为 caffe 调用和执行“REGISTER_SOLVER_CLASS(SGD);”?

编码自定义 SplitViewController - 我应该何时调用 viewWillAppear、viewDidAppear 等...?

每次渲染正文时都会调用 SwiftUI Picker onReceive()