Лучший способ - использовать WideString.
По нескольким причинам.
- Это Unicode и работает до D2009
- Это память управляется в ole32.dll, поэтому не зависит ни от менеджера памяти Delphi, ни от CLR GC.
- Вам не нужно напрямую иметь дело с указателями
В Oxygene вы можете написать это так:
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" говорит CLR, как собирать строки взад и вперед. Без этого строки передаются как Ansi (PAnsiChar), что, вероятно, НЕ , что вы хотели бы сделать.
Вот как использовать его из 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.
Кроме того, никогда не используют типы, которые не определены четко, для внешних интерфейсов.
Вы не должны использовать PChar для импорта или экспорта DLL. Потому что, если вы это сделаете, вы столкнетесь с исключениями при компиляции с D7 или D2009 (в зависимости от того, какой была оригинальная система разработки)