从Delphi DLL发送二进制数据做C#应用程序

Raf*_*cci 2 c# delphi pinvoke delphi-2010

我有一个Delphi 2010 DLL,用于压缩C#APP中的一些数据.DLL函数如下所示:

function CompressString(aInputString: PAnsiChar; aInputStringSize: Integer; 
  var aOutPutString: PAnsiChar; var aOutPutStringSize: Integer; 
  var aErrorMsgBuffer: PAnsiChar; var aErrorMsgBufferSize: integer): Integer; 
  stdcall; export;
Run Code Online (Sandbox Code Playgroud)

C#方法如下所示:

[DllImport("MyDLL.dll", CallingConvention=CallingConvention.StdCall, CharSet=CharSet.Ansi)]
public static extern int CompressString(string aInputString, 
  int aInputStringSize, ref string aOutPutString, 
  out int aOutPutStringSize, ref string aErrorMsgBuffer, 
  out int aErrorMsgBufferSize);
Run Code Online (Sandbox Code Playgroud)

我的问题是aOutPutString被截断,只有部分数据被C#App看到.如果我aOutPutString将Delphi DLL内部更改为一个简单的文字常量(仅用于测试),它可以正常工作.

在DLL内部,我正在使用字符串.在函数的最后,我打电话给:

StrPCopy(aOutPutString, vOutOutAnsiStr);
Run Code Online (Sandbox Code Playgroud)

转换一个AnsiStringPAnsiChar.

我想我不应该使用PAnsiChar,但一个array of byte,但我不知道该怎么做.

Dou*_*oug 6

使用PAnsiChar使字符串在第一个'0'字节处截断.

PAnsiChar您可以有两个out参数,而不是类型的out参数:其中一个是指向字节数组的指针,另一个是包含数组大小的整数.

一旦需要稍后访问它,您必须小心不要释放DLL上的数组.在C#端,在外部函数声明中,您将捕获指针,IntPtr并使用该Marshal.Copy方法将内容复制到C#字节数组.