我有一个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;


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);


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

在DLL中,我正在处理字符串。在函数的结尾,我调用:

StrPCopy(aOutPutString, vOutOutAnsiStr);


要转换AnsiString,请执行PAnsiChar

我想我不应该使用PAnsiChar,而是使用array of byte,但是我不确定该怎么做。

最佳答案

使用PAnsiChar会使字符串在第一个“ 0”字节处截断。

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

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

关于c# - 从Delphi DLL发送二进制数据执行C#应用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12652936/

10-09 18:27
查看更多