Ir al contenido


Foto

Dll en Delphi para consumir en C#: tipo de dato


  • Por favor identifícate para responder
3 respuestas en este tema

#1 jdepaz

jdepaz

    Advanced Member

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

Escrito 24 septiembre 2014 - 12:01

Hola a todos

Tengo una DLL en Delphi que devuelve una estructura con diferentes tipos de datos, hasta el momento todo bien, pero resulta que si el valor del campo NOMBRE tiene caracteres especiales, como el siguiente "é" (e con tilde), en C# no se recibe correctamente (por decirlo así) sino estos caracteres "É".

El campo nombre está definido así: 



delphi
  1. Nombre: Array[0..14] Of Char;




y en C#:



delphi
  1. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
  2.             public string Nombree;



¿Alguna sugerencia?








Saludos
  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 24 septiembre 2014 - 03:06

Parece un problema de unicode. Usa un char array desde el lado de C# o fuerza delde dll y C# a usar WCHAR.


Saludos.
  • 0

#3 jdepaz

jdepaz

    Advanced Member

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

Escrito 28 octubre 2014 - 02:05

Hola a todos,

Aunque por aquella ocasión resolví el problema desarrollando una DLL en C++, seguí con la insistencia en Pascal (utilizando Lazarus), al final para devolver los siguientes caracteres: á, é, í, ó, ú y ñ, lo realicé de la siguiente forma:



delphi
  1. function DevuelveString():PWideChar;cdecl;
  2. begin
  3.   Result:='Prueba '+ Chr(225)+Chr(233)+Chr(237)+Chr(243)+Chr(250)+Chr(241);
  4. end; 



o bien así:



delphi
  1. function DLPSTR():LPSTR;cdecl;
  2. begin
  3.   Result:='Prueba '+ Chr(225)+Chr(233)+Chr(237)+Chr(243)+Chr(250)+Chr(241);
  4. end;



es de mencionar que estos retornos son de prueba, y en C# las importaciones se realizan así:




delphi
  1. [DllImport("myDllP.dll",
  2.         CharSet = CharSet.Unicode,
  3.         CallingConvention = CallingConvention.Cdecl)]   
  4.         public static extern IntPtr DLPSTR();






delphi
  1. [DllImport("myDllP.dll",
  2.           CharSet = CharSet.Ansi,
  3.           CallingConvention = CallingConvention.Cdecl)]
  4.         [return: MarshalAs(UnmanagedType.LPWStr)]
  5.         public static extern StringBuilder DevuelveString();



saludos

  • 0

#4 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 29 octubre 2014 - 09:02

Gracias por retroalimentar la solución compañero.
  • 0




IP.Board spam blocked by CleanTalk.