ich eine C# Anwendung, die ruft nativen Delphi-DLL mit dem folgenden Code:in 64 Bit eine Zeichenfolge von delphi dll C# Anrufer zurückkehrend
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;
was in einer 32-Bit-Anwendung funktioniert. Aber wenn ich sowohl C# exe und Delphi dll für 64 Bit kompiliere, bekomme ich ein seltsames Problem. Nach einem Aufruf von GetString in Delphi Debugger kann ich sehen, dass eine Ausnahme irgendwo im .NET-Code ausgelöst wird und die folgende Zeichenfolge im Debugger-Ausgabefenster angezeigt wird: "Kritischer Fehler erkannt c0000374". Google sagt, dass dieser Fehler auf Heap-Beschädigung zurückzuführen ist. Ich habe versucht, Ref/Var Parameter Modifikatoren anstelle von out/out. Immer noch kein Glück. Warum bekomme ich diesen Fehler? Sollte ich eine andere Aufrufkonvention für 64 Bit verwenden?
BTW. Die folgende Kombination funktioniert gut:
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 gut. Aber ich muss eine Zeichenfolge als out-Parameter zurückgeben.
Thank you very much! Du hast mir viele Stunden des Kampfes mit diesem Problem erspart. – Max
'PChar'? Glücksspiel war es "PAnsiChar" oder "PWideChar"? (Ja, wir können daraus schließen, dass es 64-Bit-XE2 ist, aber wir können nicht sicherstellen, dass dieser Code nicht mit 64-Bit-FPC kompiliert oder in ein 32-Bit-Projekt kopiert wird, usw.) –
@ Arioch'Dann verwenden Sie 'PWideChar' wenn Sie bevorzugen. –