Najlepszym sposobem byłoby użycie WideString.
Z kilku powodów.
- Jest Unicode i pracuje przed D2009
- To pamięć jest zarządzana Ole32.dll, więc nie ma zależność obu menedżera pamięci Delphi lub CLR GC.
- Nie masz do czynienia bezpośrednio z wskaźniki
W Oxygene, można napisać tak:
type
Sample = static class
private
[UnmanagedExport]
method StringTest([MarshalAs(UnmanagedType.BStr)]input : String;
[MarshalAs(UnmanagedType.BStr)]out output : String);
end;
implementation
method Sample.StringTest(input : String; out output : String);
begin
output := input + "ä ~ î 暗";
end;
„MarshalAs” opowiada CLR sposobu organizowania ciągów iz powrotem. Bez tego ciągi są przekazywane jako Ansi (PAnsiChar), co prawdopodobnie jest zadaniem, które chciałbyś zrobić.
To jak go używać z Delphi:
procedure StringTest(const input : WideString; out output : WideString);
stdcall; external 'OxygeneLib';
var
input, output : WideString;
begin
input := 'A b c';
StringTest(input, output);
Writeln(output);
end.
Również nigdy typy użytku, które nie są wyraźnie zdefiniowane, dla interfejsów zewnętrznych. Nie można używać PChar do importowania lub eksportowania bibliotek DLL. Bo jeśli to zrobisz, natkniesz się na wyjątki, gdy skompilujesz je z D7 lub D2009 (w zależności od oryginalnego systemu deweloperskiego).
To jest społeczność, więc nie powinieneś adresować pojedynczej osoby w twoim pytaniu. Jeśli chcesz to zrobić, napisz komentarz do jego odpowiedzi. Jeśli napiszesz pytanie (które w tym przypadku jest lepsze), postaraj się sformułować je jak najbardziej ogólne. – jpfollenius
Uzgodnione. Robert Giesecke odpowiedział na to lepiej niż ja mogłem. –