PDA

Ver la Versión Completa : Funcion en C#


Panasys
08-07-2015, 20:51:57
Buenas...

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

function Connect(Param:string):Integer; stdcall; external 'plcommpro.dll';

La funcion en C# es

int Connect(const char *Parameters)

Y el llamado:

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:

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
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
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 (http://sourceforge.net/p/allegro-pas/code/HEAD/tree/TRUNK/lib/), concretamente la unidad alBase (http://sourceforge.net/p/allegro-pas/code/HEAD/tree/TRUNK/lib/albase.pas), 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:

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