سؤال

أعتقد أن هذا مرتبط باستخدامي لـ nlog C++ API (وسؤالي في منتدى nlog هو هنا);الغرض من طرح هذا السؤال هنا هو جذب جمهور أوسع لمشكلتي وربما الحصول أيضًا على بعض الأفكار العامة وراء فشل VB6 IDE في البناء على السيناريو الخاص بي.

باختصار، المشكلة التي أواجهها هي أنني أواجه مشكلة في إنشاء مكونات VB6 التي تشير إلى مكونات C++ غير مُدارة والتي تتضمن استدعاءات لواجهة برمجة تطبيقات C\C++ الخاصة بـ nlog (والتي تم تعريفها في NLogC.DLL).مشاكل البناء لا تحدث أثناء وقت الترجمة، بل تحدث عندما يتم إنشاء الملف الثنائي مما يوحي لي أنها مشكلة من نوع ما في نوع الرابط؟لا أعرف ما يكفي عن كيفية إنتاج ثنائيات VB6 لمعرفة ذلك.يتم إنتاج الملف الثنائي VB6، ولكنه تالف ويتعطل بعد وقت قصير من استدعائه.

هل كان لدى أي شخص أي تجارب مماثلة مع VB6 (ليس من الضروري أن يكون مرتبطًا بـ nlog أو C++)؟

يحرر:شكرا لجميع الردود على هذه المشكلة الغامضة إلى حد ما.لا يوجد حتى الآن أي تقدم للأسف.النتائج التي توصلت إليها منذ أن نشرت هذا:

  1. لا يبدو أن "التبديل والتبديل" في خيارات الترجمة يساعد في حل هذه المشكلة.
  2. إن إضافة مرجع إلى مكون C++ الذي يدعم nlog من مشروع VB6 "فارغ" لا يؤدي إلى تعطله أو يسبب مشاكل غريبة في البناء.إذن، فهي ليست مشكلة VB6 "أصلية"، وربما تكون مشكلة في التفاعل بين nlog والمكونات المختلفة ومكتبات الطرف الثالث التي تستخدمها المكونات المرجعية الأخرى؟
  3. أما بالنسبة لاتفاقيات الاتصال C++:إن مكون C++ الممكّن لـ nlog - بقدر ما أستطيع رؤيته - متوافق مع هذه الاتفاقيات ويعمل بالفعل بشكل جيد عند الإشارة إليه بواسطة VB6 طالما أنه لا يجري أي استدعاءات nlog API.لست متأكدًا مما إذا كان nlogc.DLL نفسه متوافقًا مع VB6 ولكنني كنت أعتقد أن هذا غير مهم نظرًا لأن استدعاءات واجهة برمجة التطبيقات (API) يتم إجراؤها من مكون C++؛لا ينبغي أن يعرف VB6 أو يهتم بما يشير إليه مكون C++ (وهذا بقدر ما أفهمه في هذا الشأن...)

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

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

المحلول

تم التغلب على المشكلة باستخدام واجهة COM الخاصة بـ NLog (NLog.ComInterop.DLL) من كود C++ غير المُدار.ليس من السهل القيام بذلك مثل C\C++ API ولكنه على الأقل لا يؤدي إلى تعطل مكونات VB6 الخاصة بي.

نصائح أخرى

سأحاول تعديل بعض تجميع الخيارات الموجودة في مشروع, ملكيات قائمة طعام، تجميع لوحة لمعرفة ما إذا كانت تعطي أي تلميحات إضافية حول الخطأ الذي يحدث.

على سبيل المثال، إذا قمت بتجميع الملف القابل للتنفيذ إلى رمز p بدلا من الكود المحلي هل ما زال يتعطل عند بدء التشغيل.

ما هي رسالة الخطأ التي تظهر لك عند تشغيل الملف الثنائي المترجم؟

أشك في أن المترجم/الرابط هو المشكلة:لا يتم ربط مراجع المشروع في مشروع VB6 بالملف النهائي القابل للتنفيذ.مرجع المشروع في VB6 هو في الواقع مرجع إلى مكتبة نوع COM (والتي قد تكون أو لا تكون مضمنة في ملف .dll أو أي نوع ملف ثنائي آخر).تخدم مراجع المشروع في المقام الأول غرضين:

  1. يستخرج IDE معلومات النوع من مكتبات الأنواع المشار إليها والتي يعرضها بعد ذلك في Object Browser (وفي القائمة المنسدلة Intellisense)

  2. في وقت الترجمة، يقوم المترجم باستخراج معلومات النوع المخزنة في المكتبات المشار إليها، بما في ذلك CLSID لكل فئة تقوم بإنشاء مثيل لها، ويقوم بتضمين هذه البيانات في الملف القابل للتنفيذ.يتيح ذلك للملف القابل للتنفيذ إنشاء مثيلات للفئات الموجودة في المكتبات التي أشرت إليها.

لاحظ أن الملف الثنائي المترجم لا يرتبط بأي كود في المكتبات المشار إليها، ولا يحتوي حتى على أسماء ملفات المكتبات المشار إليها.يحتوي الملف القابل للتنفيذ النهائي فقط على CLSID ومعلومات النوع الأخرى التي يحتاجها لإنشاء كائنات COM في وقت التشغيل.

من الأرجح أن المشكلة تتعلق بـ NLog، أو بكيفية استدعائها من التعليمات البرمجية الخاصة بك، بدلاً من حدوث خطأ ما في عملية التحويل البرمجي لـ VB6.

إذا كنت تعتقد أنها قد تكون مشكلة في الرابط، فمن المفترض أن يؤدي ذلك إلى تعطلها بنفس الطريقة:

  1. إنشاء مشروع قياسي جديد (من أي نوع)
  2. أضف وحدة نمطية جديدة وانسخ عبارات "الإعلان" فيها
  3. ترجمة

إذا لم يتعطل فهو شيء آخر.

قد يكون من المفيد تقديم وصف دقيق للخطأ أو لقطة شاشة لما يحدث.

هناك شيء واحد يجب التحقق منه وهو أن NLogC.DLL أو C++ DLL الذي قمت بإنشائه يحتوي على اصطلاح الاتصال الصحيح المحدد.في الأساس، لا يمكنك تشويه أسماء وظائف DLL أو استخدام أي شيء سوى اصطلاح الاتصال STDCALL.إذا لم يتم إنشاء C++ DLL مع وضع هذين الأمرين في الاعتبار، فسوف يفشل في العمل مع VB6.

مقالة MSDN حول اصطلاح الاتصال.

يمكن أن يكون سبب أخطاء "لا يمكن تحميل عنصر التحكم xxx" هو ملفات .oca التي تم إنشاؤها من إصدار مختلف من ocx. عن المستخدم حاليًا.إذا كان الأمر كذلك، فإن حذف ملفات .oca يساعد.

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