سؤال

ما هي الطريقة الصحيحة لاستيراد فئة C++ من DLL؟نحن نستخدم Visual C++.

هناك dllexport/exports.def+LoadLibrary+GetProcAddress trifecta، لكنه لا يعمل على فئات C++، فقط وظائف C.هل هذا بسبب تغيير اسم C++؟كيف أجعل هذا العمل؟

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

المحلول 2

وجدت الحل في http://www.codeproject.com/KB/DLL/XDllPt4.aspx

شكرا لمجهوداتكم شباب وصبايا

نصائح أخرى

تحتاج إلى إضافة ما يلي:

extern "C"
{
...
}

لتجنب تشوه الوظيفة.

قد تفكر في كتابة وظيفتين بسيطتين في لغة C:

SomeClass* CreateObjectInstace()
{
    return new SomeClass();
}

void ReleaseObject(SomeClass* someClass)
{
   delete someClass;
}

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

عادةً ما أعلن عن فئة أساسية للواجهة، واستخدم هذا الإعلان في تطبيقي، ثم استخدم LoadLibrary، وGetProcAddress للحصول على وظيفة المصنع.يقوم العامل دائمًا بإرجاع مؤشر نوع الواجهة.

وهنا مثال عملي، تصدير مستند/عرض MFC من ملف DLL, ، محملة ديناميكيا

الدفع هذا السؤال.في الأساس، هناك طريقتان.يمكنك وضع علامة على الفئة باستخدام _dllexport ثم الارتباط بمكتبة الاستيراد، وسيتم تحميل DLL تلقائيًا.أو إذا كنت تريد تحميل ملف DLL ديناميكيًا بنفسك، فيمكنك استخدام فكرة وظيفة المصنع التي اقترحتها @titanae

يعمل dllexport/dllimport، ضعه قبل اسم الفصل الخاص بك في ملف الرأس وستكون جاهزًا للبدء.

عادةً ما تريد استخدام dllexport في ملف dll، وdllimport في ملف exe (ولكن يمكنك فقط استخدام dllexport في كل مكان ويعمل، والقيام بذلك "بشكل صحيح" يجعل التحميل أسرع قليلاً).

من الواضح أن هذا مخصص لتجميع وقت الارتباط.يمكنك استخدام توجيه رابط /delayload لجعله "ديناميكيًا"، ولكن ربما لا يكون هذا ما تريده من سطر الموضوع.

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

تتمثل الحلول البديلة عمومًا في توفير وظيفة C التي تُرجع مؤشرًا إلى الفئة الصحيحة - يعمل COM بهذه الطريقة، حيث يقوم بتصدير 4 وظائف C من ملف dll يتم استخدامها للحصول على أساليب الواجهة داخل الكائن في ملف dll.

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