PDA

Ver la Versión Completa : Implementacion de Callback


walito
26-09-2006, 17:52:13
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:


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/showthread.php?t=20838&highlight=callback

Alguien tiene alguna idea? desde ya le agradeceria.

seoane
26-09-2006, 18:08:14
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)

walito
26-09-2006, 18:20:45
gracias por tu pronta respuesta.

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

No me estara faltando algo mas?

jachguate
26-09-2006, 18:27:03
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.

;)

walito
26-09-2006, 19:28:57
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

jachguate
26-09-2006, 19:56:28
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:

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.

;)

walito
26-09-2006, 20:03:22
Desde ya muchas gracias, ahora leere lo que tu me dices.

Cualqueir cosa que funcione lo respondo aca.

GRacias