تصدير الطبقة من الملف القابل للتنفيذ إلى DLL

StackOverflow https://stackoverflow.com/questions/594703

  •  09-09-2019
  •  | 
  •  

سؤال

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

طريقة واحدة ممكنة للقيام بذلك هي جعل جميع طرق الطبقة اللازمة virtual (بحيث لن تحتاج رابط DLL إلى تعريفات هذه الطرق). عيوب هذا النهج:

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

هناك طريقة لتصدير فئة من DLL إلى قابل للتنفيذ باستخدام Microsoft __declspec(dllexport) السمة الموسعة من فئة التخزين. هل هناك طريقة لتصدير فئة من القابلة للتنفيذ إلى DLL باستخدام نفس التقنية؟

لا يسمح لي برراند C 6 المترجم القديم بإنشاء مكتبة الاستيراد أثناء إنشاء مشروع قابل للتنفيذ. (إذن، عند تجميع DLL، يعطني رابط رسائل خطأ خارجية لم يتم حلها لجميع طرق الطبقة غير الظاهرية المستوردة.) هل هو قيود على هذا المترجم للغاية، أو ربما أفتقد شيئا مهما؟

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

المحلول

بقدر ما أعرف، فلا بأس في استخدام DLLExport MS VS لتصدير فئة أو وظيفة من EXE واستخدامها في DLL. ويتم تشغيله بارد إذا تم تنفيذ DLL و EXE في عملية واحدة.

نصائح أخرى

يمكنك وضع الفصل في DLL ثانية إذا كنت حقا لا تريد ذلك في أول واحد.

أواجه صعوبة في فهم المنطق الخاص بك ليس فقط وضع الفصل في DLL رغم ذلك.

إيتا: فعلت بعض الحفر والموجود هذا الرابط يشرح كيفية إنشاء مكتبة استيراد من مشروع EXE في Visual Studio 2008. كما هو الحال بالنسبة لكيفية تصديرها، يبدو أنك تستخدم فقط العادية __declspec (dllexport).

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

الخطوة 1: إنشاء API Wrapper C للصفك، كيندا مثل هذا (ربما لن يترجم، ولكن تحصل على الفكرة):

// Yes, need some 32 bit/64 bit checks here
#define MYHANDLE unsigned int

__declspec(dllexport) MYHANDLE MyClassNewInstance() {
   MyClass* ptr = new MyClass();
   return (MYHANDLE)ptr;
}

__delspec(dllexport) MyClassDoSomething( MYHANDLE handle, int parm ) {
  MyClass* ptr = (MyClass*)handle;
  ptr->DoSomething(parm);
}

etc..

الخطوة 2: لتحصل فعليا على وظائف C من EXE للاستخدام في DLL، استخدم وظائف API Win32 GetModulehandle () و GetProcaddress ().

الخطوة 3: إنشاء فئة وكيل في DLL الخاص بك. لا تفعل الأساليب الموجودة في فئة الوكيل سوى الاتصال بوظائف نظيرها C من EXE.

هذا من شأنه أن يبقي التنفيذ "الحقيقي" لفصولك من DLL. إنه اختراق، ولكن من المحتمل أن يعمل.

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