PDA

Ver la Versión Completa : Access violation con una DLL de C


johan
15-11-2007, 01:15:03
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 [-] (http://www.clubdelphi.com/foros/#)

......

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 [-] (http://www.clubdelphi.com/foros/#)

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






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


Código Delphi [-] (http://www.clubdelphi.com/foros/#)

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:

Function pasar(message_buf:PChar;message_len:PInteger;relleno:PChar): integer;stdcall;external 'libreria.dll';


Y en la llamada

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.