ナレッジベース KB0236

Oracle SmartView との競合: Excel がランダムにクラッシュするようです

問題

think-cell と Oracle SmartView をインストールしました。Excel での作業中のある時点で、CRITICALWITHMSG n/a: std::terminate() エラー メッセージが表示され、Excel がクラッシュします。

think-cellのエラーメッセージ

ユーザーは、問題がさまざまな状況で発生すると報告しました。たとえば、以下を試みるときです。

  • 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関数 catch-all __try __except を呼び出して、上記の SetUserObjectInformationW(..., UOI_TIMERPROC_EXCEPTION_SUPPRESSION, ...) ブロックを無効にします。これにより、例外が発生したときに Excel がクラッシュします。

Microsoft がこの設定をいつ有効にするかはわかりませんが、エラーが発生したマシンで有効になっていることを確認しました。think-cell がインストールされている場合、誤って例外をキャッチし、エラー メッセージを表示します。これがすべて Oracle によって意図されたものではないことはかなり確かであり、単にアドインで VBA_E_IGNORE を処理するのを忘れていました。

解決策

該当するお客様は、Oracle SmartView version 21.200にアップデートすることで、この問題が修正されることが報告されています。それでも解決しない場合は、Oracle SmartViewのサポートにお問い合わせください。

シェア