【发布时间】:2025-11-27 20:55:02
【问题描述】:
我有一个 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,但我不知道该怎么做。
【问题讨论】:
-
字符串在压缩/序列化意义上不是“二进制”的同义词......这可能会更好地使用 byte[]
-
我完全同意,但我不知道该怎么做。可以举个例子吗?
-
抱歉,我已经十多年没有接触过 Delphi/Pascal 了。
-
@Marc 同意,
byte[]似乎是最自然的。
标签: c# delphi pinvoke delphi-2010