Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   punteros a funciones (https://www.clubdelphi.com/foros/showthread.php?t=67599)

GunMiNiHo 25-04-2010 19:52:14

punteros a funciones
 
hola tengo un problema, lo que intento hacer es obtener la address de un procedure de la memoria y despues restarla con otra y despues volver a restarle 5 y esa funcion me devuelva un DWORD como valor de retorno:

aca el codigo:

Código Delphi [-]
procedure creaItemFilter; stdcall;

var
      punteroProc: procedure(parametro: boolean; otro: string);

begin
punteroProc:=@ItemFilterASM;
PByte(ItemFilter)^:=$E9;
PDword(ItemFilter+1)^:=jmp($0050E851,punteroProc);
end;

Código Delphi [-]
function jmp(from,too:DWORD): DWORD;
var
  jmpto:dword;
begin
  jmpto:=dword(from)-NativeInt(too)-5;
  Result := jmpto;
end;

Código Delphi [-]
procedure ItemFilterASM(parametro: boolean; otro: string);stdcall;

ahi estan las declaraciones me bota el siguiente error el compilador en el jmp($0050E851,punteroProc); el cual es el siguiente:
Cita:

not enough actual parameters
que parametro estoy olvidando??? o.o!!!

Lord Delfos 25-04-2010 21:54:02

Yo creo que es porque al hacer jmp($0050E851,punteroProc) el compilador cree que lo que querés hacer es llamar a puneroProc.

Lo que deberías hacer es jmp($0050E851,@punteroProc), con arroba.

Saludos.

PD: Como comentario, cuando postees código es una buena idea postear lo necesario para que compile sin mucho esfuerzo. Así te asegurás que la gente que quiera ayudarte, pueda hacerlo. Yo, por ejemplo, solamente puedo suponer lo que hace la función jmp, así que lo de usar "@" es una simple suposición. Podría andar o no. :)

GunMiNiHo 27-04-2010 02:33:32

Cita:

Empezado por Lord Delfos (Mensaje 361862)
Yo creo que es porque al hacer jmp($0050E851,punteroProc) el compilador cree que lo que querés hacer es llamar a puneroProc.

Lo que deberías hacer es jmp($0050E851,@punteroProc), con arroba.

Saludos.

PD: Como comentario, cuando postees código es una buena idea postear lo necesario para que compile sin mucho esfuerzo. Así te asegurás que la gente que quiera ayudarte, pueda hacerlo. Yo, por ejemplo, solamente puedo suponer lo que hace la función jmp, así que lo de usar "@" es una simple suposición. Podría andar o no. :)

La funcion ItemFilterASM, es codigo en ASM ;) y en eso no tengo errores al compilar pero aca te va la funcion entera:

Código Delphi [-]
procedure ItemFilterASM(parametro: boolean; otro: string);stdcall;

begin
asm
MOV DWORD PTR[CounterA],EAX
PUSH EBX
PUSH ESI
XOR EBX,EBX
MOVE ESI,[b] // ---> aki DWORD - String problem


@ifreject:
CMP EAX,[ESI]
JE @skip
CMP [ESI],EBX
JE @end
ADD ESI,$4
JMP @ifreject

@skip:
MOV EAX,$00

@end:
POP ESI
POP EBX
MOv DWORD PRT[EDI+$34],EAX
JMP [ItemFilterEnd]
end;
end;

horror numero 1: jmp(); me devuelve un Integer(DWORD), y @Variable me devuelve un tipo Pointer como hago para convertirlo!!!!!!!!


La franja horaria es GMT +2. Ahora son las 16:03:40.

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