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

标签 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;

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/

相关文章:

delphi - Delphi:重载不会调用重写的虚拟构造函数后代

delphi - 安装使用 dll 的自定义组件时出现问题

c# - 如何获取与特定文件夹关联的图标?

c# - P/Invoke问题(栈不平衡)

c# - 从 native 调用 C# 来检索字符串

c# - Asp.net MVC 路由不匹配某些文件扩展名

C# - TimeSpan 不适用于超过一天的秒数

c# - .NET Framework - 可能的内存泄漏类?

delphi - Delphi ITE:什么时候可以更改资源ID?

c# - 在 C# 中对撇号字符串执行 Newtonsoft JSON 反序列化时出错