我想执行一个没有 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()
返回TProcessInformation
记录中新进程的THandle
。 可以将该句柄传递给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;