KB0236:与 Oracle Smart View 冲突:Excel 崩溃
问题
我安装了 thinkcell 和 Oracle Smart View。在 Excel 中工作一段时间后,我会收到 CRITICALWITHMSG n/a: std::terminate() 错误消息,随后 Excel 崩溃。
用户报告称,此问题会在多种情况下发生,例如尝试:
- 使用 Smart View 上传数据
- 连接到 Oracle 环境
- 通过在单元格中输入来录入值
- 删除 Oracle Smart View 单元格的内容,例如按 BACKSPACE
分析
根据我们的分析,Oracle 似乎未在其代码中处理某些异常。这不是受支持的行为,可能导致 Excel 崩溃: 阅读更多
HSADDIN.DLL(属于 Smart View)在 WM_TIMER 回调中调用 Excel::Window::PointsToScreenPixelsX,而此调用经常会失败并返回 VBA_E_IGNORE。此 HRESULT 会被 COM 调用包装器包装为 _com_error 异常,但该异常未被处理,并会落入 Windows WM_TIMER 分发机制。应用程序代码不允许让异常向外逃逸,因此预期会发生崩溃。
不过,默认情况下,WM_TIMER 分发机制包含一个 catch-all __try __except 块,它会捕获异常并抑制任何后果。最近,Office 365 中有一个由 Microsoft 控制的设置,称为功能门控,名为 Microsoft.Office.AppHost.ExposeTimerProcSeh,它会让 Excel 遵循 Microsoft 自己的建议,通过调用 Win32 API 函数 SetUserObjectInformationW(..., UOI_TIMERPROC_EXCEPTION_SUPPRESSION, ...) 来禁用上述 catch-all __try __except 块。这会导致 Excel 在异常发生时崩溃。
我们不知道 Microsoft 何时会启用此设置,但在出现该错误的机器上,我们看到它已被启用。如果安装了 thinkcell,它会意外捕获该异常并显示错误消息。几乎可以肯定,这一切并非 Oracle 的本意,他们只是忘了在其加载项中处理 VBA_E_IGNORE。
解决方案
受影响的客户报告称,更新到 Oracle Smart View 版本 21.200 可解决此问题。如果这没有帮助,请联系您的 Oracle Smart View 支持以获取更多信息。