Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Access violation con una DLL de C (https://www.clubdelphi.com/foros/showthread.php?t=50341)

johan 15-11-2007 01:15:03

Access violation con una DLL de C
 
Voy avanzando con el tema de las llamadas a las DLL, pero me ecuentro con problemas a la hora de pasar los parametros a las funciones, alguien me puede ayudar.

Codigo Delphi


Código Delphi [-]

......

Function pasar( var message_buf:char;var message_len:integer;var relleno:char): integer;stdcall;external 'libreria.dll'; [los parametros son in y de out a la vez];
</SPAN>
.....

Procedure Tform1.enviar;
var message_buf:array[0..2048] of char;
var message_len : Integer;
var relleno : char;
begin

message_buf :=FillChar(message_buf, SizeOf(message_buf), Ord('0'));
message_len :=Sizeof(message_buf);
relleno :='A';

nValor:=Pasar( pchar(message_buf),message_len,caracter ); <<<- access violation error

ShowMessage( message_buf );
ShowMessage( IntToStr(message_len ) );
ShowMessage( relleno );

end;






El punto c.h dice asi:

Código Delphi [-]

CI_API int CI_CALL Pasar(char *pszMessg, int * piLen, char *pbMessgPending);






=========================================================
Programa C


Código Delphi [-]

long rc
char message_buf[2048];
int message_len = 0;
char relleno;

message_len = sizeof(message_buf);
result = Pasar( message_buf, &message_len, &relleno);

If (result = 0 )
{
message_buf[message_len]= '\0';
Printf( message_buf);
Printf( message_len);
Printf( relleno);
}






=========================================================


y otra cosa las las funciones que son de este tipo ver(void), ¿ que tipo de variable tengo que pasarles desde Delphi.?




Siento el 'tocho' y gracias anticipadas.
Juan.

PD: Si conoceis algun enlace que explicara como indicar en delphi las variables, os lo agradeceria.

mensana 15-11-2007 09:24:01

Yo empezaría desde lo más fácil e ir complicándolo, paso a paso

primero: Probar una rutina sin parámetros
despues, probar una rutina con 1 parámetro sencillo (por ejemplo, integer)
después, probar una rutina con varios parámetros
después, probar una rutina con paso de punteros
después, probar una rutina con devolución de valor

Por cierto, void indica que no hay parámetros.

C: void Rutina (void);
Delphi : procedure Rutina ();

basti 15-11-2007 14:10:51

Prueba con punteros:
Código Delphi [-]
Function pasar(message_buf:PChar;message_len:PInteger;relleno:PChar): integer;stdcall;external 'libreria.dll';

Y en la llamada
Código Delphi [-]
nValor:=Pasar( @message_buf[0], @message_len, @relleno );

johan 15-11-2007 15:45:40

Muy Biennnn Basti, ha funcionado 1000%, jeje... no encuentro ningun icono para hacer la ola......


Muchas gracias, y también a mensana por su respuesta.


La franja horaria es GMT +2. Ahora son las 15:10:27.

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