KB0236: Oracle Smart View との競合:Excel がクラッシュする

  1. ホーム
  2. リソース
  3. ナレッジ ベース
  4. KB0236

問題

thinkcell と Oracle Smart View がインストールされています。Excel で作業していると、ある時点で CRITICALWITHMSG n/a: std::terminate() エラーメッセージが表示され、Excel がクラッシュします。

thinkcell エラーメッセージ

ユーザーから、この問題はさまざまな状況で発生すると報告されています。例:

  • 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サポートにお問い合わせください。