【问题标题】:Issue with exceptions being caught by Win32 message dispatcherWin32 消息调度程序捕获异常的问题
【发布时间】:2011-04-29 10:37:45
【问题描述】:

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

我遇到了一个问题,未处理的 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 不捕获和忽略异常?

【问题讨论】:

    标签: c++ exception winapi seh


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 你可以,但这不是我真正想要的,因为我非常想使用最新版本的 Windows 中的一些功能,我非常不想出错版本信息发送到我的应用程序。这里的属性是您可以使用 AppCompat 指定的一个子集(据我所知),其中一些可以通过清单设置;不过,我不知道如何设置我关心的行为。
      猜你喜欢
      • 1970-01-01
      • 2011-06-09
      • 2017-03-30
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      相关资源
      最近更新 更多