Delphi appelle la DLL de VC
Extern « C » void __declspec(dllexport) __stdcall ShowMess(HWND hwnd, char* mess);
Le format de sortie est : _ShowMess@8, "8" est le nombre d'octets des paramètres de fonction
Afin d'éviter le fractionnement des noms, les méthodes suivantes peuvent être utilisées pour résoudre le problème :
1. N'ajoutez pas __stdcall dans l'instruction et utilisez le format par défaut VC __cdecl. Cependant, dans Delphi, vous devez indiquer que le format d'appel est cdecl.
2. Ajoutez un fichier def dans le projet VC, tel que :
BIBLIOTHÈQUE
EXPORTATIONS
AfficherMess@1
Ensuite, le nom de la fonction de sortie dans la DLL n'est pas divisé.
PRocedure ShowMess (h:HWND; mess:PChar);{Cdecl;} LibName externe;
S'il n'y a pas d'instruction Stdcall ou Cdecl, Delphi utilise par défaut le format d'appel Register(FastCall).
#pragmapack(4)
//définition de la structure
#pragmapack()
TDump.exe - fourni par Delphi 4 et C++ Builder 3
Impdef.exe et Implib.exe - fournis par C++ Builder 3
DumpBin.exe fourni par VC5.0
Lib.exe fourni par VC5.0
VC appelle la DLL de Delphi
Fonction ShowDialog( hMainWnd:THandle; Msg:PChar ):integer stdcall;
Les noms ne sont pas divisés lors de la sortie vers un fichier Dll.
extern "C" __declspec(dllimport) int __stdcall ShowDialog( HWND hwnd,char* Msg );
. Si __stdcall est inclus, le nom de fonction correspondant dans le fichier Lib doit être divisé. Les étapes suivantes peuvent être utilisées pour générer le fichier Lib :
. Utilisez Impdef.exe pour générer un fichier def au format : Impdef nom de fichier def nom de fichier dll
. Ajustez manuellement les paramètres du fichier def, par exemple en changeant ShowDialog en ShowDialog@8
. Utilisez Lib.exe pour générer des fichiers lib au format : Lib /def:def nom du fichier
. S'il n'y a pas de __stdcall dans l'instruction, le format d'appel par défaut est toujours stdcall, mais le fractionnement du nom n'est pas requis. Utilisez le fichier batch suivant MkLib.bat pour générer un fichier Lib :
@echo désactivé
si %1.==.
impdef %1.def %1.dll
lib /def :%1.def
aller à la fin
:erreur
echo Utilisation : MkLib DllName
echo Remarque : N'ajoutez pas l'extension ".dll" au paramètre "DllName"
:fin