Jump to content


Photo

DLL en Delphi invocada desde C#


  • Please log in to reply
1 reply to this topic

#1 jdepaz

jdepaz

    Advanced Member

  • Miembros
  • PipPipPip
  • 264 posts
  • LocationMedellín Colombia

Posted 08 February 2014 - 08:20 PM

Saludos a todos

Tengo una DLL en Delphi y Lazarus, la cual tiene una función en particular:



delphi
  1. function LlamaTipos(const objManilla: TManilla):PChar;stdcall;
  2. var a:String;
  3. entero:Int64;
  4. begin
  5.  
  6.  
  7. Show(FloatToStrF(objManilla.Saldo,ffGeneral,8,2));
  8. entero:=Trunc(objManilla.Saldo);
  9. Show(IntToStr(entero));
  10. Show(FloatToStr(objManilla.Saldo));
  11.   Show(FloatToStrF(objManilla.Saldo,ffFixed,8,2));
  12. Show(FormatFloat('0.####', objManilla.Saldo));
  13. Result:=PChar(ArrayToString(objManilla.NombreApellido));
  14.  
  15. end;     
  16.  



en donde TManilla es una estructura:



delphi
  1. Type
  2. TManilla =  Record
  3.  
  4.   NombreApellido:  Array[0..14] Of Char;
  5.   FechaInicio:      TDateTime;
  6.   Saldo:            Real;
  7.  
  8. 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
  1. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
  2.         public  struct TManilla
  3.         {
  4.           [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
  5.           public string NombreApellido;
  6.           [MarshalAs(UnmanagedType.R8)]
  7.           public double FechaInicio;
  8.           [MarshalAs(UnmanagedType.R8)]
  9.           public  double Saldo;
  10.  
  11.         }



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
  1. Manilla.TManilla obj;
  2.             obj.NombreApellido = "José de Paz";
  3.             obj.FechaInicio = DateTime.Today.ToOADate();
  4.             obj.Saldo = 125.25;




  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 10 February 2014 - 02:40 AM

No deberías declarar saldo como double en delphi en lugar de un float?
  • 0




IP.Board spam blocked by CleanTalk.