Delphi เรียก DLL ของ VC
ภายนอก "C" เป็นโมฆะ __declspec (dllexport) __stdcall ShowMess (HWND hwnd, ถ่าน * ระเบียบ);
รูปแบบเอาต์พุตคือ: _ShowMess@8, "8" คือจำนวนไบต์ของพารามิเตอร์ฟังก์ชัน
เพื่อหลีกเลี่ยงการแยกชื่อ คุณสามารถใช้วิธีการต่อไปนี้เพื่อแก้ปัญหา:
1. อย่าเพิ่ม __stdcall ในคำสั่ง และใช้รูปแบบเริ่มต้นของ VC __cdecl แต่ใน Delphi ต้องสังเกตว่ารูปแบบการโทรคือ cdecl
2. เพิ่มไฟล์ def ในโครงการ VC เช่น:
ห้องสมุด
การส่งออก
โชว์เมส@1
จากนั้นชื่อฟังก์ชันเอาต์พุตใน DLL จะไม่ถูกแยกออก
PROcedure ShowMess (h:HWND; ระเบียบ: PChar); Stdcall; {Cdecl;} LibName ภายนอก;
หากไม่มีคำสั่ง Stdcall หรือ Cdecl Delphi จะใช้รูปแบบการโทร 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 ):จำนวนเต็ม stdcall;
ชื่อจะไม่ถูกแยกออกเมื่อส่งออกเป็นไฟล์ Dll
ภายนอก "C" __declspec(dllimport) int __stdcall ShowDialog( HWND hwnd,char* Msg );
- หากมี __stdcall จำเป็นต้องแยกชื่อฟังก์ชันที่เกี่ยวข้องในไฟล์ Lib ขั้นตอนต่อไปนี้สามารถใช้เพื่อสร้างไฟล์ Lib:
- ใช้ Impdef.exe เพื่อสร้างไฟล์ def ในรูปแบบ: ชื่อไฟล์ Impdef def ชื่อไฟล์ dll
- ปรับพารามิเตอร์ไฟล์ def ด้วยตนเอง เช่น เปลี่ยน ShowDialog เป็น ShowDialog@8
- ใช้ Lib.exe เพื่อสร้างไฟล์ lib ในรูปแบบ: ชื่อไฟล์ Lib /def:def
- หากไม่มี __stdcall ในคำสั่ง รูปแบบการโทรเริ่มต้นยังคงเป็น stdcall แต่ไม่จำเป็นต้องแยกชื่อ ใช้ไฟล์แบตช์ต่อไปนี้ MkLib.bat เพื่อสร้างไฟล์ Lib:
@ปิดเสียงสะท้อน
ถ้า %1.== ข้ามไปผิดพลาด
impdef %1.def %1.dll
lib /def:%1.def
ไปที่จุดสิ้นสุด
:ข้อผิดพลาด
การใช้งาน echo: MkLib DllName
echo หมายเหตุ: อย่าเพิ่มนามสกุล ".dll" ให้กับพารามิเตอร์ "DllName"
:จบ