При каких обстоятельствах Internet Explorer не может правильно выгрузить элемент управления ActiveX? - PullRequest
1 голос
/ 15 сентября 2008

У меня непонятная проблема с элементом управления ActiveX, который я пишу - иногда кажется, что Internet Explorer не может правильно выгрузить элемент управления при завершении процесса. Это приводит к тому, что деструктор экземпляра элемента управления не вызывается.

Элемент управления написан на C ++, использует ATL и скомпилирован с использованием Visual Studio 2005. Деструктор экземпляра элемента управления всегда вызывается, когда пользователь просматривает страницу, в которую встроен элемент управления, - проблема возникает только при закрытом браузере. ,

Когда я запускаю IE под отладчиком, я не вижу ничего необычного - отладчик не улавливает никаких исключений, нарушений доступа или ошибок утверждений, но проблема все еще существует - я могу установить точку останова в деструкторе элемента управления и это никогда не ударится, когда я закрою броузер.

Кроме того, когда я загружаю простую HTML-страницу, которая встраивает несколько экземпляров элемента управления, я не вижу проблемы. Проблема возникает только тогда, когда создается экземпляр элемента управления из нашего веб-приложения, которое динамически вставляет теги в веб-страницу - конечно, не зная, в чем причина этой проблемы, я не знаю, является ли этот бит информации релевантным или нет, но, похоже, это указывает на то, что это может быть проблемой IE, поскольку она зависит от данных.

Когда я запускаю простой тестовый пример под отладчиком, я могу установить точку останова в деструкторе элемента управления, и он срабатывает каждый раз. Я полагаю, что это исключает проблему с самим элементом управления (скажем, ошибку, которая помешала бы когда-либо вызывать деструктор, например, утечка интерфейса).

Я проводил большую часть тестирования с IE 6, но я видел, что проблема возникает и в IE 7. Я не проверял IE 8.

Моя рабочая гипотеза сейчас заключается в том, что в динамическом HTML-коде есть что-то, из-за чего браузер пропускает интерфейс в элементе управления ActiveX. До сих пор мне не удавалось создать хороший тестовый пример, который бы воспроизводил его вне приложения, а приложение слишком велико, чтобы сделать хороший тестовый пример.

Я надеялся, что кто-то сможет предоставить информацию о возможных ошибках IE, которые, как известно, вызывают такое поведение. Кстати, ответ, приведенный ниже, является слишком общим - я ищу конкретный набор обстоятельств, которые, как известно, вызывают это. Конечно, кто-то там видел это раньше.

Ответы [ 3 ]

3 голосов
/ 16 сентября 2008

Для отладки проблемы в COM с C ++, где деструктор объекта (C ++) не вызывается, лучше всего сосредоточиться на увеличении или уменьшении refcounts объекта COM. Вероятно, происходит то, что кто-то увеличивает счет слишком много раз, а затем не уменьшает его столько же раз. Это приводит к тому, что объект не освобождается.

Возможно, ваш динамический HTML просто показывает ошибку в IE, которая не происходит, если вы используете статическую страницу.

Если в IE есть ошибка, уловка состоит в том, чтобы выяснить, что вызывает ошибку, и что вы можете сделать, чтобы обмануть IE в правильном освобождении вашего COM-объекта (например, заставить HTML исчезнуть). 1005 *

0 голосов
/ 30 декабря 2008

У меня такая же проблема, но только на конкретном компьютере. У этого компьютера также есть проблема с Flash ActiveX, которая остается активной после закрытия вкладки. Я думаю, что проблема не в вашем коде. У вас есть такая проблема на других компьютерах?

0 голосов
/ 03 октября 2008

Другой подход - добавить код очистки к вашей функции DllMain (добавив эту функцию, если она еще не существует). Затем, независимо от количества ссылок (и ошибок количества ссылок), когда ваша DLL выгружается, вы можете очистить себя:

BOOL WINAPI DllMain(HINSTANCE, DWORD dwReason, LPVOID) {
    if (dwReason == DLL_PROCESS_DETACH) {
        CleanUpAnyObjectsStillAlive();
    }
}

О, и слово предупреждения - не занимайте слишком много времени на очистку - если вы это сделаете, я не могу обещать, что остановка процесса все равно вас не убьет.

...