VC与Delphi之间动态链接库互相调用2008-01-05 21:22【转载】VC与Delphi之间动态链接库互相调用 

Delphi 调用VC的DLL


VC中DLL声名格式： 

Extern “C” void __declspec(dllexport) __stdcall ShowMess(HWND hwnd, char* mess);

输出格式为：_ShowMess@8，“8”为函数参数字节数

为了避免名称分裂，可采用以下方法解决：

1.声明中不加__stdcall，采用VC默认格式__cdecl，但在Delphi中要注明调用格式为cdecl。

2.在VC工程中添加def文件，如：

LIBRARY

EXPORTS

ShowMess @1

则DLL中输出函数名称不分裂。


Delphi中调用格式： 

Procedure ShowMess (h:HWND; mess:PChar); Stdcall;{Cdecl;} external LibName;

如无Stdcall或Cdecl声名，Delphi默认Register(FastCall)调用格式。


注意Delphi与VC的对齐格式不同，在VC中定义结构时要用以下格式： 

#pragma pack(4)

//结构定义

#pragma pack()


常用工具： 

TDump.exe－Delphi 4 和 C＋＋ Builder 3 提供

Impdef.exe 和 Implib.exe － C＋＋ Builder 3提供

DumpBin.exe－VC5.0提供

Lib.exe－VC5.0提供


VC调用Delphi的DLL



Delphi中的声名格式： 

Function ShowDialog( hMainWnd:THandle; Msg:PChar ):integer; stdcall;

输出到Dll文件中时，名称不分裂。


VC中的调用格式： 

extern "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文件：

@echo off

if %1.==. goto error

impdef %1.def %1.dll

lib /def:%1.def

goto end

:error

echo Usage: MkLib DllName

echo Note: Don't add extension ".dll" to parameter "DllName"

:end
 

