¿Cómo puedo pasar una cadena de Delphi a una DLL de Prism?
delphi-2010 delphi-prism (2)
La mejor forma sería usar WideString.
Por varias razones.
- Es Unicode y funciona antes de D2009
- Su memoria se gestiona en ole32.dll, por lo que no depende ni del administrador de memoria de Delphi ni del CLR GC.
- No tiene que lidiar directamente con punteros
En Oxygene, podrías escribirlo así:
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" le dice al CLR cómo ordenar cadenas de un lado a otro. Sin él, las cadenas se pasan como Ansi (PAnsiChar), que probablemente NO es lo que te gustaría hacer.
Así es como 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 use tipos que no estén claramente definidos para interfaces externas. No debe usar PChar para las importaciones o exportaciones de DLL. Porque si lo haces, te toparás con excepciones cuando lo compiles con D7 o D2009 (dependiendo de lo que fue el sistema de desarrollo original)
Intentamos pasar una cadena de un programa nativo de Delphi a una DLL de Delphi Prism. No tenemos problemas para pasar enteros, pero las cadenas no coinciden en la DLL. Vimos el fragmento de código de Robert Love en respuesta a otra pregunta, pero no hay ningún código para el programa nativo Delphi.
¿Cómo podemos pasar cadenas de Delphi a una DLL de Delphi Prism?
Las cadenas en Delphi Win32 se administran de manera diferente a las cadenas en .Net, por lo que no se puede pasar una cadena .Net a Delphi Win32 o viceversa.
Para intercambiar valores de cadenas, será mejor que uses PChar type, que es compatible con ambos compiladores. Es lo mismo que envía valores de cadena a las funciones de la API de Windows.
Saludos
PD: NO SOY Robert ;-)