Win32消息调度程序捕获异常的问题

时间:2010-10-23 00:07:17

标签: c++ exception winapi seh

这是一个非常低级别的问题,但也许这里有人有一些见解......

我遇到的问题是,未处理的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 ++异常(这本身非常气馁和危险),但这显然是次优的。

根据引用的博客,TIB结构中的AppCompatFlags2中有一个标志(http://en.wikipedia.org/wiki/Win32_Thread_Information_Block),这可能导致Win32处理程序无法捕获/丢弃SEH异常,但我不知道如何设置/启用它。有人对此有任何见解吗?是否有AppCompat设置,我可以启用Windows无法捕获并忽略异常?

2 个答案:

答案 0 :(得分:1)

我认为这是设计的,但显然它没有被仔细考虑。也许是不明智的尝试使一些遗留应用程序“行为”。

您可以在Windows 7 SP1中覆盖此行为;我在这个in this stackoverflow answer上写了更多。

答案 1 :(得分:0)

我不知道兼容性设置如何影响这个特定方面,但您可以从资源管理器中EXE的“属性”页面中选择多种兼容模式(至少在W7和Vista上)。我似乎记得你也可以从清单中索取特定的一个。