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の意図した動作でないことはほぼ確実であり、Oracleは単に自社のアドインでVBA_E_IGNOREを処理し忘れたものと考えられます。
解決策
影響を受けたお客様からは、Oracle Smart Viewをバージョン21.200に更新すると問題が解決するとの報告がありました。これで解決しない場合は、詳しい情報についてOracle Smart Viewサポートにお問い合わせください。