@Luckie: Warum so kompliziert? nutze doch den lParam um die ObjectInstanz zu übergeben wenn du den lparam sowieso nicht nutzt. Und selbst wenn du den lparam nutzten willst kannst du dort auch einen Pointer auf einen Record übergeben der deinen eigentlichen lparam enthält und zustäzlich die Instanz.
Variante wenn lParam nicht benötigt wird
Delphi-Quellcode:
function GlobalEnumWindows(hWnd: THandle; lp: LPARAM): Boolean; stdcall;
begin
TEnumWindows(lp).EnumWindows(hWnd, 0);
end;
constructor TEnumWindows.Create;
begin
Windows.EnumWindows(@GlobalEnumWindows, Cardinal(Self));
end;
function TEnumWindows.EnumWindows(hWnd: THandle): Boolean; stdcall;
begin
Writeln(hWnd);
Result := True;
end;
Der Fehler bei dir lag daran das du im Create zwar "EnumWindows" aufrufst, aber da EnumWindows eine Methode deiner Klasse ist wird diese aufgerufen und nicht die EnumWindows-Funktion aus der
Unit Windows
Anstelle von:
Delphi-Quellcode:
constructor TEnumWindows.Create;
var
Method: TMethod;
begin
Method.Code := @TEnumWindows.EnumWindows;
Method.Data := Self;
EnumProcInst := MakeProcInstance(Method);
EnumWindows(Cardinal(EnumProcInst), 0);
end;
müsste es also mindestens so aussehen:
Delphi-Quellcode:
constructor TEnumWindows.Create;
var
Method: TMethod;
begin
Method.Code := @TEnumWindows.EnumWindows;
Method.Data := Self;
EnumProcInst := MakeProcInstance(Method);
windows.EnumWindows(EnumProcInst, 0);
end;
ansonsten wird wie bereits erwähnt deine Methode aufgerufen und der erste Parameter ist dann nicht ein
Handle sondern "Cardinal(EnumProcInst)".