3

关于这个问题我搜索了很多,关于如何将字符串从 delphi dll 传递到 .NET 没有明确的答案。下一个代码基于 msdn 帮助文件:http: //msdn.microsoft.com/en-us/图书馆/4zey12w5.aspx

//Delphi code

function myDelphiFunc(var Buffer: PChar): Integer; export; stdcall;
  Buffer:='this is a test';
  Return:=0;
end;

//vb.NET code

<DllImport(path)> _
Public Function myDelphiFunc(ByVal buffer As String) As Integer

Public Sub myNETFunc()
  Dim buffer_size As integer = 25
  Dim buffer As String = New String(CChar(" "), buffer_size )
  Call myDelphiFunc(buffer)
  MsgBox(Strings.Left(buffer, InStr(buffer, Chr(0)) - 1))
End Sub

调用 myDelphiFunc 时,我在“缓冲区”变量中收到一个空字符串。我究竟做错了什么?

提前致谢

4

2 回答 2

10

你的代码有很多问题。主要故障有:

  • Delphi 函数通过引用接收指针,但 VB 代码通过值传递它。
  • Delphi 代码需要将字符串复制到提供的缓冲区中。
  • Delphi 代码应该使用 PAnsiChar 来匹配 VB。或 p/invoke 上的 PWideChar 和 CharSet.Unicode。
  • VB 代码需要使用 StringBuilder 而不是 String 以便将字符串编组回调用者。
  • 该函数需要接受一个长度参数以避免缓冲区溢出。

但是,我不确定是否值得尝试深入了解它。最简单的方法是使用在共享 COM 堆上分配的 BSTR。这使得该函数更易于使用并隐藏了所有内存分配的复杂性。

德尔福

procedure TestFunc(out str: WideString); stdcall;
begin
  str := 'foo';
end;

VB

<DllImport(path)> _ 
Public Sub TestFunc(<MarshalAs(UnmanagedType.BStr)> ByRef str As String)
于 2013-07-22T13:48:21.920 回答
0

您的代码应替换为

function myDelphiFunc(var Buffer: PChar): Integer; export; stdcall;
const
  tmp = 'this is a test';
begin
  Buffer := StrAlloc(Lenght(tmp)+1);
  StrPCopy(Buffer, PChar(tmp));
  Return:=0;
end;
于 2013-07-22T13:46:53.157 回答