Oracle SmartView との競合: Excel がランダムにクラッシュするようです
問題
think-cellと Oracle SmartView をインストールしました。Excel での作業中のある時点で、CRITICALWITHMSG n/a: std::terminate()
エラー メッセージが表示され、Excel がクラッシュします。
ユーザーは、問題がさまざまな状況で発生すると報告しました。たとえば、以下を試みるときです。
- SmartView を使用してデータをアップロードするとき
- Oracle 環境に接続するとき
- セルに入力して値を入力するとき
- たとえば、BACKSPACE を押して、OracleSmartView セルのコンテンツを削除するとき
分析
当社の分析では、Oracle はコード内の特定の例外を処理していないようです。これはサポートされていない動作であり、クラッシュにつながる可能性があります:
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 version 21.200にアップデートすることで、この問題が修正されることが報告されています。それでも解決しない場合は、Oracle SmartViewのサポートにお問い合わせください。