Delphi 执行一个流程或创建一个流程,并设置关闭该流程的时间间隔

Delphi 执行一个流程或创建一个流程,并设置关闭该流程的时间间隔,delphi,winapi,createprocess,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(pchE

我想在没有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

我们如何解决这个问题

感谢

CreateProcess在tprocess信息记录中返回新进程的密码。您可以通过2分钟的超时将该句柄传递给WaitForSingleObject。如果超时已过,则可以将相同的句柄传递给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;

没有过程的优雅终止这样的事情。终止一个进程总是不礼貌的,而且带有极大的偏见。也许你最好的选择是将WM_CLOSE或WM_QUIT发布到进程中,并希望它能正确处理这些消息。选中此项:@MarkoPaunovic:不过,正在运行的应用程序没有GUI,因此没有向其发布消息的窗口。@RemyLebeau,这取决于具体情况。CMD.EXE报告关闭窗口,每个控制台应用程序都应响应Windows关闭/重新启动警报。因此,问题归结为受控应用程序是否存在缺陷或correct@XenKid优雅的终止需要合作。另一个进程为优雅的终止提供了什么机制?CMD是否有GUI?它可以优雅地关闭。那么那些大多没有GUI的Windows服务呢?@Arioch'CMD有一个关闭按钮,但使用它并不等于优雅地关闭,运行的程序会被中止。Windows服务应处理关闭命令,并且可以正常停止。Windows服务由SCM控制。使用SCM API而不是CreateProcess与服务交互。看看and和其他相关函数。@The_Fox我不是问运行程序,而是问CMD本身。您可以运行CMD脚本,当您单击该按钮时,CMD将优雅地请求取消脚本执行。此外,我认为像FAR、nFTP和其他目标控制台这样的程序也会以适当的方式做出关闭和关闭的反应。@RemyLebeau任何不带GUI的程序都无法正常关闭的说法有什么变化?这只是双方进行沟通的问题。GUI程序也可能有缺陷,就像文本UI一样忽略关闭请求。但这并不意味着GUI程序不能正常关闭,它只意味着一个特定的程序有缺陷。