知识库 KB0236

KB0236:与 Oracle SmartView 冲突:Excel 似乎随机发生崩溃

问题

我安装了 think-cell 和 Oracle SmartView。使用 Excel 时,有时会显示 CRITICALWITHMSG n/a: std::terminate() 错误消息,并且 Excel 发生崩溃。

think-cell 错误消息

用户报告该问题出现在各种情况下,例如出现在尝试执行以下操作时:

  • 使用 SmartView 上传数据
  • 连接到 Oracle 环境
  • 通过在单元格中键入的方式输入值
  • 通过诸如按下 BACKSPACE 键等方式删除 Oracle SmartView 单元格的内容

分析

据我们分析,Oracle 似乎并未在其代码中处理某些异常。以下行为不受支持,可能会导致 Excel 崩溃:

HSADDIN.DLL(属于 SmartView)在 Excel::Window::PointsToScreenPixelsX 回调中调用 WM_TIMER,对于 VBA_E_IGNORE,此调用经常会失败。此 HRESULT 由 COM 调用包装器包装到 _com_error 异常中,但并未得到处理并贯穿到 Windows WM_TIMER 分派机制中。由于不允许异常对应用程序代码进行转义,因此会出现崩溃。

但是,在默认情况下,WM_TIMER 分派机制包含 catch-all __try __except 块,它能捕获异常并抑制任何后果。最近,Office 365 采用了名为 Microsoft.Office.AppHost.ExposeTimerProcSeh 的功能入口,它是由 Microsoft 控制的设置,可以使 Excel 遵循 Microsoft 自己的建议,通过调用 Win32 API 函数 catch-all __try __except 来禁用上述 SetUserObjectInformationW(..., UOI_TIMERPROC_EXCEPTION_SUPPRESSION, ...) 块。这导致 Excel 在出现异常时崩溃。

我们不知道 Microsoft 何时启用该设置,但我们发现在发生错误的机器上已启用该设置。若已安装 think-cell,它会偶尔捕获异常并显示错误消息。可以肯定的是,出现的这些情况并非 Oracle 的本意,他们只是忘记了在加载项中对 VBA_E_IGNORE 进行处理。

解决方案

受影响的客户报告称更新到 Oracle SmartView 21.200 版本修复了该问题。若此方法无效,请联系您的 Oracle SmartView 支持人员以获得更多信息。

分享