Entwickler-Ecke

Windows API - Laufender Prozess wird nicht angezeigt...


DiamondDog - Mo 06.10.08 14:07
Titel: Laufender Prozess wird nicht angezeigt...
Hallo Leute,
ich hab da folgenden Code gefunden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
uses
  tlhelp32, ShellAPI;

function GetProcessID(Exename: string): DWORD;
var
  hProcSnap: THandle;
  pe32: TProcessEntry32;
begin
  result := 0;
  hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
  if hProcSnap <> INVALID_HANDLE_VALUE then
  begin
    pe32.dwSize := SizeOf(ProcessEntry32);
    if Process32First(hProcSnap, pe32) = true then
    begin
      while Process32Next(hProcSnap, pe32) = true do
      begin
        if pos(Exename, pe32.szExeFile) <> 0 then
          result := pe32.th32ProcessID;
      end;
    end;
    CloseHandle(hProcSnap);
  end;
end;

function GetProcessHandleFromID(ID: DWORD): THandle;
begin
  result := OpenProcess(SYNCHRONIZE, False, ID);
  CloseHandle(result);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  hProcess: THandle;
  wf: DWORD;
begin
  bClose := False;
  Button1.Enabled := False;
  while bClose = False do
  begin
    hProcess := GetProcessHandleFromID(GetProcessID('notepad.exe'));
    if hProcess = 0 then
      Label1.Caption := 'Notepad läuft nicht'
    else
      Label1.Caption := 'Notepad läuft';
    Application.HandleMessage;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  bClose := True;
end;
gebe ich jetzt anstelle von notepad.exe den laufenden GameMon.des an,
wird diese Prozess mir aber nicht angezeigt.
Weiß jemand wieso und wie ich es beheben kann?

Danke schon mal fürs Helfen.

Mfg Dog


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mo 06.10.2008 um 17:43


jaenicke - Mo 06.10.08 14:23

Taucht er denn im Taskmanager auf?


DiamondDog - Mo 06.10.08 14:25

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Taucht er denn im Taskmanager auf?

Ja im Taskmanager steht er drin.


jaenicke - Mo 06.10.08 14:35

Was mich irritiert: Wozu GetProcessHandleFromID? Du hast doch schon die ID gefunden, und dann muss er ja laufen, wozu also den dann noch öffnen?
Um welchen Prozess geht es denn?

Und dann ist da noch ein ziemlich heftiger Fehler im Code:
user profile iconDiamondDog hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
    if Process32First(hProcSnap, pe32) = true then
    begin
      while Process32Next(hProcSnap, pe32) = true do
Das ist falsch, der Vergleich mit true darf da nicht stehen, sonst brauchst du dich nicht wundern, wenn es nicht immer funktioniert. Richtig ist:

Delphi-Quelltext
1:
2:
3:
    if Process32First(hProcSnap, pe32) then
    begin
      while Process32Next(hProcSnap, pe32) do
Erklärungen:
http://www.michael-puff.de/Artikel/VergleichWahrheitswerte.shtml
und eine etwas längere Diskussion mit genaueren Erläuterungen darüber:
http://www.delphi-forum.de/topic_Pruefen+Boolscher+Variablen+per+Vergleich+vs+direkt+mit+if_83487.html


DiamondDog - Mo 06.10.08 14:48

Auch das entfernen von = True hat mich nicht weiter gebracht.
Er kann es immer noch nicht finden.


Delete - Mo 06.10.08 14:59

Probier mal Suche im MSDN ENUMPROCESSES.


DiamondDog - Mo 06.10.08 15:04

Hab was gefunden womit es geht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button1Click(Sender: TObject);
begin
  hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnap <> INVALID_HANDLE_VALUE) then
  begin
    ProcEntry.dwSize := SizeOf(ProcessEntry32);
    if (Process32First(hSnap, ProcEntry)) then
    begin
      s := ProcEntry.szExeFile;
      while Process32Next(hSnap, ProcEntry) do
      begin
        s := ProcEntry.szExeFile;
        if ExtractFileName(s) = 'GameMon.des' then ShowMessage('GameMon.des gefunden');
      end;
    end;
  end;
  CloseHandle(hSnap);
end;
jetzt müst ich nur noch wissen wie ich mir angezeigen lassen kann, wenn der Prozes nicht gefunden wurde.


jaenicke - Mo 06.10.08 15:13

Das ist ja das selbe wie der Code vorhin, nur eben ohne das von mir ja angesprochene GetProcessHandleFromID...
Versuch deinen alten Code doch einfach mal ohne...

Wobei mir mal so auffällt: Wird der von Process32First gefundene Prozess bei den beiden Codes eigentlich benutzt? Ich würde sagen nein...


DiamondDog - Mo 06.10.08 23:04

Ich erklär mal kurz was ich vor habe:
Also ich mache eine Liste von bestimmten Prozessen und diese soll mit den laufen den verglichen werden.
Das dürfte ja eigendlich nicht so schwer sein das erste geht auch mit *.exe aber leidermit der GameMon.des die übersieht er leider immer.


jaenicke - Mo 06.10.08 23:23

Probier mal dieses Programm aus, wenn es funktioniert, hatte ich in meinem vorletzten Beitrag Recht, wenn nicht wüsste ich auch grad nicht warum es nicht geht.


DiamondDog - Mo 06.10.08 23:38

Ja damit funktioniert es.
Wollte es eh nicht mehr über die ProzessID machen sondern abfragen was alles läuft und dann alles mit den Programmen die ich in meiner Liste habe vergleichen.
Sorry in so etwas schwirigen sachen bin ich noch Anfänger, deswegen versteh ich nit immer alles gleich auf Anhieb.
Was genau hast bei deinem Prog den jetzt alles geändert?

Moderiert von user profile iconNarses: überflüssige Leerzeilen/Umbrüche entfernt


jaenicke - Mo 06.10.08 23:42

user profile iconDiamondDog hat folgendes geschrieben Zum zitierten Posting springen:
Was genau hast bei deinem Prog den jetzt alles geändert?
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Was mich irritiert: Wozu GetProcessHandleFromID? Du hast doch schon die ID gefunden, und dann muss er ja laufen, wozu also den dann noch öffnen?
;-)
Durch die Verwendung auch des ersten Eintrags wird der Systemprozess und dessen Daten (Auslastung) auch gefunden.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
function GetProcessID(Exename: string): DWORD;
var
  hProcSnap: THandle;
  pe32: TProcessEntry32;
begin
  result := 0;
  hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
  if hProcSnap <> INVALID_HANDLE_VALUE then
  begin
    pe32.dwSize := SizeOf(ProcessEntry32);
    if Process32First(hProcSnap, pe32) then
    begin
      repeat
        if (Exename = pe32.szExeFile)
          or (not frmMain.chkExact.Checked and (Pos(LowerCase(Exename), LowerCase(pe32.szExeFile)) > 0)) then
        begin
          result := pe32.th32ProcessID;
          frmMain.memResult.Lines.Clear;
          frmMain.memResult.Lines.Add('Prozess: ' + pe32.szExeFile);
          CloseHandle(hProcSnap);
          Exit;
        end;
      until not Process32Next(hProcSnap, pe32);
    end;
    CloseHandle(hProcSnap);
  end;
end;

procedure TfrmMain.btnSearchClick(Sender: TObject);
begin
  if GetProcessID(edtProcessName.Text) = 0 then
    ShowMessage('Der Prozess läuft nicht!')
  else
    ShowMessage('Der Prozess läuft!');
end;


DiamondDog - Di 07.10.08 20:26

Super @ jaenicke so funktioniert es so wie es soll.
1000 Dank.