AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsProc
Thema durchsuchen
Ansicht
Themen-Optionen

Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsProc

Ein Thema von ustra · begonnen am 5. Feb 2004 · letzter Beitrag vom 6. Feb 2004
Antwort Antwort
Seite 2 von 2     12   
ustra

Registriert seit: 12. Mär 2003
Ort: Geesthacht
138 Beiträge
 
Delphi 5 Professional
 
#11

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 5. Feb 2004, 19:46
Hi,

ich habe es mir angesehen. Ich sage nur: Wer lesen kann, ist klar im Vorteil. Sorry, da war ich zu schnell. Ich habe es übersehen, dass Du die Definition der Methode geändert hast. Dann kann es theoretisch laufen. Kompiliere ich nun das, meldet mir der Compiler:

Variable erforderlich in der Zeile:EnumWindows(@EnumWindowsProc, Integer(Self)); Beste Grüße
Ulrich
Ulrich Strauer
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#12

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 5. Feb 2004, 19:49
Das ist schnell gelöst

EnumWindows(@TWaechter.EnumWindowsProc, Integer(Self));
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#13

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 5. Feb 2004, 19:56
Nimm dein Enum WindowsProc aus der Klasse raus und mach es so:
Delphi-Quellcode:
type
  PMyEnumParam = ^TMyEnumParam;
  TMyEnumParam = record
    lb: TListbox;
  end;

function GetWindows(const hWnd: Longword; Param: PMyEnumParam): LongBool;
  stdcall;
var
  Len: Longint;
  S: string;
begin
  Result := True;
  if not (IsWindow(hWnd) and IsWindowVisible(hWnd)) then
    Exit;
  Len := SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);
  if Len > 0 then
  begin
    SetLength(S, Len);
    SendMessage(hWnd, WM_GETTEXT, Len + 1, Longint(Pchar(S)));
    Param.lb.Items.Add(s);
  end;
  // mit Result = False kann die Callbackfunktion vorzeitig verlassen werden
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Param: TMyEnumParam;
begin
  Param.lb := Listbox1;
  EnumWindows(@GetWindows, LPARAM(@Param));
end;
Wenn du es in der Klasse drin hast, wird automatisch der unsichtbare Self-Parameter mitgeführt von Delphi und dann passt die Deklaration nicht mehr wie sie eiegntlich von Windows sein müsste.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
ustra

Registriert seit: 12. Mär 2003
Ort: Geesthacht
138 Beiträge
 
Delphi 5 Professional
 
#14

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 5. Feb 2004, 20:22
Hi alle miteinander,

erstmal Danke für Eure Bemühungen. Ich habe dank Eurer Hilfe das Problem gelöst. Nun noch mal im Detail:

@Neolithos: Ich habe es so gemacht, wie angegeben. Allerdings stürzt das Programm dann komplett ab. Irgendeine Zugriffsverletzung. Wo genau der Fehler ist, kann ich Dir nicht sagen.

@Luckie: Ich habe jetzt Deine Methode ausprobiert und tatsächlich, das funktioniert.

Noch mal, recht herzlichen Dank. Ihr seid eine richtig KLASSE Forum. Die Seite ist auch meine Startseite, weil Sie mir so gut gefällt. Ein dickes Lob an Euch.

Ulrich
Ulrich Strauer
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#15

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 5. Feb 2004, 20:23
Ich dachte bei class-Sachen gibt es keine Instanz.

Lieg ich da ein bißchen falsch. Wenn Ja!

Dann:

Delphi-Quellcode:
function WaechterEWProc(hWindow : DWORD; fWaechter : TWaechter) : Longbool;
...
begin
..
end;

EnumWindows(@WaechterEWProc, Integer(Self));
Das mit der Struktur kann man sich sparen.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#16

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 6. Feb 2004, 00:02
Hallo Ustra,

falls Du es doch noch schön objectorientiert machen möchtest, und somit auch auf alle Methoden des Objectes zugreifen kannst. Hier nochmal die Lösung

viele Grüße
stoxx

Code:
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.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 6. Feb 2004, 13:29
Zitat von neolithos:
Ich dachte bei class-Sachen gibt es keine Instanz.

Lieg ich da ein bißchen falsch. Wenn Ja!
Na ja, man kann in einer Klassenmethode auch auf andere Klassenmethoden zugreifen. D.h., zumindest einen Zeiger auf die Klasse muss es schon geben.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
ustra

Registriert seit: 12. Mär 2003
Ort: Geesthacht
138 Beiträge
 
Delphi 5 Professional
 
#18

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 6. Feb 2004, 17:11
Hi,

@stoxx: ich habe es nicht mehr ausprobiert, aber ich denke, dass würde laufen. Luckies variante ist auch gut. Wenn ich das nächste Mal vor dem Problem stehe, werde ich noch mal Deine Lösung ausprobieren. Vielleicht mache ich das noch. Trotzdem danke für Deine Bemühungen.

Beste Grüße
Ulrich
Ulrich Strauer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz