Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Prozess Beenden (https://www.delphipraxis.net/51279-prozess-beenden.html)

Olli 14. Aug 2005 23:33

Re: Prozess Beenden
 
Zitat:

Zitat von Luckie
Ja aber doch nur in dem Code, der demonstriert, wie man die Funktionen benutzt. :gruebel:

Habe ich was anderes behauptet? Ich finde es dennoch unglücklich, zumal die Beschreibung fehlt, was in den einzelnen Form-Elementen erwartet wird ;)
Ansonsten favorisiere ich natürlich eindeutig die Kapselung in Routinen oder sogar Klassen. Keine Frage.

Luckie 14. Aug 2005 23:39

Re: Prozess Beenden
 
Es klang so, als wenn du meintest in den einzelnen Routinen würde ich auf TForm usw. zugreifen.
Zitat:

was in den einzelnen Form-Elementen erwartet wird
Meinst du eine erklärung der Parameter? Ich bin davon ausgegeangen, die erschließen sich von selbst. Aber bei Gelegenheit werde ich das noch mal überarbeiten, dann wird eventuell sogar eine Klasse drauß. ;)

Olli 14. Aug 2005 23:43

Re: Prozess Beenden
 
Zitat:

Zitat von Luckie
Meinst du eine erklärung der Parameter?

Jain. Wäre sicher auch nicht schlecht. Aber eigentlich meinte ich: "Man nehme ein Edit, welches die numerische ID des Prozesses enthält, welcher beendet werden soll" ... usw.
Es ist für dich und mich eindeutig, aber wir hatten das schon mehrfach, nicht alle wissen so gut bescheid :-/

Luckie 14. Aug 2005 23:45

Re: Prozess Beenden
 
Ach so da. Jupp, wäre bestimmt nicht schlecht. Aber nicht mehr heute, mir platzt gleich der Schädel - hat hier jemand mal eine Kopfschmerztablette?

Olli 14. Aug 2005 23:50

Re: Prozess Beenden
 
Zitat:

Zitat von Luckie
hat hier jemand mal eine Kopfschmerztablette?

Nö, aber wie wäre es mit einem Gläschen 5jährigem Metaxa. Für dich würde ich sogar die Flasche 7jährigen in der Ecke aufmachen - alternativ kann ich Tavria oder Aj Petri aus der Ukraine anbieten :mrgreen:

Luckie 14. Aug 2005 23:57

Re: Prozess Beenden
 
Da ich mich sowieso schon die ganze Zeit mit dir hier beim Posten unterhalte:

Zitat:

Für dich würde ich sogar die Flasche 7jährigen in der Ecke aufmachen
Ist das gut, wenn er sieben Jahre alt ist oder schlecht? :gruebel: Ich frage mich nämlich, ob ich mich geehrt fühlen soll oder nicht. :mrgreen:

Zitat:

alternativ kann ich Tavria oder Aj Petri aus der Ukraine anbieten
Aha. Alte russische Heilmethode: Schmerzen durch Schmerzen bekämpfen? :roll:

Aber wir werden gerade ziemlich offtopic. Eigentlich müsste ich schon mein eigenes Posting melden. :wall:

Luckie 15. Aug 2005 00:02

Re: Prozess Beenden
 
Hiermit ermahne ich Luckie, nicht weiter offtopic zu werden und zum Thema zurückzufinden!

Ein Hinweis von Olli noch an Luckie:
Zitat:

7 Jahre ist natürlich besser. Und die beiden ukrainischen sind Cognacs ;) ... sehr lecker.
*aua mein kopf* :cry: Fühlt sich an wie: :wall:

turboPASCAL 15. Aug 2005 04:01

Re: Prozess Beenden
 
@Luckie AND Olli, darf ich Eure Zweisamkeit unterberchen ? :wink:

@MiniKeks

In Bezug auf http://www.swissdelphicenter.ch/de/showcode.php?id=593 brauchst Du doch nur die beiden Methoden zusammenführen (Siehe Beispiel).
Im Beispiel sollte man noch auf die Gross- und Kleinschreibung eingehen.

Delphi-Quellcode:
function TerminateTheProcess(const ExeFilename: String): Boolean;
var
  ...
begin
  aSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  aProcessEntry32.dwSize := SizeOf(aProcessEntry32);
  bContinue := Process32First(aSnapshotHandle, aProcessEntry32);
  while Integer(bContinue) <> 0 do // Suche solang bContinue true
  begin
    if ExtractFileName(aProcessEntry32.szExeFile) = ExeFilename then
    begin
      if MessageDlg('Do you want to Terminate...' ... then
      begin
        PrID := aProcessEntry32.th32ProcessID;
        Ph := OpenProcess(1, BOOL(0), PrID);
        Ret := TerminateProcess(Ph, 0);
        if Integer(Ret) = 0 then
        begin
          MessageDlg('Cannot terminate...', mtInformation, [mbOK], 0);
          Result := False;
        end else
        begin
          bContinue := False;
          Result := True;
         
          { könnte man auch so machen ist aber nicht "sauber"
          CloseHandle(aSnapshotHandle);
          Result := True;
          exit;
          }
       end;
      end;
    end;
    bContinue := Process32Next(aSnapshotHandle, aProcessEntry32); // weitersuchen
  end;
  CloseHandle(aSnapshotHandle);
end;

Luckie 15. Aug 2005 10:03

Re: Prozess Beenden
 
Und genau das ist das Problem:
Delphi-Quellcode:
Ret := TerminateProcess(Ph, 0);
weswegen ich meinen Code vorziehen würde. TerminateProcess arbeitet asynchron:
Zitat:

Zitat von PSDK
TerminateProcess initiates termination and returns immediately.

Das heißt, es leitet den Prozess zum Beenden des Prozesses ein und kehrt sofort zurück. Der Rückgabewert signalisiert nur, ob TerminateProcess korrekt ausgeführt wurde, sprich, mit einem korrekten Prozesshandle. Der Rückgabewert sagt jedoch nichts darüber aus, ob der Prozess auch tatsächlich termniniert wurde. Deswegen sieht meine Routine so aus:
Delphi-Quellcode:
{...}
    dw := Integer(TerminateProcess(hProcess, 1));
    if dw <> 0 then
    begin
      // TerminateProcess returns immediately, so wie have to verify the result via
      // WaitForSingleObject
      dw := WaitForSingleObject(hProcess, Wait);
      if dw = WAIT_FAILED then
        dw := GetLastError;
    end
{...}

Olli 15. Aug 2005 10:05

Re: Prozess Beenden
 
Zitat:

Zitat von turboPASCAL
@Luckie AND Olli, darf ich Eure Zweisamkeit unterberchen ? :wink:

Frechheit hier einfach so reinzuplatzen :mrgreen:

Zitat:

Zitat von turboPASCAL
[...] brauchst Du doch nur die beiden Methoden zusammenführen (Siehe Beispiel).

Dann kann er die Schleife ja gleich durchlaufen lassen, damit er alle Prozesse dieses Namens gekillt :lol:
Woraus schöpfst du eigentlich deine Zuversicht, der erste Prozeß mit diesem exakten Namen der EXE sei das Ziel? Hier könnte der Pfad auch relevant sein.


Außerdem gibt es ein typisches Problem der Native APIs (also schon unterhalb der Toolhelp-API) in Sachen Dateiname. Bei mir wird aus
C:\Programme\Apache Group\Apache2\bin\ApacheMonitor.exe sowohl im TaskManager als auch in anderen ähnlichen Programmen ein ApacheMonitor.e. Das gilt natürlich für obige Beispiele gleichermaßen - fiel mir nur gerade ein und wird üblicherweise komplett vernachlässigt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:04 Uhr.
Seite 2 von 3     12 3      

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