Il modo migliore sarebbe utilizzare WideString.
Per diversi motivi.
- Si tratta di Unicode e funziona prima D2009
- E 'la memoria è gestita in ole32.dll, in modo da nessuna dipendenza su entrambi gestore di memoria di Delphi o CLR GC.
- Non avere a che fare direttamente con i puntatori
In Oxygene, si potrebbe scrivere in questo 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" racconta la CLR come effettuare il marshalling stringhe avanti e indietro. Senza di esso, le stringhe vengono passate come Ansi (PAnsiChar), che è probabilmente NON cosa si vorrebbe fare.
Questo è come usarlo da 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.
Inoltre, mai e poi mai tipi di utilizzo, che non sono chiaramente definiti, per le interfacce esterne. Non è necessario utilizzare PChar per importazioni o esportazioni DLL. Perché se lo fai, ti imbatterai in eccezioni quando lo compili con D7 o D2009 (a seconda di quale fosse il sistema di sviluppo originale)
fonte
2010-02-16 18:32:14
Questa è una comunità, quindi non dovresti rivolgerti a una singola persona nella tua domanda. Se vuoi farlo scrivi un commento alla sua risposta. Se scrivi una domanda (che è meglio in questo caso), prova a formularla nel modo più generale possibile. – jpfollenius
concordato. Robert Giesecke ha risposto a questo meglio di quanto avrei potuto. –