Delphi调用VC编的DLL函数时,传递数组时出的问题,请各位大虾回答,TKS(100分)

  • 主题发起人 主题发起人 lihq2000
  • 开始时间 开始时间
L

lihq2000

Unregistered / Unconfirmed
GUEST, unregistred user!
函数定义:<br>function BroadcastGprs(ABytSndData : Byte; LngSndLen : Longint) : Integer ; Stdcall;<br>function BroadcastGprs(ABytSndData : Byte; LngSndLen : Longint): Integer; external 'CommDll.dll' name 'Broadcast';<br>调用是这样的:<br>procedure TfrmMain.m_ButtonTestClick(Sender: TObject);<br>&nbsp; &nbsp;var ABytData : array[0 .. 20] of Byte;<br>&nbsp; &nbsp;var lIntRet : Integer;<br>&nbsp; &nbsp;var lLngDataLen : Longint;<br>begin<br>&nbsp; &nbsp;ABytData[0] := 48;<br>&nbsp; &nbsp;ABytData[1] := 49;<br>&nbsp; &nbsp;ABytData[2] := 50;<br>&nbsp; &nbsp;ABytData[3] := 51;<br>&nbsp; &nbsp;ABytData[4] := 52;<br>&nbsp; &nbsp;ABytData[5] := 53;<br>&nbsp; &nbsp;lLngDataLen := 6;<br>&nbsp; &nbsp;lIntRet := BroadcastGprs( ABytData[0], lLngDataLen );<br>&nbsp; &nbsp;ShowMessage( Format('DataLen=%d, Broadcast return value=%d', [lLngDataLen, lIntRet] ) );<br>&nbsp;end;<br><br>运行结果是:是接收端收到达20个字节的数据,其中前6个数据是我所要发送的。<br>另说明:这个动态链接库函数在VB下调用是正确的。
 
ABytSndData : Byte<br>不应该是Byte,应该是一个指针类型,比如说是PByte。
 
ABytData[0] := 48;<br>会不会是ABytData[0] := $48;
 
你把头文件找出来,看你定义的对不对先???<br>不过其实有个工具是直接转换头文件的。
 
function BroadcastGprs(ABytSndData : pByte; LngSndLen : Longint) : Integer ; Stdcall;<br>function BroadcastGprs(ABytSndData : pByte; LngSndLen : Longint): Integer; external 'CommDll.dll' name 'Broadcast';<br><br>lIntRet := BroadcastGprs(@ABytData[0], lLngDataLen );
 
若楼上的办法都不行的话,这样改试试:<br>procedure TfrmMain.m_ButtonTestClick(Sender: TObject);<br>&nbsp; var ABytData : array of Byte; // 改为动态数组<br>&nbsp; var lIntRet : Integer;<br>&nbsp; var lLngDataLen : Longint;<br>begin<br>&nbsp; SetLength(ABytData, 6); // 动态分配数组长度<br>&nbsp; ABytData[0] := 48;<br>&nbsp; ABytData[1] := 49;<br>&nbsp; ABytData[2] := 50;<br>&nbsp; ABytData[3] := 51;<br>&nbsp; ABytData[4] := 52;<br>&nbsp; ABytData[5] := 53;<br>&nbsp; lLngDataLen := 6;<br>&nbsp; lIntRet := BroadcastGprs( ABytData[0], lLngDataLen );<br>&nbsp; ShowMessage( Format('DataLen=%d, Broadcast return value=%d', [lLngDataLen, lIntRet] ) );<br>end;<br><br>因为你原来的声明是静态数组,数组长度在负偏移处已经固定为20了,而在dll里面估计<br>是根据这个值来判断数组长度的,所以才会接受20字节,改为动态分配后应该就可以了。<br>纯属猜测:)<br>
 
后退
顶部