执行进程或创建进程并设置时间间隔以关闭它

时间:2014-01-02 03:14:35

标签: delphi winapi createprocess

我想在没有gui窗口的情况下执行带参数的应用程序,然后在2分钟内优雅地自动结束处理。

这就是我使用代码的方式:

procedure ExecNoWait(Filename: string);
var
   bchExec: array[0..1024] of char;
   pchEXEC: Pchar;
   si: TStartupInfo;
   pi: TProcessInformation;
begin
   pchExec := @bchExec;
   StrPCopy(pchExec,Filename);
   FillChar(si,sizeof(si),0);
   FillChar(pi,sizeof(pi),0);
   si.dwFlags:=STARTF_USESHOWWINDOW;
   si.wShowWindow:=SW_HIDE;
   si.cb := sizeof(si);
   CreateProcess(Nil,pchExec,Nil,Nil,false,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, Nil,Nil,si,pi);
end;


ExecNoWait(TheExeFilePath + '\ThisExe.exe -runnow'); //NON-GUI App

但我希望在2分钟内自动结束或自动关闭ThisExe.exe。

我们如何解决这个问题?

感谢

1 个答案:

答案 0 :(得分:3)

CreateProcess()会向THandle记录中的新流程返回TProcessInformation。您可以将该句柄传递给WaitForSingleObject()超时2分钟。如果超时过去,您可以将相同的句柄传递给TerminateProcess()(因为没有涉及GUI,没有“正常”终止的选项),例如:

var
  bchExec: string;
  si: TStartupInfo;
  pi: TProcessInformation;
begin
  bchExec := Filename;
  UniqueString(bchExec);
  FillChar(si, sizeof(si), 0);
  FillChar(pi, sizeof(pi), 0);
  si.cb := sizeof(si);
  si.dwFlags := STARTF_USESHOWWINDOW;
  si.wShowWindow := SW_HIDE;
  if CreateProcess(nil, PChar(bchExec), nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi) then
  begin
    CloseHandle(pi.hThread);
    if WaitForSingleObject(pi.hProcess, 120000) = WAIT_TIMEOUT then
      TerminateProcess(pi.hProcess, 666);
    CloseHandle(pi.hProcess);
  end;
end;