я использую DispEventAdvise
в BHO для того, чтобы захватить onclick
события определенного флажка. Вы можете увидеть код в мой предыдущий вопрос (хотя это не так актуально).
Для того, чтобы можно было позвонить DispEventUnadvise
позже я сохраню ссылку на IHTMLElement
Объект флажка.
Когда мне следует позвонить DispEventUnadvise
? Есть ли способ узнать, когда флажок уходит?
Законно ли хранить ссылку на IHTMLElement
объект? Я имею в виду, когда страница уничтожена, и все еще есть ссылка на объект этого флажка, что с ней происходит?
Ожидается, что вы не будете получать уведомления от источника события / точки подключения, когда вы больше не хотите получать события. При вызове, в частности, точка соединения освобождает указатель интерфейса приемника. Прежде чем не обращать внимания, точка подключения содержит ссылку и продлевает срок службы вашего объекта-получателя.
То есть, вы называете это в любое время, когда хотите отказаться, нет конкретного хорошего времени, когда вы должны это делать, кроме общих соображений.
Другая часть вопроса «когда флажок уходит», однако, не имеет прямого отношения. При подключении к точке подключения вы не получите уведомление об уходе. Законно удерживать указатель интерфейса, даже если вся страница исчезла: флажок, один или вместе с его владельцем, будет оставаться в завершающем состоянии до тех пор, пока не будут освобождены все внешние ссылки (включая вашу). Как часть безопасного завершения, когда страница / документ исчезает, он может лишить соединения точки соединения со своей стороны, потому что никакие события не будут следовать, и документ выполняет очистку, чтобы избежать циклических ссылок и утечек.
В вашем случае, я полагаю, ваш лучший выход — найти другое подходящее событие, чтобы увидеть, когда весь документ исчезнет, и предположить, что флажок также исчезает. Другой [менее безопасный] вариант — наблюдать за объектом интерфейса приемника: как только его внешняя ссылка неожиданно освобождается точкой подключения, это означает, что его очистка и флажок исчезают.
Других решений пока нет …