سؤال

تعتبر أنظمة المكونات الإضافية في C++ صعبة لأن واجهة برمجة التطبيقات (ABI) لم يتم تعريفها بشكل صحيح، وكل مترجم (أو إصدار منه) يتبع قواعده الخاصة.ومع ذلك، يوضح COM على Windows أنه من الممكن إنشاء نظام مكون إضافي بسيط يسمح للمبرمجين الذين لديهم مترجمين مختلفين بإنشاء مكونات إضافية لتطبيق مضيف باستخدام واجهة بسيطة.

لنكن عمليين، ونترك معيار C++، الذي ليس مفيدًا جدًا في هذا الصدد، جانبًا لمدة دقيقة.إذا كنت أرغب في كتابة تطبيق لنظامي التشغيل Windows وMac (وLinux اختياريًا) يدعم المكونات الإضافية لـ C++، وإذا كنت أرغب في منح مؤلفي المكونات الإضافية خيارًا كبيرًا بشكل معقول من المترجمين (على سبيل المثال، الإصدارات القديمة من Visual C++) أو برنامج التحويل البرمجي الخاص بـGC أو Intel's C++)، ما هي ميزات C++ التي يمكنني الاعتماد عليها؟

بالطبع، أفترض أنه سيتم كتابة المكونات الإضافية لمنصة معينة.

فيما يلي بعض ميزات C++ التي يمكنني التفكير فيها، والتي أعتقد أنها الإجابة:

  • تخطيط vtable، لاستخدام الكائنات من خلال فئات مجردة؟(نعم)
  • أنواع مدمجة ومؤشرات؟(نعم)
  • الهياكل والنقابات؟(نعم)
  • استثناءات؟(لا)
  • وظائف "C" الخارجية؟(نعم)
  • وظائف stdcall غير الخارجية "C" مع أنواع المعلمات المضمنة؟(نعم)
  • وظائف "C" غير stdcall غير خارجية مع أنواع المعلمات المعرفة من قبل المستخدم؟(لا)

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

كارل

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

المحلول

مجلة الدكتور دوب لديها مقال بناء إطار البرنامج المساعد الخاص بك:الجزء 1 وهي قراءة جيدة حول هذا الموضوع.إنها بداية سلسلة من المقالات التي تغطي بنية وتطوير ونشر إطار عمل البرنامج الإضافي عبر الأنظمة الأساسية C/C++.

نصائح أخرى

قد ترغب أيضًا في التفكير في استبدال واجهة البرنامج المساعد التقليدية بواجهة برمجة نصية.هناك بعض الارتباطات الجيدة جدًا للعديد من لغات البرمجة النصية في C/C++ والتي حلت مشكلتك بالفعل.قد لا تكون فكرة سيئة البناء عليها.على سبيل المثال، قم بإلقاء نظرة على Boost.Python.

كيو تي لديه نظام جميل جدًا للمكونات الإضافية التي استخدمتها في الماضي.يستخدم نظام الكائنات الوصفية الخاص بـ Qt للتغلب على العديد من المشكلات التي يتم العثور عليها عادةً عند محاولة تطوير مكونات C++ الإضافية.

أحد الأمثلة هو كيف Q_DECLARE_INTERFACE يعمل، لمنعك من استخدام مكون إضافي غير متوافق.آخر هو مفتاح البناء, ، للتأكد من تحميل البرنامج الإضافي الصحيح للبنية ونظام التشغيل والمترجم الخاص بك.إذا كنت لا تستخدم نظام المكونات الإضافية الخاص بـ Qt، فهذه هي الأشياء التي سيتعين عليك القلق بشأنها وابتكار حلول لها بنفسك.إنه ليس بالضرورة علم صواريخ، وأنا لا أقول إنك ستفشل في ذلك، لكن الرجال في Trolltech أذكياء للغاية وقد أمضوا بعض الوقت في التفكير في الأمر، وأنا أفضل استخدام ما قاموا بإنشائه بدلاً من إعادة اختراع العجلة بنفسي .

مثال آخر هو ذلك رتي عادةً لا يعمل عبر حدود DLL، ولكن عند استخدام Qt، تظهر أشياء مثل qobject_cast التي تعتمد على نظام الكائنات التعريفية تعمل عبر حدود DLL.

أعتقد أنك آمن في إنشاء نظام إضافي يعتمد على:

  • تجميع وظائف البرنامج المساعد في المكتبة (.dll، .so، وما إلى ذلك)
  • يتطلب أن يكشف البرنامج المساعد عن صادرات لغة C الرئيسية.
  • يتطلب أن يقوم البرنامج المساعد بتنفيذ (وإرجاع مؤشر/مرجع إلى) واجهة C++ مجردة.

من المحتمل أن يكون نظام البرنامج المساعد C++ الأكثر نجاحًا:قديم جيد أدوبي فوتوشوب.وإذا لم يكن الأمر كذلك، فيمكن استخدام أحد تنسيقات التوليف الافتراضية مثل VSTi وما إلى ذلك.

الكتاب لغة C++ غير كاملة بقلم ماثيو ويلسون لديه معلومات لطيفة حول هذا.

يبدو أن النصيحة هي:طالما أنك تستخدم نفس المترجم (أو ما يعادله)، فيمكنك استخدام C++، وإلا فمن الأفضل استخدام C كواجهة أعلى كود C++ الخاص بك.

بارِع لديه بنية المكونات الإضافية عبر النظام الأساسي.

الدفع:

  1. ايس دل
  2. مدير ACE DLL

أود أن أقترح التحقق من الكتاب
دليل مبرمج ACE

يعمل Firefox على XPCOM (http://www.mozilla.org/projects/xpcom/).إنها مستوحاة من Microsoft COM ولكنها متعددة المنصات.

لدي محرك لعبتي الخاص الذي يحتوي على نظام المكونات الإضافية C++.

لدي بعض التعليمات البرمجية في ملفات الرأس بحيث يتم وضعها في وحدة تجميع البرنامج المساعد.

يتم استدعاء الوظائف الأكبر الموجودة في المحرك الرئيسي عبر دالة C مُصدَّرة (يستدعي البرنامج المساعد MyObject_somefunction(MyObject *obj) والذي يستدعي في المحرك obj->somefunction() فقط).إذا كان استدعاء دالة C أمرًا قبيحًا بالنسبة لذوقك، فمع بعض الخداع في الرأس، عندما يتم تضمين الرأس في البرنامج المساعد، قم بتعريف وظيفة العضو # لاستدعاء وظيفة C:

#if defined(IN_THE_PLUGIN)
void MyObject::somefunction() { MyObject_somefunction(this); }
#endif

يجب أن تكون الوظائف الافتراضية نقية أو أن الكود موجود في ملف الرأس.إذا لم أرث من فصل دراسي وقمت فقط بمثيله، فيمكن أن يعيش رمز الوظيفة الافتراضية في المحرك، ولكن بعد ذلك يجب على الفصل تصدير بعض وظائف C لإنشاء وتدمير الكائن الذي يتم استدعاؤه من البرنامج المساعد.

في الأساس، الحيل التي استخدمتها، بهدف الحفاظ على الاستقلال الكامل للنظام الأساسي، لا تتجاوز مجرد تصدير لغة C وحيل ملف الرأس.

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