Ver Mensaje Individual
  #3  
Antiguo 08-07-2015
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Reputación: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Cita:
Empezado por BDWONG Ver Mensaje
No se supone que en la funcion original le pasas un char* y ahora tu en delphi le pasas un string no seria mas correcto pasarle mejor un pchar?
Si Delphi está configurado para que "STRING" sea sinónimo de "ANSISTRING", que es la configuración por defecto si no recuerdo mal, entonces no es necesario ya que hace la conversión de ANSISTRING a PCHAR de forma automática.

Aun así, he comprobado que para llamar a funciones C con parámetros 'const char *' es aconsejable usar también CONST en la declaración de Pascal, ya que da menos problemas. Ojo, digo funciones C, no C#, así que no sé si será también el caso.

También se puede dar el caso en el que el tamaño de 'int' en C# no se corresponda con el de INTEGER en Delphi, ya que puede ser equivalente a SMALLINT o a LONGINT (16 ó 32 bit) dependiendo de la configuración. Habría que mirarlo, pero yo apostaría por LONGINT.

Personalmente, cuando hay que llamar funciones y procedimientos en otros lenguajes, recomiendo redefinir tipos porque facilitan mucho las cosas. Echa un vistazo a mi proyecto Allegro.pas, concretamente la unidad alBase, que realiza estas declaraciones.

Por otro lado, no sé qué protocolo de llamadas usa C#, pero quizá no sea STDCALL sino CDECL, pero esto sólo especulando.

ASí, con todos los cambios, sería:
Código Delphi [-]
  TYPE
  (* Tipo cadena. *)
    CPPPP_STR = ANSISTRING;
  (* Tipo entero. *)
    CPPPP_INT = LONGINT;

FUNCTION Connect (CONST Param: CPPPP_STR): CPPPP_INT;
  CDECL; EXTERNAL 'plcommpro.dll';
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita