Thư viện MustangPeak chung (http://code.google.com/p/mustangpeakcommonlib/) chứa đoạn mã sau có thể chuyển đổi một phương pháp để một thủ tục có thể được sử dụng trong một callback:Làm thế nào để chuyển một phương thức sang một thủ tục gọi lại trong 64bit Delphi XE2?
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;
tôi sẽ đánh giá cao bất kỳ sự trợ giúp nào trong việc chuyển đổi nó thành 64bit. Tôi biết rằng quy ước gọi trong Win64 là khác nhau và có tới bốn tham số được chuyển vào sổ đăng ký. Vì vậy, CreateStub có thể phải được sửa đổi để bao gồm số lượng tham số. Nó thực sự không được sử dụng với hơn bốn tham số là số nguyên hoặc con trỏ (không có đối số dấu chấm động).
Nhận xét cho biết rằng nó đã hỗ trợ 64 bit. Có lẽ những ý kiến đó là sai lầm! Tất cả như nhau, nhìn vào nguồn VCL cho StdWndProc cho một mã mẫu làm một cái gì đó rất giống nhau. –
Nhận xét là gây hiểu lầm. Nó có nghĩa là để nói rằng nếu bạn cấp phát bộ nhớ với GetMem thay vì VirtualAlloc nó sẽ tạo ra một vấn đề trong bộ vi xử lý 64bit (bảo vệ DEP). – PyScripter
Khi bạn sử dụng mã này trong mã 32 bit, bạn có cần phải tạo con trỏ phương thức 'stdcall' không? –