AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi anderen Prozess beenden und löschen
Thema durchsuchen
Ansicht
Themen-Optionen

anderen Prozess beenden und löschen

Ein Thema von Master-of-Magic · begonnen am 11. Sep 2007 · letzter Beitrag vom 16. Sep 2007
Antwort Antwort
Master-of-Magic

Registriert seit: 24. Jul 2006
37 Beiträge
 
Delphi 2005 Personal
 
#1

anderen Prozess beenden und löschen

  Alt 11. Sep 2007, 20:13
Ich möchte einen anderen Prozess beenden (im Notfall erzwingen) und danach dessen .exe löschen (ebenfalls erzwingen). Das zu löschende Programm befindet sich im selben Verzeichnis, wie das ausführende Programm. Folgender Code liefert mir "Zugriff verweigert":

Delphi-Quellcode:
KillTask('Tool.exe');
DeleteFile(ExtractFileDir(ParamStr(0)) + '\Tool.exe');
mit
Delphi-Quellcode:
function TForm1.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;
Der KillTask funktioniert soweit - wobei ich nicht weiß, ob das die beste Lösung ist. Das Löschen schlägt allerdings fehl, da Windows anscheinend noch eine Sekunde auf die Datei zugreift.
Wenn ich ein sleep(1000) einfüge oder der Prozess nicht läuft, klappt auch das Löschen!

Gibt's einfache Alternativen zu DeleteFile? Oder kann ich das irgendwie ohne sleep lösen?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: anderen Prozess beenden und löschen

  Alt 11. Sep 2007, 20:25
Was ist der Sinn des ganzen? Vielleicht gibt es ja ein Workarround. Wird die andere Anwendung welche gelöscht werden soll durch dich gestartet? Und warum muss die Datei überhaupt gelöscht werden?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Master-of-Magic

Registriert seit: 24. Jul 2006
37 Beiträge
 
Delphi 2005 Personal
 
#3

Re: anderen Prozess beenden und löschen

  Alt 11. Sep 2007, 20:45
Es handelt sich um einen Updater der vor dem Update prüft, ob die Lizenz gültig ist. Ist dies nicht der Fall, darf das Tool nicht genutzt werden. Daher möchte ich eventuell noch laufende Instanzen beenden und das Tool danach löschen, damit der Nutzer zur Registrierung oder wenigstens zu einer Mail gezwungen wird.

Die andere Anwendung ist also nicht zwingend gestartet und wenn, dann durch den Benutzer ...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: anderen Prozess beenden und löschen

  Alt 11. Sep 2007, 21:21
Nur so nebenbei:
while Integer(ContinueLoop) <> 0 do Was ist denn das für eine Konstruktion? Warum nicht:
while ContinueLoop do Ich sehen diesen Code immer und immer wieder wieder und er wid anscheinend immer und immer wieder ohne Sinn und Verstand kopiert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Master-of-Magic

Registriert seit: 24. Jul 2006
37 Beiträge
 
Delphi 2005 Personal
 
#5

Re: anderen Prozess beenden und löschen

  Alt 11. Sep 2007, 22:06
Zitat von Luckie:
Ich sehen diesen Code immer und immer wieder wieder und er wird anscheinend immer und immer wieder ohne Sinn und Verstand kopiert.
Ja, da hast du auch vollkommen Recht. Du hast diesen Hinweis ja auch bereits mehrfach woanders gepostet. Allerdings wollte ich mich erstmal um das andere Problem kümmern, bevor das KillProccess überarbeitet wird.

Der Grund für das Kopieren ist einfach: Man sucht eine Funktion und quält die Forensuche damit (meist hier und im Delphi-Forum). Dabei kommen massenhaft Threads raus, in denen wieder auf andere Threads oder die Suche verwiesen wird und irgendwann landet man in eines Diskussion über die Vor- und Nachteile einer Funktionsvariante. Oft gibt's dann Einschränkungen bei den Betriebssystemen.
Und regelmäßig wird auf eine Codesammlung (hier eben die Schweitzer) verwiesen, wo es "super-tolle Fertiglösungen" gibt. Was macht man also? Man nimmt den Schnipsel, der anscheinend von dem meisten verwendet wird oder der am kürzesten ist. Und da die meisten Leute wie auch ich bei den komplexeren Dingen (wo der hier schon fast dazugehört) nicht mehr viel verstehen, lassen sie den Code, wie er ist ...


Wenn du mir eine bessere Lösung zeigen kannst: Ich bin für alles offen.
Ich hab mir auch schon überlegt, ob ich irgendwie eine Close-Message schicken und im anderen Tool behandeln kann (das ist auch von mir). Allerdings hab ich von Messages wieder keine Ahnung und das Herausfinden des Handles erscheint mir auch unverhältnismäßig aufwendig zu sein.
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#6

Re: anderen Prozess beenden und löschen

  Alt 12. Sep 2007, 00:39
Moin!

Nur weil viele Leute den Code verwenden sagt das noch lange nichts über die Qualität aus.

Was machst Du, wenn der Nutzer ein anderes Programm mit dem Dateinamen "Tool.exe" am laufen hat?
Das killst Du dann auch...

Schau Dich mal nach Hier im Forum suchenDDE um, oder gib Deinem Fenstern sehr eindeutige Namen und suche es mit Hier im Forum suchenFindWindow.
Somit kannst Du eine eigene Nachricht mit Hier im Forum suchenSendMessage zum schließen senden.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Master-of-Magic

Registriert seit: 24. Jul 2006
37 Beiträge
 
Delphi 2005 Personal
 
#7

Re: anderen Prozess beenden und löschen

  Alt 13. Sep 2007, 19:35
Naja, DDE wäre in dem Fall wirklich zuviel des Guten. Und FindWindow benötigt afaik die genaue Fenstercaption - und ist nicht vorhersagbar ...
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#8

Re: anderen Prozess beenden und löschen

  Alt 13. Sep 2007, 19:40
Zitat von Master-of-Magic:
Naja, DDE wäre in dem Fall wirklich zuviel des Guten. Und FindWindow benötigt afaik die genaue Fenstercaption - und ist nicht vorhersagbar ...
Warum?

Gut, DDE muß net sein, aber mach ein zusätzliches verstecktes Fenster mit einem eindeutigem Titel, zB: "Das ist mein zu findendes Fenster von meinem super coolem Programm names: Platziere Deinen Programmnamen hier"
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Master-of-Magic

Registriert seit: 24. Jul 2006
37 Beiträge
 
Delphi 2005 Personal
 
#9

Re: anderen Prozess beenden und löschen

  Alt 16. Sep 2007, 20:19
Ok, da es scheinbar keinen 'sauberen' Weg gibt, hab ich die Sache jetzt anders gelöst:

Beide Programme registrieren über RegisterWindowMessage() eine bestimmte Message WM_BLA. Das zu beendende Programm fängt diese ab und handelt entsprechend.

Der Updater schickt dann nur noch diese Message über
SendNotifyMessage(FindWindow(PChar('TKlassenname'), nil), WM_BLA, 0, 0); Das halte ich für die sauberste Lösung, die auch auf allen Systemen funktionieren sollte. Löschen muss ich die Datei nicht mehr, da diese beim nächsten Start aufgrund der gelöschten Lizenzinfos sowieso die Arbeit verweigert ...
Und falls zufällig ein anderes Programm den gleichen Klassennamen verwendet, wird es bestimmt nicht auf WM_BLA reagieren.

Hat sich also doch gelohnt, sich Messages mal anzuschauen ...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:51 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