إنشاء مكتبة استيراد MSVC من DLL التي تستخدم STDCALL
-
25-09-2019 - |
سؤال
لدي 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)
عملت من أجلي :)