Einzelnen Beitrag anzeigen

Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#16

Re: Unerlaubte Member-Variablen im Service?

  Alt 2. Aug 2007, 12:49
@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)".
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat