delphi delphi-2010 delphi-prism oxygene

¿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 ;-)