将字符串从Delphi dll传递到.net

use*_*263 3 .net vb.net delphi pinvoke

我已经搜索了很多关于这个问题,并且没有关于如何将字符串从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
Run Code Online (Sandbox Code Playgroud)

调用myDelphiFunc时,我在"buffer"变量中收到一个空字符串.我究竟做错了什么?

提前致谢

Dav*_*nan 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;
Run Code Online (Sandbox Code Playgroud)

VB

<DllImport(path)> _ 
Public Sub TestFunc(<MarshalAs(UnmanagedType.BStr)> ByRef str As String)
Run Code Online (Sandbox Code Playgroud)

  • +1更好,如果你的.NET应用程序需要与dll交互,那么很多人将你的dll实现为com服务器,并利用Delphi和.NET提供的广泛的互操作支持. (2认同)