unit Unit2;
interface
type Tmyclass = class;
private
enumpointer : Pointer;
function EnumWinProc(WinHandle: HWND; lParam: LPARAM): boolean; StdCall;
public
constructor create; virtual;
destructor destroy; override;
procedure aufruf;
end; // von Tmyclass
implementation
function MakeProcInstance(M: TMethod): Pointer;
begin
// allocate memory
GetMem(Result, 15);
asm
// MOV ECX,
MOV BYTE PTR [EAX], $B9
MOV ECX, M.Data
MOV DWORD PTR [EAX+$1], ECX
// POP EDX
MOV BYTE PTR [EAX+$5], $5A
// PUSH ECX
MOV BYTE PTR [EAX+$6], $51
// PUSH EDX
MOV BYTE PTR [EAX+$7], $52
// MOV ECX,
MOV BYTE PTR [EAX+$8], $B9
MOV ECX, M.Code
MOV DWORD PTR [EAX+$9], ECX
// JMP ECX
MOV BYTE PTR [EAX+$D], $FF
MOV BYTE PTR [EAX+$E], $E1
end;
end;
//////////////////////////////////////////////////////////////////////////////////
procedure FreeProcInstance(ProcInstance: Pointer);
begin
// free memory
FreeMem(ProcInstance, 15);
end;
//////////////////////////////////////////////////////////////////////////////////
constructor Tmyclass.create;
var t : Tmethod;
begin
inherited create;
t.Code := @Tmyclass.enumwinproc;
t.Data := self;
enumpointer := makeProcInstance(t);
end; // von create
//////////////////////////////////////////////////////////////////////////////////
destructor Tmyclass.destroy;
begin
FreeProcInstance(enumPointer); // aufräumen
inherited destroy;
end; /// von free
//////////////////////////////////////////////////////////////////////////////////
function Tmyclass.EnumWinProc(WinHandle: HWND; lParam: LPARAM): boolean; StdCall;
begin
... Code
end; // von enumwindowsprocedure
//////////////////////////////////////////////////////////////////////////////////
// Aufruf //
procedure Tmyclass.aufruf;
begin
EnumWindows(enumpointer,0);
end;
end.