случайной аварийное завершение работы Excel
Проблема
У меня установлены think-cell и Oracle SmartView. В какой-то момент при работе в Excel появляется сообщение об ошибке CRITICALWITHMSG n/a: std::terminate()
, и Excel аварийно завершает работу.
Пользователи сообщали о том, что проблема происходит в разных ситуациях, например, при попытках:
- загрузить данные с помощью 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.