Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   .NET (https://www.clubdelphi.com/foros/forumdisplay.php?f=17)
-   -   Funcion en C# (https://www.clubdelphi.com/foros/showthread.php?t=88641)

Panasys 08-07-2015 20:51:57

Funcion en C#
 
Buenas...

Tengo una Funcion en C# dentro de una DLL que cargo en la aplicacion con

Código Delphi [-]
function Connect(Param:string):Integer; stdcall; external 'plcommpro.dll';

La funcion en C# es

Código:

int Connect(const char *Parameters)
Y el llamado:

Código:

params = “protocol=TCP,ipaddress=192.168.12.154,port=4370,timeout=2000,passwd=” ;
IntPtr h = Connect(params);

En Delphi la llamo declarando la variable param como string:

Si la funcion no conecta me devuelve un 0 como error sino me devuelve el handle:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var param: string;
    Conn : Integer;
begin
param := 'protocol=TCP,ipaddress=192.168.1.251,port=4370,timeout=4000,passwd=admin';
Conn := Connect(Param);
If Conn = 0 then Showmessage('Fallo') else  Showmessage('Conectado');
end;

Algun paso me salte, es un dispositivo conectado via TCP, la conexion por red esta OK, me tiran un hilo?.

Abrazo Javier

BDWONG 08-07-2015 20:59:11

Hola
 
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?


saludos...

Ñuño Martínez 08-07-2015 21:21:41

Cita:

Empezado por BDWONG (Mensaje 494177)
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';

Panasys 09-07-2015 16:42:41

Gracias Ñuño y BDWONG, yo lo declare como String por lo que comentaba Ñuño, tambien habia probado con pchar, pero un error en la sintaxis me había hecho pensar que no funcionaba.

Lo declare igual con pchar y anduvo OK, era mas la desesperacion de ver la comunicacion YA! que no me puse a revisar bien el código. :p

Gracias chicos, anduvo todo de 10! ^\||/

Abrazo.

Javier


La franja horaria es GMT +2. Ahora son las 06:22:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi