我想在没有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。
我们如何解决这个问题?
感谢
答案 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;