Delphi llama a la DLL de VC
Externo “C” void __declspec(dllexport) __stdcall ShowMess(HWND hwnd, char* mess);
El formato de salida es: _ShowMess@8, "8" es el número de bytes de los parámetros de la función
Para evitar la división de nombres, se pueden utilizar los siguientes métodos para resolver el problema:
1. No agregue __stdcall en la declaración y use el formato predeterminado de VC __cdecl. Sin embargo, en Delphi, debe indicar que el formato de llamada es cdecl.
2. Agregue el archivo def en el proyecto VC, como por ejemplo:
BIBLIOTECA
EXPORTACIONES
MostrarMess@1
Entonces el nombre de la función de salida en la DLL no se divide.
Procedimiento ShowMess (h:HWND; mess:PChar); Stdcall;{Cdecl;} external LibName;
Si no hay una declaración Stdcall o Cdecl, Delphi utiliza de forma predeterminada el formato de llamada Register(FastCall).
#paquete pragma(4)
//definición de estructura
#paquete pragma()
TDump.exe: proporcionado por Delphi 4 y C++ Builder 3
Impdef.exe e Implib.exe, proporcionados por C++ Builder 3
DumpBin.exe proporcionado por VC5.0
Lib.exe proporcionado por VC5.0
VC llama a la DLL de Delphi
Función ShowDialog( hMainWnd:THandle; Msg:PChar ):integer;
Los nombres no se dividen cuando se envían a un archivo Dll.
externo "C" __declspec(dllimport) int __stdcall ShowDialog( HWND hwnd,char* Msg );
. Si se incluye __stdcall, se requiere dividir el nombre de la función correspondiente en el archivo Lib. Se pueden utilizar los siguientes pasos para generar el archivo Lib:
. Utilice Impdef.exe para generar un archivo def en el formato: Impdef nombre de archivo def nombre de archivo dll
. Ajuste manualmente los parámetros del archivo def, como cambiar ShowDialog a ShowDialog@8
. Utilice Lib.exe para generar archivos lib en el formato: Lib /def:nombre de archivo def
. Si no hay __stdcall en la declaración, el formato de llamada predeterminado sigue siendo stdcall, pero no es necesario dividir el nombre. Utilice el siguiente archivo por lotes MkLib.bat para generar un archivo Lib:
@eco apagado
si %1.==.
impdef %1.def %1.dll
biblioteca /def:%1.def
ir al final
:error
Uso de eco: MkLib DllName
echo Nota: No agregue la extensión ".dll" al parámetro "DllName"
:fin