تستدعي دلفي ملف DLL الخاص بـ VC
الفراغ الخارجي "C" __declspec(dllexport) __stdcall ShowMess(HWND hwnd, char*mess);
تنسيق الإخراج هو: _ShowMess@8، "8" هو عدد بايتات معلمات الوظيفة
لتجنب تقسيم الأسماء، يمكن استخدام الطرق التالية لحل المشكلة:
1. لا تقم بإضافة __stdcall في العبارة واستخدم التنسيق الافتراضي VC __cdecl. ومع ذلك، في دلفي، يجب أن تشير إلى أن تنسيق الاستدعاء هو cdecl.
2. قم بإضافة ملف def في مشروع VC، مثل:
مكتبة
صادرات
شوميس@1
ثم لا يتم تقسيم اسم وظيفة الإخراج في DLL.
PROcedure ShowMess (h:HWND;mess:PChar Stdcall;{Cdecl;} LibName خارجي;
إذا لم يكن هناك بيان Stdcall أو Cdecl، فإن دلفي تستخدم تنسيق الاتصال Register(FastCall) بشكل افتراضي.
#حزمة براغما(4)
// تعريف الهيكل
#حزمة براغما()
TDump.exe - متوفر بواسطة Delphi 4 وC++ Builder 3
Impdef.exe وImplib.exe - مقدمان بواسطة C++ Builder 3
DumpBin.exe-مقدم من VC5.0
Lib.exe مقدم من VC5.0
يستدعي VC ملف DLL الخاص بـ Delphi
وظيفة ShowDialog ( hMainWnd: Thandle؛ Msg: PChar ): integer stdcall؛
لا يتم تقسيم الأسماء عند الإخراج إلى ملف Dll.
خارجي "C" __declspec(dllimport) int __stdcall ShowDialog( HWND hwnd,char* Msg );
. إذا تم تضمين __stdcall، فيجب تقسيم اسم الوظيفة المقابل في ملف Lib. ويمكن استخدام الخطوات التالية لإنشاء ملف Lib:
. استخدم Impdef.exe لإنشاء ملف def بالتنسيق: Impdef def file name dll file name
. ضبط معلمات ملف def يدويًا، مثل تغيير ShowDialog إلى ShowDialog@8
. استخدم Lib.exe لإنشاء ملفات lib بالتنسيق: Lib /def:def file name
. إذا لم يكن هناك __stdcall في البيان، فإن تنسيق الاتصال الافتراضي يظل stdcall، ولكن تقسيم الاسم غير مطلوب. استخدم الملف الدفعي التالي MkLib.bat لإنشاء ملف Lib:
@صدى قبالة
إذا حدث خطأ %1.==
impdef %1.def %1.dll
ليب / ديف:٪ 1.def
اذهب إلى النهاية
:خطأ
استخدام الصدى: MkLib DllName
ملاحظة الارتداد: لا تقم بإضافة الامتداد ".dll" إلى المعلمة "DllName"
:نهاية