我有一个 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# 应用程序只能看到部分数据。如果我将 Delphi DLL 中的 aOutPutString
更改为简单的文字常量(仅用于测试),它可以正常工作。
在 DLL 中,我正在处理字符串。在函数的最后,我调用:
StrPCopy(aOutPutString, vOutOutAnsiStr);
要转换 AnsiString
,请执行 PAnsiChar
。
我想我不应该使用 PAnsiChar
,而是使用 array of byte
,但我不确定该怎么做。
最佳答案
使用 PAnsiChar 使字符串在第一个“0”字节处被截断。
您可以使用两个输出参数来代替 PAnsiChar
类型的输出参数:其中一个是指向字节数组的指针,另一个是包含大小的整数数组的。
您必须小心不要释放 DLL 上的数组,一旦您以后需要访问它。在 C# 端,在外部函数声明中,您将捕获指针作为 IntPtr
并使用 Marshal.Copy
方法将内容复制到 C# 字节数组。
关于c# - 从 Delphi DLL 发送二进制数据做一个 C# 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12652936/