Zurückgeben einer Zeichenfolge aus den delphi-dll in C# Anrufer in 64 bit

Habe ich eine C# - Anwendung, die Aufrufe von nativen Delphi-dll mit dem folgenden code:

C#

[DllImport("NativeDLL.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern int GetString(string out str);

Delphi

function GetString(out a: PChar): Integer; stdcall;
begin
  a := PChar('abc');
  Result := 1;
end;

die funktioniert gut in einem 32-bit-Anwendung. Aber wenn ich kompilieren, C# - exe und Delphi-dll für 64 bit bekomme ich ein seltsames problem. Nach einem Aufruf von GetString, die in Delphi-debugger kann ich sehen, dass eine Ausnahme ausgelöst wird irgendwo in der .NET-code und der folgende string wird in der Debugger-Ausgabefenster: "Kritischer Fehler erkannt c0000374". Google sagt, dass dieser Fehler im Zusammenhang mit der heap-Beschädigung.
Ich habe versucht, mit ref/var Parameter Modifikatoren anstelle der out/out. Immer noch kein Glück. Warum erhalte ich diese Fehlermeldung? Sollte ich eine andere Aufrufkonvention für 64 bit?

BTW. Die folgende Kombination funktioniert:

C#

[DllImport("NativeDLL.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern string GetString(string a);

Delphi

function GetString(a: PChar): PChar; stdcall;
var
  inp: string;
begin
  inp := a;
  Result := PChar('test ' + inp);
end;

funktioniert einwandfrei. Aber ich muss einen string zurückgeben, als ein out-parameter.

InformationsquelleAutor Max | 2013-04-23
Schreibe einen Kommentar