كيف يمكنني إرجاع كل خطأ سلسلة رمز الخطأ إلى VB6 من ATL activex التحكم ؟

StackOverflow https://stackoverflow.com/questions/1069585

سؤال

أحاول العودة مفصل الخطأ باستخدام VB6 CComCoClass::خطأ, ولكن يبدو أنني لا يمكن إلا إرجاع رمز خطأ /أو/ رسالة - ولكن ليس على حد سواء.

return Error(_T("Not connected"), __uuidof(IMyInterface), HRESULT_FROM_WIN32(ERROR_CONNECTION_INVALID));

النتائج في عام "الأسلوب 'طلب' الكائن 'IMyInterface' فشل" رسالة خطأ في خطأ.الوصف على VB6 الجانب (ولكن ERROR_CONNECTION_INVALID في Err.رقم) ، في حين

return Error(_T("Not connected"));

النتائج في المناسبة رسالة الخطأ ولكن خطأ عام البرمجية في Err.عدد.كيف يمكنني الحصول على أفضل من كلا العالمين ؟

هل كانت مفيدة؟

المحلول

لا يمكنك أن هذا يظهر من خلال التصميم.مزيد من التفاصيل أدناه ، ولكن باختصار لديك ثلاثة خيارات:

  • يتم إرجاع أية رسالة و VB ودية COM خطأ ، أيواحد معروف بواسطة VB runtime وفقا لهذا مقالة;VB runtime سوف تترجم هذه COM خطأ' إلى VB خطأ بالإضافة إلى الرسالة.
  • بإرجاع رسالة خطأ و DISP_E_EXCEPTION;VB runtime سوف تمر من خلال هذا الخادم خطأ' و رسالة خطأ مخصصة.هذا هو ما ضمنا يحدث على سبيل المثال ، انظر أدناه لمزيد من التفاصيل.
  • يتم إرجاع أية رسالة أخرى COM خطأ ، أيواحد لا يعرف بواسطة VB وقت التشغيل ؛ VB runtime سوف تلجأ إلى الخام HRESULT بالإضافة إلى رسالة عامة "Method '~' of object '~' failed".
    • يرجى ملاحظة أن هذا سلوك وقت التشغيل لا تنطبق أيضا, إذا كنت لا توريد رسالة خطأ هنا ، أيالرسالة الخاصة بك ببساطة لا يمكن تجاهلها!هذا هو ما يحدث على المثال الأول ، انظر أدناه لمزيد من التفاصيل.

على المهمة في متناول اليد أنها تتلخص في خيارين:

  • إذا كنت ترغب في توريد السياق الصحيح 'COM أخطاء' لأتمتة العملاء مثل VB (وعلى الأرجح يجب أن) يجب حذف رسائل الخطأ المخصصة.
  • إذا كنت ترغب في توريد رسائل الخطأ المخصصة خادم أخطاء' (أيمخصص الشروط خطأ بخصوص وظائف داخل الخاص بك ملقم الأتمتة) الخيار الوحيد الخاص بك هو DISP_E_EXCEPTION.

التفاصيل

VB runtime يبدو لتقديم جدا فقط يقتصر التعامل في ما يتعلق COM الأخطاء.وهذا هو المرجح التاريخية و/أو أسباب فنية محددة الطريق VB تم تنفيذه وليس من مصلحة خاصة هنا (الكلمات الرئيسية ستكون IDispatch فقط مقابل ثنائي واجهة تحكم ActiveX مثل 'فرعية' COM).

في حين كنت غير قادر على سطح صريح مواصفات السلوك المبينة أعلاه يمكن لأحد معرفة ذلك من خلال حفر مصادر أخرى:

من مقالة justadreamer أشار بالفعل:

[...] نداء إلى GetErrorInfo طريقة لاسترداد تتوفر معلومات الخطأ.على وقت التشغيل ثم يحدد ما إذا كان bstrDescription له قيمة أخرى من NULL.إذا كان وقت التشغيل يجد قيمة بخلاف NULL, [...], الخام HRESULT يتم استخدام القيمة في هذا السيناريو.إذا كان وقت التشغيل يجد قيمة NULL, [...] Visual Basic ثم يستخدم HRESULT للبحث المقابلة البصرية الخطأ الأساسي.

وهذا ما يفسر السلوك فيما يتعلق قبضة الخاص بك على سبيل المثال:فعلت العرض رسالة خطأ ، ومن ثم التشغيل ببساطة يلجأ إلى عام الرسالة "Method '~' of object '~' failed"بالإضافة إلى HRESULT.

سلوك المثال الثاني يتسق أيضا بمجرد إلقاء نظرة على تعريف (الاولى) منشئ CComCoClass::Error:وقد التخلف عن عدم المعايير المحددة ، خاصة hRes = 0'."ملاحظات" القسم أيضا أنه "إذا hRes صفر, ثم أول أربعة إصدارات من الخطأ العودة DISP_E_EXCEPTION.".وبالتالي هذا ضمنا بتشغيل خادم خطأ' تمر من خلال السلوك.

وأخيرا ، من أجل ملموسة C++ تنفيذ عينة من VB مثل العميل التنفيذ السلوك انظر على سبيل المثال الفقرات 'معالجة الخطأ' التالي 'التمرين 5' في أتمتة Microsoft Office 97 و Microsoft Office 2000.

نصائح أخرى

واشتقاق الفئة التي تطبق واجهة المعرضة COM الخاص بك من ISupportErrorInfoImpl، اتصل SetErrorInfo لضبط شرح مفصل الخطأ إذا حدث أي. لا تنسى أن تشمل ISupportErrorInfo في COM_MAP من صفك.

وأنا أعاني مع هذا الحق الآن أيضا. حتى الآن بلدي حفر يشير إلى أن رمز الخطأ هو حقا قيمة HRESULT. VB6 يحاول أن يكون ذكيا وتفسير HRESULT ولكن يبدو ان لديه قائمة محدودة نسبيا من HRESULTs يفهم. لHRESULTs VB6 ليس على دراية، هو فقط يضع HRESULT في الممتلكات Err.Number وتأمل أن المطور ذكي بما فيه الكفاية لمعرفة ما يجب القيام به.

والأقرب جئت إلى العودة رقم خطأ غير باستخدام MAKE_SCODE لتوليد HRESULT مع حقل رمز من HRESULT المقرر أن ما أريد، وتعيين العلامة شدة وما أتمناه هو مرفق الصحيح.

وهذا بالتزامن مع CreateErrorInfo وSetErrorInfo يحصل لي رمز خطأ ووصف الخطأ في VB6. وهذا يعيدنا إلى VB6 تحاول أن تكون ذكية مع قائمة محدودة من الأخطاء.

والخروج هذه المادة http://support.microsoft.com/kb/827994 . ذلك الكائن يجب تنفيذ طريقة ISupportsErrorInfo :: InterfaceSupportsErrorInfo () التي ترجع S_OK. ثم قبل العودة يجب استدعاء SetErrorInfo مع مؤشر إلى كائن COM الذي ينفذ IErrorInfo :: GetDescription (). وهناك مثال هنا: http://msdn.microsoft.com/en-us/library/ms221409. ASPX .

إذا SetErrorInfo قبل العودة، VB سوف الاستعلام عن طريقة GetDescription المؤشر الكائن الذي تم تمريره إلى SetErrorInfo.

وأنا لست عميق جدا في رمز يعزى كنت تستخدم - I تفضل لاختبار باستخدام COM أكثر الخام التي هي بالتأكيد دائما الكثير من التعليمات البرمجية النمطي - ولكن على الأقل كان يعمل، ثم هل يمكن استخدام مغلفة متطورة بدلا من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top