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

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 出力にガベージが表示されました。問題とは何ですか?そしてもう1つ質問です。を使用した場合GetMem、どこかでメモリを解放する必要がありますか?そうしないと VB がそれを行いますか? VB6 と VB2010 の間に違いはありますか?

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 に答える