Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-09-2006
Avatar de walito
walito walito is offline
Miembro
 
Registrado: jun 2005
Posts: 121
Poder: 19
walito Va por buen camino
Implementacion de Callback

Hola gente, tengo un problema al implementar una callback.

Les cuento lo que tengo para ver si alguien me puede decir si le escape a algo:

1) Tengo hecho en Visual C++ una DLL , tengo ahi una funcion a la cual por parametro le paso una callback, esa DLL me deberia retornar un numero '1234' pero me retorna cualquier numero 1231231.
2) la definicion es:

Código Delphi [-]
type
  TCallBack = function(Num: integer): boolean of object;
...
  public
    { Public declarations }
    function Micallback(Num: integer):boolean;
...
{*llamada a la func de la dll*}
procedure fnCallbacktest(Pfunc: PTCallBack); cdecl; external 'callbacktest.dll';
...
function TForm1.callback(Num: integer):boolean;
begin
    showmessage(inttostr(Num));
    result := true;
end;

procedure TForm1.Button18Click(Sender: TObject);
begin
    fnCallbacktest(callback);
end;

Ese seria el ejemplo, aparte tambien estube leyendo que hay gente que cuando usa callback les tira error de memoria, yo tambien tengo esos problemas, es decir la callback se ejecuta bien, pero cuando llega al final (end da error de memoria
. La verdad que no encontre mucha info al respecto.

Tengo el mismo problema que este link http://www.clubdelphi.com/foros/show...light=callback

Alguien tiene alguna idea? desde ya le agradeceria.

Última edición por walito fecha: 26-09-2006 a las 18:00:39.
Responder Con Cita
  #2  
Antiguo 26-09-2006
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 a utilizar la directiva cdecl o stdcall a la hora de declarar la función. La directiva cdecl puede ser especialmente interesante en este caso, date cuenta que si se llama a la función con el método cdecl (el que se usa normalmente en C y C++) y la función esta declarada con la directiva register (la que se usa por defecto si no se indica otra cosa), tanto la propia función como el proceso que la llama intentan eliminar los parámetros de la pila provocando de esa manera un error.

Busca en la ayuda cdecl para mas información sobre las "Calling conventions" (No se como traducirlo)
Responder Con Cita
  #3  
Antiguo 26-09-2006
Avatar de walito
walito walito is offline
Miembro
 
Registrado: jun 2005
Posts: 121
Poder: 19
walito Va por buen camino
gracias por tu pronta respuesta.

Probe con anterioridad lo que tu me indicas pero sigue sin andar bien!

No me estara faltando algo mas?
Responder Con Cita
  #4  
Antiguo 26-09-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Si vas a tener la rutina dentro de un dll, no entiendo por que usas la directiva "of object" al declarar el tipo procedural.

Si es que tenes alguna razón, ¿podrias explicarmela?, si no, quizas por allí vaya tu problema.

Cómo ya te ha dicho seoane, hay que ver con que estándar de llamada está compilada la función en el dll y usar el mismo al declarar el tipo procedural.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #5  
Antiguo 26-09-2006
Avatar de walito
walito walito is offline
Miembro
 
Registrado: jun 2005
Posts: 121
Poder: 19
walito Va por buen camino
Muy bien no se para que sirbe "of object", pero es de la unica foma que corre, si le saco y le pongo cdecl me dice despues que los tipos no son los correctos o que le faltan parametros cuando paso la callback al procedimiento de la dll.

Si tenes algun ejemplo mas o menos, te agradeceria, asi entiendo como es la cosa.

Igual en ves de usar cdecl pongo stdcall en la llamada a la dll igual no funciona y me tira mas errores todavia.

desde yamuchas gracias
Responder Con Cita
  #6  
Antiguo 26-09-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Sobre el estándar de llamada, creo que no es un asunto de "adivinar" cual es. Si vos hiciste la DLL, podes indicar el estándar de llamada a usar de ambos lados, y si no, pues buscar la documentación de dicha DLL para saber cual usar.

Te remito a la ayuda de delphi en el tópico Calling conventions, de donde cito uno de los primeros parrafos para que veas su importancia:

Cita:
Empezado por delphi help
Calling conventions determine the order in which parameters are passed to the routine. They also affect the removal of parameters from the stack, the use of registers for passing parameters, and error and exception handling. The default calling convention is register.
of object es un modificador que sirve para indicar que el procedimiento pasado será un método de clase y no un procedimiento o función aislado. Cuando desde delphi se invoca un método, adicionalmente a los parámetros de este, se pasa como parámetro la referencia Self, que es un apuntador a la instancia del objeto desde donde se llama. El parámetro Self ocupa 32 bits y va intercalado, al inicio o al final del resto de parámetros según el estándar de llamada definido.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 26-09-2006
Avatar de walito
walito walito is offline
Miembro
 
Registrado: jun 2005
Posts: 121
Poder: 19
walito Va por buen camino
Desde ya muchas gracias, ahora leere lo que tu me dices.

Cualqueir cosa que funcione lo respondo aca.

GRacias
Responder Con Cita
Respuesta



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
IMplementacion de un parser bustio Varios 10 07-12-2007 17:50:10
WaveInOpen y Callback walito API de Windows 6 08-07-2006 00:06:58
Marshall y CallBack´s Edgar Perez Providers 0 03-05-2006 16:39:55
Implementacion POO y UML Leonardo OOP 1 19-10-2005 15:51:13
Análisis, Desarrollo e Implementación de un Sistema delphi.com.ar Humor 2 12-09-2003 21:24:53


La franja horaria es GMT +2. Ahora son las 18:36:16.


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