gpt4 book ai didi

delphi - 如何根据其父进程创建子进程?

转载 作者:行者123 更新时间:2023-12-03 14:46:09 32 4
gpt4 key购买 nike

我的应用程序 (ma​​in.exe) 正在使用 ShellExecuteEx 执行子进程 (child.exe)。

但是当我关闭或终止(通过 Process-Explorer)ma​​in.exe 时,子进程仍然处于事件状态。

ma​​in.exe 终止 child.exe 也终止时,如何优雅地处理这个问题?

最佳答案

您需要使用jobs 。主要可执行文件应该 create a job object ,那么您需要set您的作业对象的 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 标志。

uses
JobsApi;
//...
var
jLimit: TJobObjectExtendedLimitInformation;

hJob := CreateJobObject(nil, PChar('JobName');
if hJob <> 0 then
begin
jLimit.BasicLimitInformation.LimitFlags := JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, @jLimit,
SizeOf(TJobObjectExtendedLimitInformation));
end;

然后你需要用 CreateProcess 执行另一个进程函数,其中 dwCreationFlags 必须设置为 CREATE_BREAKAWAY_FROM_JOB。如果此函数成功,请调用AssignProcessToJobObject

function ExecuteProcess(const EXE : String; const AParams: string = ''; AJob: Boolean = True): THandle;
var
SI : TStartupInfo;
PI : TProcessInformation;
AFlag: Cardinal;
begin
Result := INVALID_HANDLE_VALUE;
FillChar(SI,SizeOf(SI),0);
SI.cb := SizeOf(SI);

if AJob then
AFlag := CREATE_BREAKAWAY_FROM_JOB
else
AFlag := 0;


if CreateProcess(
nil,
PChar(EXE + ' ' + AParams),
nil,
nil,
False,
AFlag,
nil,
nil,
SI,
PI
) then
begin
{ close thread handle }
CloseHandle(PI.hThread);
Result := PI.hProcess;
end;
end;
//...
hApp := ExecuteProcess('PathToExecutable');

if hApp <> INVALID_HANDLE_VALUE then
begin
AssignProcessToJobObject(hJob, hApp);
end;

当所有这些完成后,即使主可执行文件已被终止,所有子进程也将自动终止。您可以获取JobsApi单元here 。注意:我还没有使用 Delphi 7 对其进行测试。

编辑:Here您可以下载工作演示项目。

关于delphi - 如何根据其父进程创建子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8822152/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com