قاعدة المعارف KB0236

التعارض مع Oracle SmartView: يتعطل برنامج Excel بشكل عشوائي على ما يبدو

المشكلة

قمت بتثبيت برنامجي think-cell وOracle SmartView لديّ. في مرحلة ما أثناء العمل في برنامج Excel، أتلقى رسالة خطأ CRITICALWITHMSG n/a: std::terminate() ويتعطل برنامج Excel.

رسالة خطأ think-cell

قام المستخدمون بالإبلاغ عن حدوث المشكلة في مواقف مختلفة، على سبيل المثال عند محاولة:

  • تحميل البيانات باستخدام SmartView
  • الاتصال ببيئة Oracle
  • إدخال القيم عن طريق الكتابة في خلية
  • حذف محتوى خلية Oracle SmartView على سبيل المثال، بالضغط على BACKSPACE

التحليل

طبقًا للتحليل الخاص بنا، يبدو أن Oracle لا تتعامل مع استثناءات معينة في التعليمات البرمجية الخاصة بها. هذا ليس سلوكًا مدعومًا ويمكن أن يؤدي إلى حدوث تعطل:

يستدعي 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 للحصول على حل دائم.

مشاركة