我写了段程序找到进程名,然后把它kill掉,编译可通过,但是我拿notepad,exe试了好多次都是不行?请各位指教。
uses
ShellAPI,CommCtrl;
function FindProcessHnd(ProcessName:string):THandle;//方法是取得进程handle
var
FProHnd: THandle;
I: Integer;
ExeFile: string;
PE: TProcessEntry32;
begin
if FProHnd > 0 then CloseHandle(FProHnd);//这里不知为什么说我FProHnd
//没有初始化,
FProHnd:= CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if FProHnd = -1 then
raise Exception.Create('CreateToolHelp32Snapshot failed');
PE.dwSize := SizeOf(PE);
try
result:=0;
if Process32First(FProHnd, PE) then // 获取进程
repeat
if PE.szExeFile=ProcessName then//如果是输入的ProcessName就返回
begin //这个进程的handle
result:=FProHnd;
break;
end;
until not Process32Next(FProHnd, PE);
finally
closeHandle(FProHnd);
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
FHandle:THandle;
begin
FHandle:=FindProcessHnd(Edit1.Text);
Terminateprocess(FHandle, 0);//结束进程
end;
end.
希望各位给我更正一下
uses
ShellAPI,CommCtrl;
function FindProcessHnd(ProcessName:string):THandle;//方法是取得进程handle
var
FProHnd: THandle;
I: Integer;
ExeFile: string;
PE: TProcessEntry32;
begin
if FProHnd > 0 then CloseHandle(FProHnd);//这里不知为什么说我FProHnd
//没有初始化,
FProHnd:= CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if FProHnd = -1 then
raise Exception.Create('CreateToolHelp32Snapshot failed');
PE.dwSize := SizeOf(PE);
try
result:=0;
if Process32First(FProHnd, PE) then // 获取进程
repeat
if PE.szExeFile=ProcessName then//如果是输入的ProcessName就返回
begin //这个进程的handle
result:=FProHnd;
break;
end;
until not Process32Next(FProHnd, PE);
finally
closeHandle(FProHnd);
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
FHandle:THandle;
begin
FHandle:=FindProcessHnd(Edit1.Text);
Terminateprocess(FHandle, 0);//结束进程
end;
end.
希望各位给我更正一下
//没有初始化
局部变量没有赋过值,当然没有初始化,这个句柄还没有创建,不需要关闭,这行去掉result:=FProHnd;
怎能返回这个Handle?应该用OpenProcess打开PE.th32ProcessID
另外if FProHnd > 0 then CloseHandle(FProHnd);//我觉得是用来初始化,先把FProHnd清掉,后面可以用嘛。
还有,openprocess里面第一个参数DWORD dwDesiredAccess,是不是用PROCESS_ALL_ACCESS就可以代替下面PROCESS_CREATE_THREAD,PROCESS_TERMINATE等一堆参数?我只用了PROCESS_TERMINATE
FProHnd是局部变量,每次调用都重新分配它的存储空间
PROCESS_ALL_ACCESS表示所有访问权限:
PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $FFF);
包含下面所有项