Delphi chama DLL do VC
Extern “C” void __declspec(dllexport) __stdcall ShowMess(HWND hwnd, char* mess);
O formato de saída é: _ShowMess@8, "8" é o número de bytes dos parâmetros da função
Para evitar a divisão de nomes, os seguintes métodos podem ser usados para resolver o problema:
1. Não adicione __stdcall na instrução e use o formato padrão do VC __cdecl. Porém, no Delphi, você deve indicar que o formato de chamada é cdecl.
2. Adicione o arquivo def no projeto VC, como:
BIBLIOTECA
EXPORTAÇÕES
MostrarMess@1
Então o nome da função de saída na DLL não é dividido.
PRocedure ShowMess (h:HWND; mess:PChar);{Cdecl;} LibName externo;
Se não houver nenhuma instrução Stdcall ou Cdecl, o padrão do Delphi é o formato de chamada Register(FastCall).
#pacotepragma(4)
//definição da estrutura
#pacotepragma()
TDump.exe - fornecido pelo Delphi 4 e C++ Builder 3
Impdef.exe e Implib.exe - fornecidos pelo C++ Builder 3
DumpBin.exe fornecido por VC5.0
Lib.exe fornecido por VC5.0
VC chama DLL do Delphi
Função ShowDialog( hMainWnd:THandle; Msg:PChar ):integer;
Os nomes não são divididos ao serem enviados para um arquivo DLL.
extern "C" __declspec(dllimport) int __stdcall ShowDialog( HWND hwnd,char* Msg );
. Se __stdcall estiver incluído, o nome da função correspondente no arquivo Lib deverá ser dividido. As etapas a seguir podem ser usadas para gerar o arquivo Lib:
. Use Impdef.exe para gerar um arquivo def no formato: Impdef def file name dll file name
. Ajuste manualmente os parâmetros do arquivo def, como alterar ShowDialog para ShowDialog@8
. Use Lib.exe para gerar arquivos lib no formato: Lib /def:def file name
. Se não houver __stdcall na instrução, o formato de chamada padrão ainda será stdcall, mas a divisão de nomes não será necessária. Use o seguinte arquivo em lote MkLib.bat para gerar um arquivo Lib:
@eco desligado
se %1.==.
impdef %1.def %1.dll
biblioteca /def:%1.def
vou terminar
:erro
echo Uso: MkLib DllName
echo Nota: Não adicione a extensão ".dll" ao parâmetro "DllName"
:fim