База знаний KB0236. Конфликт с Oracle SmartView

случайной аварийное завершение работы Excel

Проблема

У меня установлены think-cell и Oracle SmartView. В какой-то момент при работе в Excel появляется сообщение об ошибке CRITICALWITHMSG n/a: std::terminate(), и Excel аварийно завершает работу.

сообщение об ошибке think-cell.

Пользователи сообщали о том, что проблема происходит в разных ситуациях, например, при попытках:

  • загрузить данные с помощью SmartView;
  • подключиться к среде Oracle;
  • ввести значения в ячейку;
  • удалить содержимое ячейки Oracle SmartView, например, клавишей BACKSPACE

Анализ

Мы проанализировали ситуацию и, по всей вероятности, Oracle не обрабатывает определенные исключения в своем коде. Это поведение не поддерживается и может приводить к аварийному завершению Excel:

HSADDIN.DLL (который принадлежит SmartView) вызывает Excel::Window::PointsToScreenPixelsX в отзыве WM_TIMER, и с VBA_E_IGNORE вызов часто дает сбой. Этот HRESULT упакован в исключение _com_error программой-оболочкой вызовов COM, но не обрабатывается и "проваливается" в механизм диспетчеризации Windows WM_TIMER. Пропуск кодом прикладной программы исключений не разрешен, и аварийное завершение является ожидаемым.

Но по умолчанию механизм диспетчеризации WM_TIMER содержит блок catch-all __try __except, который улавливает исключение и подавляет любые последовательности. Совсем недавно в Office 365 появился параметр, контролируемый Microsoft — шлюз функций, называемый Microsoft.Office.AppHost.ExposeTimerProcSeh, который заставляет Excel следовать собственной рекомендации Microsoft и отключать описанный выше блок catch-all __try __except, вызывая функцию Win32 API SetUserObjectInformationW(..., UOI_TIMERPROC_EXCEPTION_SUPPRESSION, ...). Это приводит к аварийному завершению Excel при исключении.

Мы не знаем, когда Microsoft включает этот параметр, но видели его включенным на компьютерах, на которых происходила ошибка. Установленный think-cell ловит исключение случайно и отображает сообщение об ошибке. Определенно то, что это не зависит от Oracle. Они просто забыли обработать VBA_E_IGNORE в своей надстройке.

Решение

Клиенты, которые столкнулись с этой проблемой, сообщали, что ошибка устраняется при обновлении Oracle SmartView до версии 21.200. Если это не помогает, обратитесь за дополнительной информацией в службу поддержки Oracle SmartView.

Поделиться