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 DLL (https://www.clubdelphi.com/foros/showthread.php?t=47035)

emeceuy 16-08-2007 18:28:16

Access Violation con DLL
 
Hola a todos...

Tengo una situación bastante extraña que no logro explicarme porque pasa, así que les cuento a ver si ven que puede ser...

Estoy utilizando una DLL compilada en "C", que su unica funcion (sumatoria) tiene 2 parametros de entrada y su salida es la suma de ambos... En delphi creo la funcion:
Código Delphi [-]
function Suma(A,B:integer):integer; stdcall; external 'sumaint.dll' name 'sumatoria';

Lo extraño es que cuando llamo a la funcion de ésta manera:
Código Delphi [-]
x:=Suma(strtoint(edit1.text),strtoint(edit2.text));
showmessage(inttostr(x));
el resultado es correcto, o sea, me devuelve la suma de los valores que hay en los edits...

Pero aqui viene lo extraño: si en vez de hacer el strtoint de los edits para pasarle los parametros a la funcion, directamente pondo dos numeros enteros, o sea:
Código Delphi [-]
x:=Suma(1,2);
showmessageinttostr(x));
salta un error de acces violation !!! es realmente muy raro...
También probé:
Código Delphi [-]
A:=strtoint(edit1.text);
B:=strtoint(edit2.text);
x:=Suma(A,B);
showmessageinttostr(x));
y da el mismo error... es muy raro...

Alguien sabe que puede ser???

muchas gacias, salu2

seoane 16-08-2007 18:35:47

Estaría bien que pusieras el código en C, seguramente ahí esta el problema.

Al González 16-08-2007 18:51:25

Es probable que no estés importando la función correctamente. Quizá el tipo de llamada de la función original no es StdCall. Lo que dice Domingo es importante, ¿podrías mostrarnos la cabecera de esa función de C.

Un abrazo importado.

Al González. :)

emeceuy 16-08-2007 19:00:25

gracias por las prontas respuestas :)

la funcion de C es bien sencilla, simplemente suma las dos entradas, algo así:

int sumatoria (int A, int B)
{
int C;
C=A+B;
result(C);
}

seoane 16-08-2007 19:16:41

Prueba con algo asi:
Código:

int stdcall sumatoria (int A, int B)

cHackAll 16-08-2007 19:39:00

A mi me parece que la declaración en Delphi debería ser algo como ésto:

Código Delphi [-]
function Suma(var A, B: Integer): Integer; stdcall; external 'sumaint.dll' name 'sumatoria';
pues muy probablemente esté pasando como puntero los valores...

Claro que solo "supongo"

emeceuy 17-08-2007 21:33:53

gracias !!! funcionó finalmente...

el poner var en los parametros de la funcion no funcionó porque se quejaba que no se pueden pasar variables, dice que tienen que ser constantes...

la solución fue poner stdcall en la funcion de C, ojo, va con doble subgueon antes... y para poder pasar reales, ojo que con el formato de C float se compatibiliza con el single de delphi...

dejo aquí la solucion final:

Código Delphi [-]
 function SumatoriaReal(A,B:single):single; stdcall; external 'dllsumatoria.dll' name 'SumaReal';

y la funcion de C es:
Código Delphi [-]
DLLIMPORT float __stdcall SumaReal (float A,float B);

MUCHAS GRACIAS A TODOSSSSSS !!!!!! :):):):) D:D:D:D

Al González 17-08-2007 21:38:00

¡Hola a todos!

¿Así que eran flotantes y no enteros? Haber empezado por ahí compadre. :rolleyes:

Un abrazo sin omisiones.

Al González. :)

emeceuy 17-08-2007 21:57:55

no, no... inicialmente eran enteros... hice todas las pruebas con enteros y funcionó, y luego pasé a enteros y tambien funcionó teniendo en cuenta eso de los singles... lo aclaré luego para que si alguno necesitaba pasar reales ya tuviera esa solucion ;)

salu2


La franja horaria es GMT +2. Ahora son las 18:17:12.

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