Mam aplikacji C#, który wywołuje natywną dll Delphi za pomocą następującego kodu:Zwracanie ciąg z DLL Delphi C# rozmówcy w 64 bit
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;
co działa poprawnie w aplikacji 32-bitowej. Ale kiedy skompiluję zarówno C# exe, jak i Delphi dll na 64-bitowy, otrzymuję dziwny problem. Po wywołaniu funkcji GetString w debuggerze Delphi zauważam, że wyjątek został zgłoszony gdzieś w kodzie .NET, a następujący komunikat pojawia się w oknie Wyjście debugowania: "Wykryto błąd krytyczny c0000374". Google twierdzi, że ten błąd jest związany z uszkodzeniem sterty. Próbowałem używać modyfikatorów parametrów ref/var zamiast out/out. Wciąż nie ma szczęścia. Dlaczego pojawia się ten błąd? Czy powinienem użyć innej konwencji wywoływania dla 64 bitów?
BTW. Poniższy połączenie działa prawidłowo:
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;
działa dobrze. Ale muszę zwrócić ciąg jako parametr wyjściowy.
Dziękuję bardzo! Oszczędziłeś mi wiele godzin walki z tym problemem. – Max
'PChar'? Gra losowa była to 'PAnsiChar' lub' PWideChar'? (tak, możemy wywnioskować, że jest to 64-bitowy XE2, ale nie możemy zagwarantować, że ten kod nie zostanie skompilowany za pomocą 64-bitowego FPC lub skopiowanego z kopią do projektu 32-bitowego itd.) –
@ Arioch'The Następnie użyj 'PWideChar' Jeśli wolisz. –