تم إرجاع كائن خاطئ من غلاف COM القابل للاستدعاء
سؤال
لقد قمت للتو بتحديث ملف dll الذي تم استدعاؤه من VBA داخل Powerpoint.سارت كل عمليات التطوير على ما يرام، ولكن عندما حاولت النشر على جهاز مستخدم آخر، ظهرت لي مشكلة ليس لدي أي فكرة عن كيفية تصحيحها.
ما يحدث هو أنه عندما يتم إنشاء كائن .Net في VBA، فإن المرجع الذي يتم إرجاعه يكون إلى كائن خاطئ، لذلك يفشل السطر التالي مع عدم العثور على الطريقة.
Dim myObj As Foo.Bar
Public Sub RefreshData()
//'instantiate object
Set myObj = New Foo.Bar
//'call a method
myObj.HelloWorld
فشل السطر الأخير مع كائن خطأ وقت التشغيل '438' لا يدعم هذه الخاصية أو الأسلوب والذي يحدث بسبب حقيقة أن myObj من النوع "Wrong.Type" بدلاً من "Foo.Bar".
"Wrong.Type" موجود أيضًا في التجميع، لذا أفترض أن هناك خطأ ما يحدث في مكتبة النوع، لكنني حاولت إعادة الإنشاء (باستخدام regasm /codebase /tlb MyLib.dll)، ولم يساعد ذلك.
لا أعرف كيفية تشخيص هذا أكثر من ذلك.نأمل أن يتمكن شخص ما من سرد بعض الخطوات حول كيفية تشخيص هذا النوع من المشاكل؟
المحلول 2
في هذه الحالة، أدت إزالة المرجع إلى ملف tlb ثم إضافته مرة أخرى إلى حل المشكلة
لسوء الحظ، لم أجد حلاً عامًا أو تفسيرًا للسلوك.
نصائح أخرى
قد تكون مشكلة المعرفات الفريدة العمومية (GUIDs) التي تم إنشاؤها تلقائيًا (الفئة، الواجهة، مكتبة النوع) - عندما قمت بتغيير DLL، تغيرت المعرفات الفريدة العمومية (GUIDs).نظرًا لأن TLB القديم يستخدم المعرفات الفريدة العمومية (GUIDs) القديمة، فمن خلال الرجوع إليها، قمت بربط تلك المعرفات الفريدة العمومية (GUIDs) القديمة بأسماء الأنواع، لذلك فشل الكود في العمل مع المعرفات الفريدة العمومية (GUIDs) الجديدة.تحتوي معظم أكواد VB (6 و.NET) التي واجهتها على هذه المشكلة، لذا إذا كانت مكتبة الارتباط الحيوي (DLL) الخاصة بك مكتوبة بلغة VB، فمن المحتمل أن تكون هذه المشكلة (وعملك يدعم هذه النظرية).
إذا كانت هذه هي المشكلة، فالحل العام هو تعيين المعرفات الفريدة العمومية (GUIDs) بشكل صريح، وهو أمر مزعج قليلاً إذا كان لديك الكثير من الأنواع، حيث أنه من المفترض أن تقوم بتغيير المعرفات الفريدة العمومية (GUIDs) مع تغير الإصدار (الإصدارات) الخاص بك، وسيتعين عليك القيام بذلك افعل ذلك يدويًا.