Delphi ruft die DLL von VC auf
Extern „C“ void __declspec(dllexport) __stdcall ShowMess(HWND hwnd, char* mess);
Das Ausgabeformat ist: _ShowMess@8, „8“ ist die Anzahl der Bytes der Funktionsparameter
Um ein Namenssplitting zu vermeiden, können folgende Methoden zur Lösung des Problems eingesetzt werden:
1. Fügen Sie der Anweisung nicht __stdcall hinzu und verwenden Sie das VC-Standardformat __cdecl. In Delphi müssen Sie jedoch angeben, dass das aufrufende Format cdecl ist.
2. Def-Datei im VC-Projekt hinzufügen, z. B.:
BIBLIOTHEK
EXPORTE
ShowMess@1
Dann wird der Ausgabefunktionsname in der DLL nicht aufgeteilt.
PROcedure ShowMess (h:HWND; mess:PChar); Stdcall;{Cdecl;} external LibName;
Wenn keine Stdcall- oder Cdecl-Anweisung vorhanden ist, verwendet Delphi standardmäßig das Register(FastCall)-Aufrufformat.
#pragma-Paket(4)
//Strukturdefinition
#pragma pack()
TDump.exe – bereitgestellt von Delphi 4 und C++ Builder 3
Impdef.exe und Implib.exe – bereitgestellt von C++ Builder 3
DumpBin.exe – bereitgestellt von VC5.0
Lib.exe – bereitgestellt von VC5.0
VC ruft die DLL von Delphi auf
Funktion ShowDialog( hMainWnd:THandle; Msg:PChar ):integer;
Namen werden bei der Ausgabe in eine DLL-Datei nicht aufgeteilt.
extern "C" __declspec(dllimport) int __stdcall ShowDialog( HWND hwnd,char* Msg );
. Wenn __stdcall enthalten ist, muss der entsprechende Funktionsname in der Lib-Datei aufgeteilt werden. Die folgenden Schritte können zum Generieren der Lib-Datei verwendet werden:
. Verwenden Sie Impdef.exe, um eine Def-Datei im folgenden Format zu generieren: Impdef Def-Dateiname DLL-Dateiname
. Passen Sie die Parameter der Def-Datei manuell an, indem Sie beispielsweise ShowDialog in ShowDialog@8 ändern
. Verwenden Sie Lib.exe, um Lib-Dateien im Format zu generieren: Lib /def:def Dateiname
. Wenn die Anweisung kein __stdcall enthält, ist das Standardaufrufformat immer noch stdcall, eine Namensaufteilung ist jedoch nicht erforderlich. Verwenden Sie die folgende Batchdatei MkLib.bat, um eine Lib-Datei zu generieren:
@echo aus
wenn %1.==. gehe zum Fehler
impdef %1.def %1.dll
lib /def:%1.def
Gehe zum Ende
:Fehler
echo Verwendung: MkLib DllName
echo Hinweis: Fügen Sie dem Parameter „DllName“ keine Erweiterung „.dll“ hinzu.
:Ende