关于Delphi使用VC生成的DLL文件(50分)

  • 主题发起人 主题发起人 winddiggi
  • 开始时间 开始时间
W

winddiggi

Unregistered / Unconfirmed
GUEST, unregistred user!
各位好,<br><br>我现在设计了一个VC生成的DLL,单用Delphi调用里面的函数总说入口找不到,实在没辙了!<br>大侠们快快指点迷津<br>我的DLL中函数的声明:<br>。。。<br>EXPORT BOOL WINAPI GetFormNumber();<br>EXPORT BOOL CALLBACK GetFormName(int index,char *FormName);<br>。。。<br><br>在Delphi中:<br>&nbsp;function GetFormNumber:boolean;stdcall;external 'VBEXE.DLL';<br><br><br>
 
注意名称的大小写
 
这是我帮你找到的一篇文章,你看看吧[:)]<br>主题:VC与Delphi之间动态链接库互相调用<br><br>内容:<br><br><br>Delphi 调用VC的DLL<br><br><br>VC中DLL声名格式: <br><br>Extern “C” void __declspec(dllexport) __stdcall ShowMess(HWND hwnd, char* mess);<br><br>输出格式为:_ShowMess@8,“8”为函数参数字节数<br><br>为了避免名称分裂,可采用以下方法解决:<br><br>1.声明中不加__stdcall,采用VC默认格式__cdecl,但在Delphi中要注明调用格式为cdecl。<br><br>2.在VC工程中添加def文件,如:<br><br>LIBRARY<br><br>EXPORTS<br><br>ShowMess @1<br><br>则DLL中输出函数名称不分裂。<br><br><br>Delphi中调用格式: <br><br>Procedure ShowMess (h:HWND; mess:PChar); Stdcall;{Cdecl;} external LibName;<br><br>如无Stdcall或Cdecl声名,Delphi默认Register(FastCall)调用格式。<br><br><br>注意Delphi与VC的对齐格式不同,在VC中定义结构时要用以下格式: <br><br>#pragma pack(4)<br><br>//结构定义<br><br>#pragma pack()<br><br><br>常用工具: <br><br>TDump.exe-Delphi 4 和 C++ Builder 3 提供<br><br>Impdef.exe 和 Implib.exe - C++ Builder 3提供<br><br>DumpBin.exe-VC5.0提供<br><br>Lib.exe-VC5.0提供<br><br><br>VC调用Delphi的DLL<br><br><br>Delphi中的声名格式: <br><br>Function ShowDialog( hMainWnd:THandle; Msg:PChar ):integer; stdcall;<br><br>输出到Dll文件中时,名称不分裂。<br><br><br>VC中的调用格式: <br><br>extern "C" __declspec(dllimport) int __stdcall ShowDialog( HWND hwnd,char* Msg );<br><br>.如带有__stdcall,则要求Lib文件中对应函数名称分裂,可有以下步骤生成Lib文件:<br><br>.用Impdef.exe生成def文件,格式为:Impdef def文件名 dll文件名<br><br>.手工调制def文件参数,如ShowDialog改为ShowDialog@8<br><br>.用Lib.exe生成lib文件,格式为:Lib /def:def文件名<br><br>.如声名中无__stdcall,默认调用格式仍为stdcall,但不要求名称分裂,用以下批处理文件MkLib.bat可生成Lib文件:<br><br>@echo off<br><br>if %1.==. goto error<br><br>impdef %1.def %1.dll<br><br>lib /def:%1.def<br><br>goto end<br><br>:error<br><br>echo Usage: MkLib DllName<br><br>echo Note: Don't add extension ".dll" to parameter "DllName"<br><br>:end<br><br>
 
后退
顶部