Conflicto con Oracle SmartView: Excel se bloquea aparentemente al azar
Problema
Tengo instalados think-cell y Oracle SmartView. En algún momento mientras trabajo con Excel, me aparece un mensaje de error del tipo CRITICALWITHMSG n/a: std::terminate()
y Excel se bloquea.
Varios usuarios han informado de que el problema se producía en diversas situaciones, por ejemplo, al intentar:
- cargar datos con SmartView;
- conectarse al entorno de Oracle;
- introducir valores escribiendo en una celda;
- borrar el contenido de una celda de Oracle SmartView, p. ej., pulsando la tecla RETROCESO
Análisis
Según el análisis que hemos realizado, parece que Oracle no está gestionando determinadas excepciones en su código. Este comportamiento no es compatible y puede provocar que Excel se bloquee:
HSADDIN.DLL (que pertenece a SmartView) invoca a Excel::Window::PointsToScreenPixelsX
dentro de una devolución de llamada del mensaje WM_TIMER
, y esta llamada falla bastante a menudo con VBA_E_IGNORE
. El contenedor CCW encapsula este valor HRESULT
en una excepción _com_error
, pero el valor no se gestiona y pasa explícitamente al mecanismo de envío del mensaje WM_TIMER
de Windows. Dado que no se permite que las excepciones se escapen del código de la aplicación, es previsible que se produzca un bloqueo.
Sin embargo, el mecanismo de envío del mensaje WM_TIMER
contiene, de manera predeterminada, un bloque catch-all __try __except
, que captura la excepción y silencia las posibles consecuencias. Más recientemente, Office 365 dispuso que un ajuste bajo control de Microsoft invocara una puerta de funcionalidad denominada Microsoft.Office.AppHost.ExposeTimerProcSeh
. Lo cual, a su vez, provocó que Excel siguiera las propias recomendaciones de Microsoft y deshabilitara el bloque catch-all __try __except
, descrito anteriormente, invocando la función de API de Win32 SetUserObjectInformationW(..., UOI_TIMERPROC_EXCEPTION_SUPPRESSION, ...)
. De este modo, Excel se bloquea cuando se produce la excepción.
Desconocemos en qué momento habilita Microsoft este ajuste, pero hemos constatado que está habilitado en equipos en los que se produce el error. Si think-cell está instalado, este programa captura la excepción por accidente y muestra un mensaje de error. Es muy probable que todo esto se deba a un error fortuito de Oracle y que esta empresa simplemente se haya olvidado de gestionar VBA_E_IGNORE
en su complemento.
Solución
Los clientes afectados han informado de que actualizar Oracle SmartView a la versión 21.200 soluciona el problema. Si la solución propuesta no funciona, póngase en contacto con el servicio de asistencia de Oracle SmartView para obtener más información.