Einzelnen Beitrag anzeigen

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