Tengo una DLL en Delphi y Lazarus, la cual tiene una función en particular:
delphi
function LlamaTipos(const objManilla: TManilla):PChar;stdcall; var a:String; entero:Int64; begin Show(FloatToStrF(objManilla.Saldo,ffGeneral,8,2)); entero:=Trunc(objManilla.Saldo); Show(IntToStr(entero)); Show(FloatToStr(objManilla.Saldo)); Show(FloatToStrF(objManilla.Saldo,ffFixed,8,2)); Show(FormatFloat('0.####', objManilla.Saldo)); Result:=PChar(ArrayToString(objManilla.NombreApellido)); end;
en donde TManilla es una estructura:
delphi
Type TManilla = Record NombreApellido: Array[0..14] Of Char; FechaInicio: TDateTime; Saldo: Real; end;
Con respecto a los valores que recibe en la estructura, como TDateTime, Array Of Char, Int64 enviados desde C# no tengo problemas al recibirlos y verificar que si sean, pero con respecto a los valores tipo "Real" y "Double" al verificar y convertirlos a String para
mostrarlos en un ShoMessage (depuración) no se muestran tal cual se envian.
Desde C# defino la estructura asi:
delphi
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct TManilla { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)] public string NombreApellido; [MarshalAs(UnmanagedType.R8)] public double FechaInicio; [MarshalAs(UnmanagedType.R8)] public double Saldo; }
Cuando envío, por ejemplo: 125.54, en el ShowMessage (valores convertidos a String) me muestra valores como:
0.0
9.40256263E-278
0
código C#:
delphi
Manilla.TManilla obj; obj.NombreApellido = "José de Paz"; obj.FechaInicio = DateTime.Today.ToOADate(); obj.Saldo = 125.25;