我写了段程序找到进程名,然后把它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.
希望各位给我更正一下

解决方案 »

  1.   

    if FProHnd > 0 then CloseHandle(FProHnd);//这里不知为什么说我FProHnd
                                             //没有初始化
    局部变量没有赋过值,当然没有初始化,这个句柄还没有创建,不需要关闭,这行去掉result:=FProHnd;
    怎能返回这个Handle?应该用OpenProcess打开PE.th32ProcessID
      

  2.   

    谢谢, weimj() ,能行,不过还有个,问题,为什么不能直接返回handle,terminateprocess用的也是handle,这样不是能省点吗?
        另外if FProHnd > 0 then CloseHandle(FProHnd);//我觉得是用来初始化,先把FProHnd清掉,后面可以用嘛。
       还有,openprocess里面第一个参数DWORD dwDesiredAccess,是不是用PROCESS_ALL_ACCESS就可以代替下面PROCESS_CREATE_THREAD,PROCESS_TERMINATE等一堆参数?我只用了PROCESS_TERMINATE
      

  3.   

    FProHnd是进程快照的句柄,不是进程的句柄,当然是不行的
    FProHnd是局部变量,每次调用都重新分配它的存储空间
    PROCESS_ALL_ACCESS表示所有访问权限:
    PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $FFF);
    包含下面所有项