VB代码
我的VB应用程序代码中有DLL函数decalration:
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
是不可变的,但两者的工作方式相同。
Delphi 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才能同时使用它们吗?
答案 0 :(得分: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会被神奇地传递给非托管代码,因为它可以接受任意数量的数据。您需要确保初始容量,即该过程可用的大小。