MustangPeak共有ライブラリ(http://code.google.com/p/mustangpeakcommonlib/)がコールバックで使用することができる手順と方法を変換し、次のコードが含まれます。私は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;
になりますそれを64ビットに変換する際の助けに感謝します。私は、Win64での呼び出し規約が異なり、最大4つのパラメータがレジスタに渡されることを知っています。したがって、パラメータの数を含めるようにCreateStubを変更する必要があります。実際には、整数またはポインタ(浮動小数点引数なし)である4つ以上のパラメータでは使用されません。
コメントは既に64ビットをサポートしていることを示しています。おそらくそれらのコメントは誤解を招くかもしれません!同じように、StdWndProcのVCLソースを見てみましょう。 –
コメントは誤解を招きます。 VirtualAllocの代わりにGetMemを使用してメモリを割り当てると、64ビットプロセッサ(DEP保護)で問題が発生することになります。 – PyScripter
これを32ビットコードで使用する場合、メソッドポインタを 'stdcall'にする必要がありますか? –