我用CreateProcess()创建一个进程,在任务管理器中可以看到,我应该怎样关闭它?
var
processinfor:Tprocessinformation;
....
begin
CreateProcess(nil,
             pchar('cmd'),
             @security,
             @security,
             true,
             normal_priority_class,
             nil,
             nil,
             start,
             processinfor);end;
我用
closehandle(processinfor.hProcess);
closehandle(processinfor.hThread );
但是没有用.在windows2000的任务管理器中仍能看到cmd.exe.
请问怎样关闭它?谢谢!

解决方案 »

  1.   

    回复:
    TerminateProcess('目标进程句柄, 0(这个参数一般都为0,你也可以用GetExitCodeProcess来取得它的退出码)),
    TerminateProcess原型:
    BOOL TerminateProcess(
        HANDLE hProcess, // handle to the process 
        UINT uExitCode // exit code for the process  
       ); 
      

  2.   

    这个函数可行
    function TFrmServerMain.KillProcess(ProcName: string): boolean;
    var   lppe:   TProcessEntry32;
              ssHandle:   THandle;
              AppFound:   Boolean;
    begin
          ssHandle   :=   CreateToolHelp32SnapShot(TH32CS_SNAPALL,   0);
          lppe.dwSize   :=   SizeOf(lppe);
          AppFound   :=   Process32First(sshandle,   lppe);
          while   AppFound   do
          begin
              if   UpperCase(ExtractFileName(lppe.szExeFile))=UpperCase(ProcName)   then
              begin
                  TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),
                  lppe.th32ProcessID), 0);
                  result:=true;
                  CloseHandle(ssHandle);
                  exit;
              end;
              AppFound   :=   Process32Next(ssHandle,   lppe);
          end;
          result:=false;
          CloseHandle(ssHandle);
    end;
      

  3.   

    china618(▲▲▲▲▲差一千分)
    以上的代码只对RING3有效.
      

  4.   

    给你一个函数,使用前 Uses TLHelp32;
    使用比较简单 比如  killtask('qq.exe');
    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;
      

  5.   

    myvip(小刘)的答案眼熟,应该是对的