La mejor manera sería usar WideString.
Por varias razones.
- Es Unicode y funciona antes D2009
- Es la memoria se gestiona de ole32.dll, por lo que hay dependencia de cualquiera administrador de memoria de Delphi o el CLR GC.
- Usted no tiene que tratar directamente con los punteros
En Oxygene, podría escribir que de este modo:
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" cuenta la CLR cómo calcular cadenas de ida y vuelta. Sin él, las cadenas se pasan como Ansi (PAnsiChar), que es probablemente NO lo que desea hacer.
Esto es cómo usarlo desde 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.
Además, nunca tipos de uso, que no están claramente definidos, para las interfaces externas. No debe usar PChar para las importaciones o exportaciones de DLL. Porque si lo hace, se encontrará con excepciones cuando lo compile con D7 o D2009 (dependiendo de cuál fue el sistema de desarrollo original)
Esta es una comunidad, por lo que no debe dirigirse a una sola persona en su pregunta. Si quieres hacer eso, escribe un comentario en su respuesta. Si escribe una pregunta (que es mejor en este caso), trate de formularla de la manera más general posible. – jpfollenius
De acuerdo. Robert Giesecke respondió esto mejor de lo que podría haberlo hecho. –