一个C语言的Dll函数怎么声明为Delphi的 ( 积分: 50 )

  • 主题发起人 主题发起人 水影8888
  • 开始时间 开始时间

水影8888

Unregistered / Unconfirmed
GUEST, unregistred user!
一个C语言编写的Dll的函数怎么声明为Delphi的:<br>Dll文件名为:ALTrans.dll<br>C版语法为:&nbsp;Req_DownloadFile(char&nbsp;*strFile,char&nbsp;*strDest,&nbsp;int&nbsp;nCreateFlag);<br>我用Delphi声明为如下:<br>function&nbsp;Req_DownloadFile(strFile:PChar;strDest:PChar;nCreateFlag:Integer):Integer;stdcall;external&nbsp;'altrans.dll';<br>函数可以正确执行,但退出软件时会有内存错误.<br>急,请熟悉C的朋友看看.
 
char&nbsp;*strFile,char&nbsp;*strDest&nbsp;这两个指针可能破坏了内存
 
C版语法为:少了int吧!<br>int&nbsp;Req_DownloadFile(char&nbsp;*strFile,char&nbsp;*strDest,&nbsp;int&nbsp;nCreateFlag);<br>Delphi声明完全正确。<br>“调用正确,退出软件时会有内存错误.”可能是函数本身有问题,<br>或者是你的软件退出时其它原因,请加以下几行试试。<br>procedure&nbsp;Tform1.FormClose(Sender:&nbsp;TObject;&nbsp;var&nbsp;Action:&nbsp;TCloseAction);<br>begin<br>&nbsp;&nbsp;Action&nbsp;:=&nbsp;cafree;<br>end;<br><br>procedure&nbsp;Tform1.FormDestroy(Sender:&nbsp;TObject);<br>begin<br>&nbsp;&nbsp;form1&nbsp;:=&nbsp;nil;<br>end;
 
谢谢楼上,按楼主的办法退出软件还是会出内存错误,不使用这个函数就没问题,下面是整个函数的完整说明,有使用过的朋友帮忙一下:<br>***********************************************************************<br> Req_DownloadFile()<br>************************************************************************<br> 功能:&nbsp;下载档案至PDT<br><br> 语法:&nbsp;Req_DownloadFile(char&nbsp;*strFile,char&nbsp;*strDest,&nbsp;int&nbsp;nCreateFlag);<br><br> 参数:&nbsp;char&nbsp;*strFile --&gt;&nbsp;要下载的档案<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*strDest&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;&nbsp;下载至PDT的路径<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;*nFlag --&gt;&nbsp;0&nbsp;:&nbsp;假如档案已存在停止传输<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;:&nbsp;假如档案已存在覆盖已存在的档案<br><br> 传回值:&nbsp;0:&nbsp;档案开启失败<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1:&nbsp;OK<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4:&nbsp;磁碟机未格式化<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5:&nbsp;空间不足<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6:&nbsp;档案已存在Reference&nbsp;Error.txt&nbsp;file.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7:&nbsp;strFile&nbsp;或&nbsp;strDest&nbsp;错误<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strFile&nbsp;附档名应为abp,dat,cft,sft,txt<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strDest&nbsp;路径应为c:/data,d:/fonts,d:/program,d:/lookup<br><br> 范例:&nbsp;Req_DownloadFile(&quot;C://Font16.cft&quot;,&quot;C://DATA&quot;,&nbsp;1);<br><br>我在Delphi中调用的命令:<br>i:=&nbsp;&nbsp;Req_DownloadFile(strFile,strDir,1);
 
c函数一定有返回值的,应该为<br>int&nbsp;Req_DownloadFile.......<br>byte&nbsp;Req_DownloadFile.....<br>或其它<br>你Delphi声明为int,而C里是什么你没给出来<br>另外是_cdecl还是stdcall调用约定也没给出
 
1.cdecl还是stdcall调用约定文档里没给出,但用stdcall来调用结果正确,退出时内存错误,用cdecl调试到函数调用代码就内存就出错了.应该是用stdcall来调用.<br>2.关于返回值,从文档上看是一个int,定义为int返回值测试也正确,文档语法说明不标准吧.<br>这是一个盘点机的下载文件函数,正好设备厂商的这两天网站上不去了.<br>下面是完整的调用代码:<br>procedure&nbsp;Tfrmjqpd.btn3Click(Sender:TObject);<br>var<br>&nbsp;&nbsp;I:Integer;&nbsp;&nbsp;&nbsp;&nbsp;//记录返回结果<br>&nbsp;&nbsp;strFile:PChar;<br>&nbsp;&nbsp;strDir:PChar;<br>begin<br>&nbsp;&nbsp;I&nbsp;:=&nbsp;AL_OpenPort(0,&nbsp;2,&nbsp;13,&nbsp;0,&nbsp;0,&nbsp;0);//打开传输埠.<br>&nbsp;&nbsp;if&nbsp;i&nbsp;=&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage(&nbsp;'打开传输埠成功!')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetMem(strFile,&nbsp;Length('c:/test.dat'));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetMem(strDir,&nbsp;Length('c:/data'));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StrCopy(strFile,PChar('c:/test.dat'));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StrCopy(strDir,PChar('c:/data'));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;:=&nbsp;Req_DownloadFile(strFile,&nbsp;strDir,&nbsp;1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;i&nbsp;=&nbsp;1&nbsp;then&nbsp;ShowMessage('下传成功')&nbsp;&nbsp;&nbsp;&nbsp;//测试时这个地方返回值为1,并且检查文件确实下载到盘点机上了<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeMem(strFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeMem(strDir);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AL_ClosePort;//关闭下载埠<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage(IntToStr((i)));//显示错误码<br>&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage(&nbsp;'打开传输埠失败');<br>&nbsp;&nbsp;<br>end;<br><br>不知哪里有问题啊.
 
谢谢各位,确实是dll有问题,找厂家重要了一个升级版,问题解决.
 

Similar threads

回复
0
查看
978
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部