Наше приложение использует mshtml. Эта dll приводит к некрасивому завершению нашего приложения из-за хорошо известных проблем в mshtml, поскольку мы не устанавливаем более новые браузеры на компьютеры пользователей. Мы просто используем то, что у них уже есть.
SetUnhandledExceptionFilter() не справляется с этим, равно как и блок try/catch вокруг вызовов mshtml. Фильтр исключений ловит другие исключения.
Настройки исключения: /EHa.
Когда я удаленно отлаживаю сбой, я вижу:
необработанное исключение - нарушение прав доступа
В mshtml, но если я не подключаюсь к процессу с помощью отладчика, приложение просто закрывается.
Что нам нужно сделать, чтобы поймать исключение?
Редактировать
Это старая версия IE6.
Ответ 1 · рейтинг 2 · Kirill V. Lyadvinsky
Похоже, что функции MSHTML передают необходимые данные в отдельный поток. Этот отдельный поток обрабатывает ваш запрос, и возникает исключение. Вот почему вы не можете поймать исключение через блок try/catch. Вы должны проверить это в отладчике. Если это так, то единственный способ перехватить исключения из других потоков - это установить перехватчики для функций TerminateThread и TerminateProcess. Ознакомьтесь с классом CApiHook Джеффри Рихтера для этой цели (или других реализаций). Но это сделает вашу программу несовместимой с флагом компилятора /NXCOMPAT.
Второй вариант - установить все важные обновления ОС.
Ответ 2 · рейтинг 1 · MSalters
Почти готово. Вам нужно не SetUnhandledExceptionFilter(), а AddVectoredExceptionHandler. С учетом сказанного, вы можете получить первый шанс на это исключение.
Конечно, мне интересно, что ты собираешься делать потом. TerminateThread, вероятно, единственный вариант, который у вас есть, но он вполне может заблокировать MSHTML. Так что это тоже нужно убивать.