Как я могу поймать сбой приложения или выйти в mshtml?

Наше приложение использует mshtml. Эта dll приводит к некрасивому завершению нашего приложения из-за хорошо известных проблем в mshtml, поскольку мы не устанавливаем более новые браузеры на компьютеры пользователей. Мы просто используем то, что у них уже есть.

SetUnhandledExceptionFilter() не справляется с этим, равно как и блок try/catch вокруг вызовов mshtml. Фильтр исключений ловит другие исключения.

Настройки исключения: /EHa.

Когда я удаленно отлаживаю сбой, я вижу:

необработанное исключение - нарушение прав доступа

В mshtml, но если я не подключаюсь к процессу с помощью отладчика, приложение просто закрывается.

Что нам нужно сделать, чтобы поймать исключение?


Редактировать:

Это старая версия IE6.


person Tim    schedule 15.07.2009    source источник
comment
Я не знаю об хорошо известных проблемах в MSHTML, может быть, вы неправильно его используете? (например, передача неправильных параметров без использования упорядоченных указателей). Укажите ссылку на известные проблемы или попробуйте дать более конкретное описание.   -  person Motti    schedule 15.07.2009
comment
Мы заметили это и в нашем приложении. Многие клиенты не устанавливали последние исправления (некоторые никогда не устанавливали ни одного исправления). У других есть плагины — даже плагины местной разработки — которые глючат. MSHTML некоторых версий также отказывается от рендеринга некоторых больших страниц.   -  person lavinio    schedule 15.07.2009
comment
@Motti Проблема возникает с плохо сформированными html-страницами, но это не должно привести к сбою mshtml и нашего приложения. (Это приложение размещает рекламу, и мы не несем ответственности за контент. Обратите также внимание, что более новые версии mshtml не дают сбоев (я думаю, что IE6 — это версия, с которой мы наблюдаем проблему)   -  person Tim    schedule 15.07.2009
comment
@motti: Если хотите, замените хорошо известный на Много и много. Попробуйте этот поиск в гугле. google.com/   -  person Tim    schedule 15.07.2009


Ответы (2)


Похоже, что функции MSHTML передают необходимые данные в отдельный поток. Этот отдельный поток обрабатывает ваш запрос, и возникает исключение. Вот почему вы не можете поймать исключение через блок try/catch. Вы должны проверить это в отладчике. Если это так, то единственный способ перехватить исключения из других потоков — это установить перехватчики для функций TerminateThread и TerminateProcess. Ознакомьтесь с классом CApiHook Джеффри Рихтера для этой цели (или других реализаций). Но это сделает вашу программу несовместимой с флагом компилятора /NXCOMPAT.

Второй вариант — установить все важные обновления ОС.

person Kirill V. Lyadvinsky    schedule 15.07.2009
comment
Спасибо - мы рассмотрим это - и да, было бы неплохо потребовать/установить последнюю версию IE и другие вещи, но сейчас это невозможно. - person Tim; 15.07.2009

Почти готово. Вам нужно не SetUnhandledExceptionFilter(), а AddVectoredExceptionHandler. С учетом сказанного, вы можете получить первый шанс на это исключение.

Конечно, мне интересно, что ты собираешься делать потом. TerminateThread, вероятно, единственный вариант, который у вас есть, но он вполне может заблокировать MSHTML. Так что это тоже нужно убивать.

person MSalters    schedule 16.07.2009
comment
Да, мне тоже интересно, что я собираюсь с этим делать... Прямо сейчас я просто хочу взглянуть на то, что происходит на самом деле. - person Tim; 16.07.2009