如何的名字来杀死一个进程?
问题描述:
我如何能杀死从给定的进程名称开始的过程吗?如何的名字来杀死一个进程?
例如:我怎么能杀死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;
答
可以使用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
请详细说明您的意思是“不起作用”吗?这永远不是一个有效的问题描述。它会给你一个错误?你有意想不到的结果吗?什么都没有发生?你有调试过吗?或者,你希望得到从文件名的进程id?如果同一个可执行文件有多个进程会怎么样? –