Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: TimОтветов: 2

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

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

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

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

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

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

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


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

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

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

c++exceptionwinapi

Ответы

Ответ 1 · рейтинг 2 · Kirill V. Lyadvinsky

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

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

Ответ 2 · рейтинг 1 · MSalters

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы