与 Oracle SmartView 冲突:Excel 似乎随机发生崩溃
问题
我安装了 think-cell 和 Oracle SmartView。使用 Excel 时,有时会显示 CRITICALWITHMSG n/a: std::terminate()
错误消息,并且 Excel 发生崩溃。
用户报告该问题出现在各种情况下,例如出现在尝试执行以下操作时:
- 使用 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 函数 SetUserObjectInformationW(..., UOI_TIMERPROC_EXCEPTION_SUPPRESSION, ...)
来禁用上述 catch-all __try __except
块。这导致 Excel 在出现异常时崩溃。
我们不知道 Microsoft 何时启用该设置,但我们发现在发生错误的机器上已启用该设置。若已安装 think-cell,它会偶尔捕获异常并显示错误消息。可以肯定的是,出现的这些情况并非 Oracle 的本意,他们只是忘记了在加载项中对 VBA_E_IGNORE
进行处理。
解决方案
受影响的客户报告称更新到 Oracle SmartView 21.200 版本修复了该问题。若此方法无效,请联系您的 Oracle SmartView 支持人员以获得更多信息。