سؤال

لدي DLL تصدير

extern "C" __declspec(dllexport) int __stdcall Foo( void );

تفريغ عروض DLL

******************************************************************************
Section:             Exports
File Offset:         00001400 (5120)
  Flags:             00000000
  Time Stamp:        00000000
  Major Version:     0000
  Minor Version:     0000

Exports from simple.dll
  3 exported name(s), 3 export addresse(s).  Ordinal base is 1.
  Sorted by Name:
    RVA      Ord. Hint Name
    -------- ---- ---- ----
    00002104    3 0000 std::nothrow
    00001258    2 0001 Foo
    000020F8    1 0002 ___CPPdebugHook

******************************************************************************

لقد بدأت مع ملف DEF التالي:

LIBRARY simple.dll 
EXPORTS
  Foo

أنشأ هذا ملف lib مع الصادرات التالية:

Exports
       ordinal    name
                  _Foo

عندما أقوم بالربط بهذه المكتبة ، يشكو رابط MSVC من أنه لا يمكن العثور على _foo@0. لتصحيح هذه المشكلة ، أضفت الاسم المستعار إلى ملف DEF.

LIBRARY simple.dll 
EXPORTS
  Foo
  Foo@0=Foo

مما يؤدي إلى ملف lib مع الصادرات

Exports
       ordinal    name
                  _Foo
                  _Foo@0

الآن روابط المشروع دون أي مشكلة. ومع ذلك ، عندما أحاول تشغيلها ، أحصل على الرسالة

"لا يمكن تحديد نقطة إدخال الإجراء FOO@0 في مكتبة الارتباط الديناميكية البسيطة.

لذلك يبدو أنه على الرغم من أنني أخبرت lib.exe أن foo@0 هو اسم مستعار لـ Foo ، إلا أنه لا يزال ينشئ مكتبة استيراد تحاول تحميل "foo@0" بالاسم.

هل هناك طريقة للحصول على مكتبة الاستيراد لتحميل "foo" عندما طلبت "foo@0"؟

شكرًا،

ديفيد

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

المحلول

كان لديك الفكرة الصحيحة تحاول استخدام الاسم المستعار ...

"يبدو أن LIB لا تقبل النماذج المستعارة (سوف تتجاهل ببساطة الجزء بعد التوقيع المتساوي) ؛ 2) يفترض جميع الوظائف في ملف def __cdecl. كل رمز في DLL إلى اسم داخلي مع مسبوقة تحت السطح ، أي الرابط باستخدام مكتبة الاستيراد سيحاول حل رمز غير محدد - وظيفية إلى وظيفة الرمز في DLL. بعض التقنيات التي يمكننا استخدامها LIB لإنتاج مكتبات الاستيراد لوظائف __stdCall ، ولكن يمكن للمتصل أن يطلق عليها فقط من خلال الترتيبات ، وليس بالاسم. يتم ترك التفاصيل كتمرين :-). " ((http://wyw.dcweb.cn/stdcall.htm)

بدلاً من استخدام الاسم المستعار ، استخدم ترتيبيًا: (باستخدام مثالك):

LIBRARY simple.dll 
EXPORTS
     Foo
     Foo@0    @2 ;(from your dumpbin)

عملت من أجلي :)

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