سؤال

أريد أن استخدام ضمنية تربط في المشروع ، nmake حقا يريد .ملف def .المشكلة هي أن هذه الطبقة , و لا أعرف ماذا أكتب في الصادرات القسم .يمكن لأي شخص لي نقطة في الاتجاه الصحيح ؟

رسالة الخطأ التالية :

NMAKE :U1073:لا أعرف كيف لجعل 'DLLCLASS.مواطنه'

P. S:أنا أحاول بناء باستخدام Windows CE Platform منشئ .

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

المحلول

يمكنك أن تجد دائما مزينة اسم عضو وظيفة باستخدام dumpbin /رموز myclass.الكائنات

في حالتي

class A {
   public:
     A( int ){}
};

على dumpbin تفريغ أظهرت الرمز ??0A@@QAE@H@Z (public: __thiscall A::A(int))

وضع هذا الرمز في .ملف def أسباب رابط لخلق A::A(الباحث) رمز في تصدير الرموز.

ولكن! كما @paercebal الدول في تعليق له:دليل الدخول من مزينة (المهترئ) أسماء واجبا - معرضون للخطأ, و للأسف ما فيه الكفاية ، وليس مقارعة أن تكون محمولة عبر الإصدارات المحول البرمجي.

نصائح أخرى

إذا كنت أتذكر بشكل صحيح ، يمكنك استخدام __declspec(dllexport) على الدرجة, و VC++ سيتم تلقائيا إنشاء الصادرات لجميع الرموز ذات الصلة إلى الفئة (المنشئات/المدمر, طرق, vtable, typeinfo ، إلخ).

مايكروسوفت لديها مزيد من المعلومات حول هذا هنا.

لقد وجدت الطريق الأفضل أن تكون مجردة المصنع.

تبدأ من خلال تحديد الافتراضي بحتة الفئة الأساسية.هذه هي فئة دون تنفيذ بحتة الظاهري واجهة الطبقة.

يمكنك تصدير هذه الافتراضية قاعدة "مجردة واجهة" الدرجة ، ولكن ليس هناك سبب حقيقي لذلك.عندما المتصل يستخدم ذلك ، سيتم استخدامه من خلال مؤشر (PImpl ، أو مؤشر إلى التنفيذ) كل ذلك المتصل يعرف عنه هو بسيط عنوان الذاكرة.على مواطنه الملف ، في حين بسيط أكثر العمل لمواكبة يوفر فوائد تتجاوز ما __declspec(dllexport) يمكن تحقيق.ما هي الفوائد, أنت تسأل?سنصل إلى ذلك ، عليك الانتظار فقط.

لديك الدرجة الحقيقية علنا ترث من الظاهرية القاعدة.الآن إنشاء مصنع طريقة لبناء الكائن الخاص بك،"الإصدار"العش للاستدعاء المدمر لأداء تنظيف.اسم هذه الأساليب شيء من هذا القبيل "ConstructMyClass"و "ReleaseMyClass".من فضلك, يرجى استبدال "MyClass" :-)

تلك مصنع / الإفراج عن الأساليب ينبغي أن تأخذ فقط جراب أنواع إذا كانوا بحاجة إلى أي المعاملات (عادي-القديم-البيانات:صحيح, char, الخ.).العودة يجب أن يكون نوع الظاهري مجردة واجهة قاعدة الطبقة -- أو بالأحرى ، مؤشر إلى ذلك.

IMyClass* CreateAnObjectOfTypeIMyClass();

ربما كان من الواضح الآن لماذا نحن بحاجة الظاهري قاعدة الفصل ؟ منذ الظاهري واجهة فئة لديها التنفيذ ، هو أساسا كل جراب أنواع (نوع من) وبالتالي فإن "نوع البيانات" من فئة يمكن أن يكون مفهوما من قبل معظم المتصلين مثل Visual Basic, C أو مختلفة إلى حد كبير C++ compilers.

إذا كنت بما فيه الكفاية الهوى ، يمكنك الحصول على حول الحاجة "الإصدار اليدوي"طريقة (آسف ، لم نفعل ذلك).كيف ؟ إدارة الموارد الخاصة بك في الصف من خلال الذكية رميات و pImpl نوع من العمارة حتى عند الكائن يموت ، فإنه سيتم تنظيف بعد نفسها.القيام بذلك يعني صفك في كلمات خالدة من القديس المخلص سكوت مايرز "سهلة الاستخدام بشكل صحيح و من الصعب استخدام غير صحيح" عن طريق السماح المتصل تجاهل الحاجة إلى تنظيف.السماح لأولئك منا الذين لم ننس أن ندعو ".قريب"يلقي الحجر الأول.

ربما هذه العمارة يبدو مألوفا ؟ من الصعب الأساس اكزيبيشن نسخة من COM.نوعا ما-على الأقل مفهوم واجهة مصنع البناء والافراج عنهم.

في النهاية كنت قد تصدر واجهة الفئة جعلت (و تصدير) إنشاء و تدمير أساليب الآن يمكن للمتصلين الاحتجاج الخاص بك PleaseConstructMyClass مصنع وظيفة الخاص بك DLL العودة التي شيدت بشكل كامل, بالكامل و خبز كامل الكائن تحت ستار من واجهة.يمكن أن نطلق على ما الطرق العامة من الدرجة (على الأقل تلك التي في الملخص واجهة افتراضية) و تفعل كل الاشياء متعة.

عند الانتهاء مع الكائن التي تم إرجاعها من قبل مصنع وظيفة, ثم أنها يمكن أن نطلق عليه "ReleaseMyClass"وظيفة نسأل DLL الخاص بك لتنظيف الكائن الموارد ، أو يمكنك مساعدتهم على طول طريق جعل الطبقة تنظيف نفسها ، مما يجعل "ReleaseMyClass"طريقة لزوم لها وغير مجدية.

إذا كان أي شخص مهتم في تحقيق مكاسب محددة & المفاضلات الخاصة باستخدام ملف Def واجهة (بجانب أعمى يقول ذلك) ، يرجى الأنابيب و يمكننا أن حفر أعمق.

لا أنت فقط أحب هذه الأشياء ؟

الحل هو التالي :

  • منذ فئة تصدير تحتاج أيضا إلى إضافة تصدير الأساليب في .ملف def

  • لم أعرف كيفية تصدير منشئ لذا ذهبت مع استخدام طريقة المصنع ( ثابت ) ، الذي سيعود حالات جديدة من كائن

  • وظائف أخرى سيتم تصديرها عن طريق إضافة العادية المصدرة الإعلان في .ملف def

نأمل شخص ما سوف تستفيد من هذه المعلومات .

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