Проблема с исключениями, перехваченными диспетчером сообщений Win32 - PullRequest
4 голосов
/ 23 октября 2010

Это своего рода вопрос очень низкого уровня, но, возможно, у кого-то здесь есть какое-то понимание ...

У меня возникла проблема, при которой необработанные исключения SEH (такие как нарушения прав доступа), по-видимому, обнаруживаютсяна уровне диспетчеризации сообщений Win32 вместо завершения программы.Я нашел следующий справочный блог, который объясняет проблему, но только в контексте сообщений WM_TIMER: http://bugswar.blogspot.com/2010/07/why-its-not-crashing.html

У меня проблема с Win 2008R2 и с "обычными" сообщениями (например, WM_COMMAND)., так далее.).Я подозреваю, что это может быть Windows, пытающаяся «помочь» путем маскировки исключений, но я хочу, чтобы она выдавала ошибку;поведение «продолжить и игнорировать» вызывает проблемы с приложением в целом.Я понимаю, что мог бы попытаться обернуть каждую функцию в try / catch и использовать опцию компилятора / EHa для преобразования исключений SEH в исключения C ++ (что само по себе крайне нежелательно и опасно), но это, очевидно, неоптимально.

Согласно ссылочному блогу, в AppCompatFlags2 в структуре TIB есть флаг (http://en.wikipedia.org/wiki/Win32_Thread_Information_Block)), который может привести к тому, что обработчик Win32 не будет перехватывать / исключать исключение SEH, но я не знаю, как его установить / включить.Кто-нибудь есть какие-либо идеи по этому поводу? Есть ли параметр AppCompat, который я могу включить, чтобы Windows не перехватывать и игнорировать исключения?

Ответы [ 2 ]

1 голос
/ 24 января 2012

Я думаю, что это по замыслу, но, очевидно, это не было рассмотрено достаточно тщательно. Возможно, опрометчивая попытка заставить какое-либо устаревшее приложение «вести себя».

Вы можете переопределить это поведение в Windows 7 SP1; Я написал больше об этом в этом ответе stackoverflow .

0 голосов
/ 23 октября 2010

Я не знаю, как настройки совместимости влияют на этот конкретный аспект, но вы можете выбрать один из нескольких режимов совместимости на странице свойств EXE в Explorer (по крайней мере, в W7 и Vista).Кажется, я помню, что вы также можете запросить конкретный из манифеста.

...