Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-08-2007
emeceuy emeceuy is offline
Miembro
 
Registrado: jun 2003
Ubicación: Uruguay
Posts: 122
Poder: 21
emeceuy Va por buen camino
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
__________________
Marcelo C.
Responder Con Cita
  #2  
Antiguo 16-08-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Estaría bien que pusieras el código en C, seguramente ahí esta el problema.
Responder Con Cita
  #3  
Antiguo 16-08-2007
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

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.
Responder Con Cita
  #4  
Antiguo 16-08-2007
emeceuy emeceuy is offline
Miembro
 
Registrado: jun 2003
Ubicación: Uruguay
Posts: 122
Poder: 21
emeceuy Va por buen camino
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);
}
__________________
Marcelo C.
Responder Con Cita
  #5  
Antiguo 16-08-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Prueba con algo asi:
Código:
int stdcall sumatoria (int A, int B)
Responder Con Cita
  #6  
Antiguo 16-08-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
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"
Responder Con Cita
  #7  
Antiguo 17-08-2007
emeceuy emeceuy is offline
Miembro
 
Registrado: jun 2003
Ubicación: Uruguay
Posts: 122
Poder: 21
emeceuy Va por buen camino
Smile

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
__________________
Marcelo C.
Responder Con Cita
  #8  
Antiguo 17-08-2007
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola a todos!

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

Un abrazo sin omisiones.

Al González.
Responder Con Cita
  #9  
Antiguo 17-08-2007
emeceuy emeceuy is offline
Miembro
 
Registrado: jun 2003
Ubicación: Uruguay
Posts: 122
Poder: 21
emeceuy Va por buen camino
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
__________________
Marcelo C.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
access violation chona Varios 2 31-10-2006 01:36:04
Access Violation Carliviris Varios 5 12-05-2006 19:21:45
Access violation at .... Perio Varios 5 07-02-2006 15:50:36
Access Violation ..... MADV01 Varios 2 24-03-2004 16:01:33
Access violation Giasl Varios 6 07-05-2003 12:35:51


La franja horaria es GMT +2. Ahora son las 00:57:09.


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
Copyright 1996-2007 Club Delphi