4

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

我遇到了一个问题,未处理的 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 结构 (http://en.wikipedia.org/wiki/Win32_Thread_Information_Block) 中的 AppCompatFlags2 中有一个标志,这可能导致 Win32 处理程序无法捕获/丢弃 SEH 异常,但我没有想法如何设置/启用它。有人对此有任何见解吗?是否可以启用 AppCompat 设置以使 Windows 不捕获和忽略异常?

4

2 回答 2

1

我认为这是设计使然,但显然考虑得不够仔细。让一些遗留应用程序“行为”可能是不明智的尝试。

您可以在 Windows 7 SP1 中覆盖此行为;我在这个 stackoverflow 答案中写了更多关于此的内容。

于 2012-01-24T16:19:10.263 回答
0

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

于 2010-10-23T00:32:04.337 回答