Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit ENumWindows (https://www.delphipraxis.net/148740-problem-mit-enumwindows.html)

Anthauri 7. Mär 2010 16:26


Problem mit ENumWindows
 
Hallo zusammen,
ich habe diverse Beiträge zum ENumWindows durchforstet, konnte mein Problem aber nicht lösen.

Aus meinem Programm heraus will ich erfahren, ob eine bestimmte Exe noch läuft, deren Name ich kenne und darauf reagieren.
Dafür habe ich eine Funktion angelegt:

Delphi-Quellcode:
function FindApp(AWindow: HWND) : boolean; stdcall;
var Buffer: PChar;
begin
  GetWindowText(AWindow, Buffer, 255);
  Result := True;
  memo1.lines.add(buffer);
end;
Testweise werden hier im Memo die laufenden Applikationen angezeigt. Hier plane ich die Zeilen nach dem gesuchten Namen zu untersuchen.

Der Aufruf erfolgt aus eine Prozedur so:
Delphi-Quellcode:
   EnumWindows(@FindApp,0);
Die folgenden (mir nicht erklärbaren) Dinge passieren:

1.) Normalerweise werden die eingegebenen Codes ja vervollständigt.
Als ich bei der Funktion die Zeile geschrieben habe, die das Memo füllt ...MEMO1. <- wurde nichts vorgeschlagen.
Vielmehr meinte der Compiler, dass die Vervollständigung nicht geht, weil Fehler vorliegen.
Wenn ich vor der MEMO1 jedoch FORM1. setzt klappt es.

2.) Die Funktion selbst ist nicht zu Beginn des Programms deklariert.
Wenn ich das mache (etwa so hinter den bestehenden Proceduren):
"function FindApp(AWindow: HWND) : boolean; stdcall;"
Meint der Compiler dass beim Aufruf über "ENumWindows" in der Prozedur etwas fehlt -> "Variable required".

3.) Wenn ich die Deklaration weglasse und das Memo mit Form1.Memo1 anspreche werden die laufenden Apllicationen wirklich ins Memo
geschrieben. Dann wird aber in der Prozedur, die den Aufruf ENumWindows macht beim nächsten Schritt eine Access Violation
ausgelöst. Schalte ich den Schritt mit dem ENumWindos aus laufen die Folgeschritte weiter. Schalte ich die Folgeschritte aus
läuft das ENum sauber.


was mache ich falsch???
wahrscheinlich liegt es an mir...nur wo?

P.S.
Zwischenzeitlich hatte ich auch einen Stand wo beides ging doch da wurden Variablen (Zähler), die nach dem ENum liegen einfach mit Null gefüllt obwohl diese in der ENum gar nicht verändert wurden. Diesen Stand konnte ich aber nicht reporduzieren.

SirThornberry 7. Mär 2010 16:48

Re: Problem mit ENumWindows
 
laut MSDN muss die EnumWindowsProc wie folgt aussehen:
Code:
BOOL CALLBACK EnumWindowsProc(     
    HWND hwnd,
    LPARAM lParam
);
Bei dir fehlt also der LParam und Boolean ist auch nicht das gleiche wie BOOL.

Anthauri 7. Mär 2010 16:58

Re: Problem mit ENumWindows
 
Aha !?
Ich habe das Boolean gegen Bool getauscht. (Wo ist der Unterschied?)
Wirklich geändert hat das aber nichts.

Was das LParam angeht, so habe ich Beispiele gefunden, wo der Aufruf so erfolgte.

Die muss ich das angeben und versorgen?
(Ich dachte das ",0" hinter dem HWND würde hier reichen.

SirThornberry 7. Mär 2010 17:01

Re: Problem mit ENumWindows
 
Deine Funktion muss so aussehen:
Delphi-Quellcode:
function FindApp(AWindow: HWND; lparam: LPARM) : Bool; stdcall;
Der Aufruf ist schon richtig.

Anthauri 7. Mär 2010 17:37

Re: Problem mit ENumWindows
 
Muss ich das LPARM irgendwo deklarieren oder wird eine Unit dafür gebraucht?

Der Compiler sagt nun: Undeclared Identifier LPARM

wicht 7. Mär 2010 17:43

Re: Problem mit ENumWindows
 
Das Teil heißt glaube ich "LPARAM" und ist in der Unit Windows oder Messages.

SirThornberry 7. Mär 2010 18:14

Re: Problem mit ENumWindows
 
genau, ich hatte mich bei meinen letzten Post vertippt (einen Buchstaben bei dem Typen vergessen). Bei der C-Declaration aus dem MSDN (Beitrag #2 des Themas) stimmt es jedoch.

Anthauri 7. Mär 2010 18:20

Re: Problem mit ENumWindows
 
Danke,
verschwunden sind die Probleme aber nicht.

Wenn ich die Funktion deklariere (hinter den Prozeduren) kommt wieder die Meldung mit der fehlenden Variablen beim Aufruf der ENum.
Ohne Deklaration gehts, aber der Folgebefehl nach der ENum macht eine Access Violation.

Schon komisch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 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