2017-05-04 5 views
0

Wie kann ich einen Prozess ab einem bestimmten Prozessnamen beenden?Wie man einen Prozess mit Namen beendet?

Zum Beispiel: Wie kann ich program.exe töten?

Ich habe den folgenden Code versucht, die der Prozessname von einem PID Start zurück, aber es passt nicht für meine Bedürfnisse (In meinem Fall habe ich den Prozessnamen und wollen sie töten)

function GetPathFromPID(const PID: cardinal): string; 
var 
    hProcess: THandle; 
    path: array[0..MAX_PATH - 1] of char; 
begin 
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID); 
    if hProcess <> 0 then 
    try 
     if GetModuleFileNameEx(hProcess, 0, path, MAX_PATH) = 0 then 
     RaiseLastOSError; 
     result := path; 
    finally 
     CloseHandle(hProcess) 
    end 
    else 
    RaiseLastOSError; 
end; 
+1

Bitte erarbeiten, was Sie mit „funktioniert nicht“? Das ist nie eine gültige Problembeschreibung. Gibt es einen Fehler? Erhalten Sie unerwartete Ergebnisse? Passiert überhaupt nichts? Hast du es schon ausgetestet? Oder möchten Sie die Prozess-ID aus dem Dateinamen abrufen? Was passiert, wenn es mehr als einen Prozess für dieselbe ausführbare Datei gibt? –

Antwort

3

Sie können this Funktion verwenden, um einen Prozess nach dem Namen zu töten:

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; 

Hinweis:

  • Es könnte mehr als 1 Prozess den gleichen Namen
  • KillTask Funktion gibt die Anzahl der getöteten Prozesse
  • Die page mit dem ich die Funktion gefunden haben, sagt, dass es funktioniert auf Windows 9x/ME/2000/XP.
  • Ich habe getestet es persönlich auf 7/10 Windows-