在Delphi 7中调用C DLL功能



我有一个用C 写的DLL。我想从Delphi 7中调用其中的功能。

我只有一个用vb.net写的示例。

我已经尝试在此处发布之前自己转换代码。

问题是当我调用函数时,它在二进制中给了我错误的输出,这显然意味着我在输入中做错了什么。

这是vb.net中的原始代码:

Private Shared Declare Unicode Function Read_Write Lib "Subway.dll" (obej As IntPtr, Data_in As Byte(), in_siz As Integer, <Out()> ByRef Data_out As IntPtr, ByRef out_siz As Integer) As Integer
Dim obej As IntPtr = IntPtr.Zero
Dim Data_out As IntPtr = 0
Dim out_siz As Integer = 0
Dim Res As Integer = -1
Res = Read_Write(obej, Encoding.[Default].GetBytes(Mystr), Mystr.Length, Data_out, out_siz)

和我在delphi中转换的代码:

function Read_Write(obej: Pointer; Data_in: TByteDynArray; in_siz:Cardinal; var Data_out: TByteDynArray; var out_siz: Cardinal): Integer; stdcall; external 'Subway.dll';
var
  tx, rx: TByteDynArray;
  obej: pointer;
  s:string;
  Res: Integer;
  out_siz: Integer;
SetLength(tx, Length(s));
Move(s[1], tx[0], Length(s));
Res := Read_Write(obej, tx, length(s), rx, out_siz);

Orignal Call(C语言(:

int __stdcall Read_Write(void *u_arg, const unsigned char  *p_data_in, unsigned int  data_in_len, unsigned char  **pp_data_out, unsigned int  *p_data_out_len);

您对Read_Write()的Delphi声明不匹配VB.NET声明。您没有考虑到未经托管语言的.NET元帅参数。另外,TByteDynArray是一种特定于Delphi的类型,您不能将其传递给其他语言,尤其是在输出参数中。

尝试更多这样的东西:

function Read_Write(obej: Pointer; Data_in: PByte; in_siz: Integer, var Data_out: Pointer; var out_siz: Integer): Integer; stdcall; external 'Subway.dll';
var
  obej: Pointer;
  Data_out: Pointer;
  out_siz: Integer;
  Res: Integer;
  MyStr: AnsiString;
  buf: TByteDynArray;
begin
  ...
  obej := nil;
  Data_out := nil;
  out_siz := 0;
  MyStr := ...;
  SetLength(buf, Length(MyStr));
  Move(PAnsiChar(MyStr)^, PByte(buf)^, Length(MyStr));
  Res := Read_Write(obej, PByte(buf), Length(buf), Data_out, out_siz);
  // use Data_out up to out_siz bytes as needed...
  // free Data_out as needed...
  ...
end;

另外,您可以省略TByteDynArray并直接经过AnsiString数据:

Res := Read_Write(obej, PByte(PAnsiChar(MyStr)), Length(MyStr), Data_out, out_siz);

最新更新