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

时间:2013-07-22 13:39:51

标签: .net vb.net delphi pinvoke

我已经搜索了很多关于这个问题的内容,并且没有关于如何将字符串从delphi dll传递给.NET的明确答案 下一个代码基于msdn帮助文件:http://msdn.microsoft.com/en-us/library/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时,我在“buffer”变量中收到一个空字符串。我做错了什么?

提前致谢

2 个答案:

答案 0 :(得分:10)

你的代码有很多问题。主要缺点是:

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

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

<强>的Delphi

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

<强> VB

<DllImport(path)> _ 
Public Sub TestFunc(<MarshalAs(UnmanagedType.BStr)> ByRef str As String)

答案 1 :(得分: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;