Entwickler-Ecke

Windows API - Task beenden - Zweimal selber Task


LuMa86 - So 09.09.12 18:59
Titel: Task beenden - Zweimal selber Task
Hallo Delphi-Gemeinde,
mit folgendem Code beende ich einen Task:


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:
//uses tlHelp32

function KillTask(ExeFileName: string): Integer;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))
      = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile)
      = UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),
        FProcessEntry32.th32ProcessID), 0));
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

//Aufruf

KillTask('RadStudio'); //Irgendwas halt, ist ja selbsterklärend


Wie kann ich den jetzt zwischen 2 Tasks, die den selben Namen haben (oder eben die slebe Anwendung sie 2x läuft) auseinanderhalten? Angenommen Firefox/IExplorer ist 2x geöffnet. Wie kann ich dann einen bestimmten beenden?

Danke,

Lukas


Delphi-Laie - So 09.09.12 19:04

Über die Prozeß-Identifikationsnummer ("ProcID" oder "Process-ID" oder so ähnlich). Die ist für jeden Prozeß einmalig, auch wenn dieselbe Exe-Datei beliebig oft gestartet wird und mithin "gleichnamige" Prozesse erzeugt.


Delete - So 09.09.12 21:31


Delphi-Quelltext
1:
while Integer(ContinueLoop) <> 0 do                    

Wer hat diesen Unsinn eigentlich angefangen? Eine boolean Variable auf Integer casten um dann einen Boolean-Vergleich durchzuführen? :roll:


Horschdware - So 09.09.12 22:04

Rein aus Ineresse: Geht es darum, ein selbst geschriebenes Programm abzuschiessen?

Oder handelt es sich hierbei um eine Art "Notlösung" weil sich Firefox, Iexplore oder ähnliches seltsamerweise immer doppelt öffnet?
Wenn letzteres: Wäre es nicht sinnvoller, den Grund für das Doppel-Öffnen zu beseitigen?


LuMa86 - Di 11.09.12 15:50

@Horschdware: Ich denke du wilslt auf einen Mehrfachstart anspielen :D Nein, das habe ich bereits mit dem Mutex erledigt.
Das mit der ID hört sich gut an, habe hier auch einen Code, der via ID den Task beenden kann (KillTask(GetProcessID('blabla'))) oder so. Aber das ist ja im Prinzip das selbe, wie kann ich den die Tasks nun unterscheiden?


Narses - Di 11.09.12 16:23

user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Über die Prozeß-Identifikationsnummer ("ProcID oder "Process-ID" oder so ähnlich). Die ist für jeden Prozeß einmalig, auch wenn dieselbe Exe-Datei beliebig oft gestartet wird und mithin "gleichnamige" Prozesse erzeugt.


LuMa86 - Di 11.09.12 22:37

Ja Narses, wenn es so einfach wäre :P Die Prozess ID ist einmalig, auch bei gleichnahmigen Exe-Dateien... Das klingt so einfach ;) Ich melde mich nochmal, wenn es was herausgefunden habe, weie ich das mit der ID lösen kann :)


Delphi-Laie - Di 11.09.12 22:48

user profile iconLuMa86 hat folgendes geschrieben Zum zitierten Posting springen:
Ja Narses, wenn es so einfach wäre :P Die Prozess ID ist einmalig, auch bei gleichnahmigen Exe-Dateien... Das klingt so einfach ;) Ich melde mich nochmal, wenn es was herausgefunden habe, weie ich das mit der ID lösen kann :)


Die Lösung steht doch oben schon, von Dir veröffentlicht: Mit einem Prozeßschnappschuß!


Gerd Kayser - Mi 12.09.12 22:28

user profile iconLuMa86 hat folgendes geschrieben Zum zitierten Posting springen:
Nein, das habe ich bereits mit dem Mutex erledigt.


Das klingt für mich so, als ob es bei der Frage eigentlich darum geht, einen Mehrfachstart der eigenen Anwendung zu verhindern.

Hier findest Du Anregungen: http://delphi.about.com/od/windowsshellapi/l/aa100703a.htm


Delphi-Laie - Mi 12.09.12 22:42

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Wieso denn, genau das wurde doch schon mit dem Mutex verhindert?!

Es wird dem Eröffnungsschreiberling nichts anderes übrigbleiben, als hier mindestens soviele Informationen wie nötig abzugeben - daß dem (noch) nicht so ist, ist am Rätselraten und den Vermutungen ablesbar. Schließlich will er ja etwas.


LuMa86 - Sa 22.09.12 19:51

Sorry, wenn ich mich jetzt erst wieder melde, ich beschreibe das nochmal genau:

1. NEIN! Den Mehrfachstart meiner Anwendung verhindere ich mit Mutex ;)
2. Mein Ziel ist es zwischen 2 Gleichnahmigen Prozessen (oder 2x dem selben Prozess) zu unterscheiden. Aber ich verstehe das mit der ProcessID nicht. Wie ich die bekomme ist mir klar, aber mal angenommen ich habe 2x Firefox. Jetzt ist der erste Prozess im Taskmanager den Prozess den ich behalten möchte, und der 2. Prozess auch Firefox, den will ich aber beenden. Jetzt killt er ja bei meiner Methode den zuerst gefundenen. Wie bring ich aber den 2. um die Ecke, ohne den 1. auch platt zu machen?


Delphi-Laie - Sa 22.09.12 21:30

Dann beendest Du eben den zweiten oder einen sonstigen Fund (von außen, mithin "gewaltsam").

Du kannst Dir auch ein Programm schreiben, das alle Prozeßschappschußfunde mit gleichem Namen ("firefox.exe") in irgendein Ausgabelement mitsamt der zugehörigen Prozeßidentifikationsnummer schreibt und Du dann den Dir genehmen Fund per Mausklick auswählst und "abschießt". Der Möglichkeiten gibt es viele.

Der Prozeßschnappschuß, enumerierend angewandt, schreibt in eine Datenstruktur, die auch die ProcID enthält. Das sich abzuschauen, rate ich zu Luckies "WinInfo". Auch mein Programm "Prozesse" (in verschiedenen Versionen für verschiedene Delphi-/Freepascalcompiler, auch hier im Forum zu finden) schaute sich viel von Luckies Programm ab, es kann auch Prozesse gewaltsam beenden.

Warum nimmst Du aber nicht einfach den Taskmanager für diese Zwecke?