Das Problem ist, dass dir DirectX den Interface-Pointer (<>Self!) nicht als Parameter mitgibt (Methodensignatur = Methodendeklaration; d.h. die Tatsache, dass du den Interface-Pointer übergeben musst).
Also entweder machst du eine globale Prozedur, die deine Methode aufruft oder du machst sowas wie MakeObjectInstance.
Also mit sowas wie hier kannst du ein
procedure of object in ein
procedure umwandeln. In dem Code unten ist die Variable
Code auf dem Stack. Das müsste man ändern, sodass man zuerst Speicher mittels
VirtualAlloc mit dem Flag
PAGE_EXECUTE_READWRITE holt und damit arbeitet.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| type TObjProc = procedure of object; TProc = procedure;
type TCode = packed record MovEAX: Byte; Data: Pointer; MovEBX: Byte; Code: Pointer; CallEbx: Word; Ret: byte; end;
procedure TForm1.Button1Click(Sender: TObject); var ObjProc: TObjProc; Proc: TProc;
Code: TCode; begin ObjProc := Test; Code.MovEAX := $B8; Code.MovEBX := $BB; Code.CallEbx := $D3FF; Code.Ret := $C3; Code.Data := TMethod(ObjProc).Data; Code.Code := TMethod(ObjProc).Code;
@Proc := @Code;
Proc; end;
procedure TForm1.Test; begin ShowMessage('Success!'); end; |