如何的名字来杀死一个进程?

问题描述:

我如何能杀死从给定的进程名称开始的过程吗?如何的名字来杀死一个进程?

例如:我怎么能杀死program.exe

我试过下面的代码返回的进程名称从PID开始,但它不适合我的需要(在我来说,我有过程的名称和要杀死它)

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

请详细说明您的意思是“不起作用”吗?这永远不是一个有效的问题描述。它会给你一个错误?你有意想不到的结果吗?什么都没有发生?你有调试过吗?或者,你希望得到从文件名的进程id?如果同一个可执行文件有多个进程会怎么样? –

可以使用this功能按名称顺序杀死一个进程:

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; 

注:

  • 有可能是具有大于1个的过程相同的名称
  • KillTask函数返回的遇难过程
  • page在那里我找到了函数说,它工作在Windows 9x/ME/2000/XP的计数。
  • 我亲自在Windows 7上测试过它7/10