Base de connaissances KB0236

Conflit avec Oracle SmartView : Excel plante de manière apparemment aléatoire

Problème

think-cell et Oracle SmartView sont installés. À un moment donné, lorsque je travaille dans Excel, je reçois un message d’erreur CRITICALWITHMSG n/a: std::terminate() et Excel plante.

message de l’erreur think-cell

Les utilisateurs ont signalé que le problème se produisait dans diverses situations, par exemple lorsqu’ils essayaient de :

  • charger des données à l’aide de SmartView
  • se connecter à l’environnement Oracle
  • saisir des valeurs en écrivant dans une cellule
  • supprimer le contenu d’une cellule Oracle SmartView, par exemple en appuyant sur la touche RETOUR ARRIÈRE

Analyse

Selon notre analyse, il semble qu’Oracle ne gère pas certaines exceptions dans son code. Ce comportement n’est pas pris en charge et peut conduire à un plantage :

HSADDIN.DLL (qui appartient à SmartView) appelle Excel::Window::PointsToScreenPixelsX dans le cadre d’un rappel WM_TIMER, et cet appel échoue assez souvent avec VBA_E_IGNORE. Ce HRESULT est intégré dans une exception _com_error par le call wrapper COM, mais n’est pas traité et passe dans le mécanisme de répartition WM_TIMER de Windows. Puisqu’il n’est pas autorisé de laisser des exceptions passer outre le code d’application, un plantage se produit.

Toutefois, par défaut, le mécanisme de répartition WM_TIMER contient un bloc catch-all __try __except qui détecte l’exception et neutralise toutes les conséquences. Depuis peu, Office 365 dispose d’un paramètre contrôlé par Microsoft, un portail de fonctionnalité appelé Microsoft.Office.AppHost.ExposeTimerProcSeh, qui permet à Excel de suivre les recommandations de Microsoft et de désactiver le bloc catch-all __try __except décrit ci-dessus en appelant la fonction SetUserObjectInformationW(..., UOI_TIMERPROC_EXCEPTION_SUPPRESSION, ...) d’API Win32. Cela entraîne un plantage d’Excel lorsque l’exception se produit.

Nous ne savons pas quand Microsoft active ce paramètre, mais nous l’avons vu activé sur des machines où l’erreur se produit. Si think-cell est installé, il détecte l’exception accidentellement et affiche un message d’erreur. Il est assez probable que tout cela n’ait pas été prévu par Oracle, et que la gestion de VBA_E_IGNORE dans le code ait simplement été oubliée.

Solution

Nous ne pouvons pas appliquer de solution de notre côté. Veuillez contacter votre service d’assistance Oracle SmartView pour obtenir une solution permanente.

Partager