La Biblioteca Mustangpeak común (http://code.google.com/p/mustangpeakcommonlib/) contiene el código siguiente que convierte un método para un procedimiento que se puede utilizar en una devolución de llamada:¿Cómo convertir un método a un procedimiento de devolución de llamada en Delphi XE2 de 64 bits?
const
AsmPopEDX = $5A;
AsmMovEAX = $B8;
AsmPushEAX = $50;
AsmPushEDX = $52;
AsmJmpShort = $E9;
type
TStub = packed record
PopEDX: Byte;
MovEAX: Byte;
SelfPointer: Pointer;
PushEAX: Byte;
PushEDX: Byte;
JmpShort: Byte;
Displacement: Integer;
end;
{ ----------------------------------------------------------------------------- }
function CreateStub(ObjectPtr: Pointer; MethodPtr: Pointer): Pointer;
var
Stub: ^TStub;
begin
// Allocate memory for the stub
// 1/10/04 Support for 64 bit, executable code must be in virtual space
Stub := VirtualAlloc(nil, SizeOf(TStub), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
// Pop the return address off the stack
Stub^.PopEDX := AsmPopEDX;
// Push the object pointer on the stack
Stub^.MovEAX := AsmMovEAX;
Stub^.SelfPointer := ObjectPtr;
Stub^.PushEAX := AsmPushEAX;
// Push the return address back on the stack
Stub^.PushEDX := AsmPushEDX;
// Jump to the 'real' procedure, the method.
Stub^.JmpShort := AsmJmpShort;
Stub^.Displacement := (Integer(MethodPtr) - Integer(@(Stub^.JmpShort))) -
(SizeOf(Stub^.JmpShort) + SizeOf(Stub^.Displacement));
// Return a pointer to the stub
Result := Stub;
end;
{ ----------------------------------------------------------------------------- }
{ ----------------------------------------------------------------------------- }
procedure DisposeStub(Stub: Pointer);
begin
// 1/10/04 Support for 64 bit, executable code must be in virtual space
VirtualFree(Stub, SizeOf(TStub),MEM_DECOMMIT);
end;
lo haría Agradecemos cualquier ayuda para convertirlo a 64 bits. Sé que la convención de llamadas en Win64 es diferente y que se pasan hasta cuatro parámetros en los registros. Así que CreateStub puede tener que ser modificado para incluir la cantidad de parámetros. En realidad, no se usa con más de cuatro parámetros que son enteros o punteros (sin argumentos de coma flotante).
Los comentarios indican que ya es compatible con 64 bits. ¡Quizás esos comentarios son engañosos! De todos modos, observe la fuente de VCL para StdWndProc para obtener un código de muestra que hace algo muy similar. –
El comentario es engañoso. Quiere decir que si asigna memoria con GetMem en lugar de VirtualAlloc, crearía un problema en los procesadores de 64 bits (protección DEP). – PyScripter
Cuando usa esto en código de 32 bits, ¿necesita hacer que su puntero de método 'stdcall'? –