【问题标题】:How can I catch an application crash or exit in mshtml?如何在 mshtml 中捕获应用程序崩溃或退出?
【发布时间】:2009-07-15 17:23:32
【问题描述】:

我们的应用程序正在使用 mshtml。由于 mshtml 中众所周知的问题,该 dll 导致我们的应用程序不正常退出,因为我们没有在用户的机器上安装更新的浏览器。我们只是使用他们已经拥有的东西。

SetUnhandledExceptionFilter() 不会处理此问题,try/catch 也不会阻止对 mshtml 的调用。异常过滤器确实会捕获其他异常。

例外设置为/EHa

当我远程调试崩溃时,我看到:

未处理的异常 - 访问冲突

在 mshtml 中,但如果我不使用调试器附加到进程,应用程序就会退出。

我们需要做什么来捕获异常?


编辑:

这是 IE6 的旧版本。

【问题讨论】:

  • 我不知道 MSHTML 中众所周知的问题 可能是您误用了它吗? (例如,传递错误的参数,不使用封送指针)。请提供对众所周知的问题的参考或尝试给出更具体的描述。
  • 我们在我们的应用程序中也注意到了这一点。许多客户尚未安装最新补丁(有些客户从未安装任何补丁)。其他人有插件 - 甚至是本地开发的插件 - 都是错误的。某些年份的 MSHTML 也会放弃渲染一些更大的页面。
  • @Motti 这个问题发生在格式错误的 html 页面上——但这不应该导致 mshtml 和我们的应用程序崩溃。 (此应用托管广告,我们不对内容负责。另请注意,新版本的 mshtml 不会崩溃(我认为 IE6 是我们看到问题的版本)
  • @motti:如果您愿意,请将“well known”替换为“Lots andlots”。试试这个谷歌搜索。 google.com/…

标签: c++ winapi exception


【解决方案1】:

似乎是 MSHTML 函数将必要的数据传递给单独的线程。该单独的线程处理您的请求并发生异常。这就是为什么您不能通过 try/catch 块捕获异常的原因。您应该在调试器中检查它。如果这是真的,那么从其他线程捕获异常的唯一方法是为TerminateThreadTerminateProcess 函数设置挂钩。为此目的(或其他实现)查看 Jeffrey Richter 的 CApiHook 类。但它会使你的程序与/NXCOMPAT编译器标志不兼容。

您的第二个选择是安装所有重要的操作系统更新。

【讨论】:

  • 谢谢 - 我们会看看 - 是的,要求/安装最新的 IE 和其他东西会很好,但现在真的不可能。
【解决方案2】:

差不多了。你想要的不是SetUnhandledExceptionFilter(),而是AddVectoredExceptionHandler。话虽如此,您可以在此异常中获得第一枪。

当然,我想知道你之后要做什么。 TerminateThread 可能是您唯一的选择,但这很可能会使 MSHTML 陷入僵局。所以这也需要杀戮。

【讨论】:

  • 是的,我也想知道我会怎么做……现在我只想看看实际发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
相关资源
最近更新 更多