Autor Beitrag
LuMa86
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: So 09.09.12 18:59 
Hallo Delphi-Gemeinde,
mit folgendem Code beende ich einen Task:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: 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.


Zuletzt bearbeitet von Delphi-Laie am Di 11.09.12 16:44, insgesamt 1-mal bearbeitet
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 09.09.12 21:31 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: 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?

_________________
Delphi: XE - OS: Windows 7 Professional x64
LuMa86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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.

_________________
There are 10 types of people - those who understand binary and those who don´t.

Für diesen Beitrag haben gedankt: Delphi-Laie
LuMa86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: 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: delphi.about.com/od/...lapi/l/aa100703a.htm
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: 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?