2

VB代码

我的 VB 应用程序代码中有 DLL 函数声明:

Declare Function TstCharReturn Lib "myLib" Alias "TstCharReturn" (ByVal c As System.Text.StringBuilder) As Boolean

这是调用该函数的代码

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim s As String
    Dim builder As New System.Text.StringBuilder

    r = TstCharReturn(builder)
    LogIt(s)
    LogIt(r)
End Sub

我建议使用StringBuilder而不是字符串,因为String它是不可变的,但两者的工作方式相同。

德尔福DLL代码:

Function TstCharReturn  (var c: pchar) : Boolean; stdcall;
var
 BuffSize: Integer;
 sOut: string;
begin

  sOut:='abcdefghijklmnoprst';
  BuffSize:=SizeOf(Char)*(Length(sOut)+1);
  getmem(c, BuffSize);
  FillChar(c^,BuffSize,0);
  Result := Length(sOut)>0;

  if Result then
  begin
    Move(sOut[1], PChar(c)^, BuffSize);
  end;

end;

我在 VB 输出中有垃圾。什么是问题?还有一个问题。如果我使用GetMem,我必须在某处释放内存还是 VB 会这样做?VB6 和 VB2010 之间有什么区别,因为我需要我的 dll 来处理两者?

4

1 回答 1

0

你的delphi程序是错误的。您不能为返回的字符串分配新内存,您已经有一个指向它的指针传入c,并且您必须从该指针开始填充。您将需要引入另一个参数来传递该缓冲区的大小。

所以你将拥有:

Declare Function TstCharReturn Lib "myLib" Alias "TstCharReturn" _
     (ByVal c As System.Text.StringBuilder, _
      ByVal cchSize As Integer) As Boolean

和:

Dim sb As New System.Text.StringBuilder(50) 'Buffer capacity: 50
TstCharReturn(sb, sb.Capacity)

不要认为 StringBuilder 会被神奇地传递给非托管代码,因为它可以接受任意数量的数据。您需要确保初始容量,即过程可用的大小。

于 2012-07-12T17:45:50.537 回答