gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:44:20 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com