Conflitto con Oracle SmartView: Excel si arresta in modo anomalo e casuale
Problema
Ho installato think-cell e Oracle SmartView. A un certo punto, mentre lavoro in Excel, ricevo un messaggio di errore CRITICALWITHMSG n/a: std::terminate()
e Excel si arresta in modo anomalo.
Gli utenti hanno segnalato che il problema si verifica in varie situazioni, ad esempio quando tentano di:
- Caricare dati utilizzando SmartView
- Connettersi all'ambiente Oracle
- Inserire valori digitando in una cella
- Eliminare il contenuto di una cella Oracle SmartView, ad es. premendo BACKSPACE
Analisi
Nella nostra analisi, sembra che Oracle non gestisca alcune eccezioni nel proprio codice. Questo comportamento non è supportato e può comportare un arresto anomalo di Excel:
HSADDIN.DLL (che appartiene a SmartView) chiama Excel::Window::PointsToScreenPixelsX
all'interno di un callback WM_TIMER
e spesso questa chiamata non riesce con VBA_E_IGNORE
. Questo HRESULT
è racchiuso in un’eccezione _com_error
dal call wrapper COM, ma non è gestito e ricade nel meccanismo di invio WM_TIMER
di Windows. Non è consentita l’applicazione del codice “consenti escape eccezioni”, quindi è previsto un arresto anomalo.
Tuttavia, per impostazione predefinita, il meccanismo di invio WM_TIMER
contiene un blocco catch-all __try __except
che rileva l'eccezione e disattiva le conseguenze. Più di recente, Office 365 dispone di un'impostazione controllata da Microsoft che chiama una funzionalità gate nominata Microsoft.Office.AppHost.ExposeTimerProcSeh
, che consente a Excel di seguire i consigli di Microsoft e disabilita il catch-all __try __except
blocco descritto in precedenza chiamando la funzione Win32 API SetUserObjectInformationW(..., UOI_TIMERPROC_EXCEPTION_SUPPRESSION, ...)
. Ciò causa l'arresto anomalo di Excel quando si verifica l'eccezione.
Non sappiamo quando Microsoft abilita questa impostazione, ma abbiamo rilevato che è abilitata sui computer in cui si verifica l'errore. Se think-cell è installato, rileva l'eccezione per errore e visualizza un messaggio di errore. È abbastanza sicuro che tutto questo non sia voluto da Oracle e che si siano semplicemente dimenticati di gestire VBA_E_IGNORE
nel loro add-in.
Soluzione
I clienti interessati hanno segnalato che l’aggiornamento a Oracle SmartView versione 21.200 risolve il problema. Se ciò non aiuta, contattare l’assistenza Oracle SmartView per ulteriori informazioni.