التعارض مع Oracle SmartView: يتعطل برنامج 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
في الوظيفة الإضافية الخاصة بهم.
الحل
أفاد العملاء المتأثرون بالمشكلة بأن التحديث إلى الإصدار 21.200 من Oracle SmartView يحل المشكلة. إذا لم يساعد ذلك، يُرجى الاتصال بدعم Oracle SmartView لمزيد من المعلومات.