Вам нужно использовать заданий . Главный исполняемый файл должен создать объект задания , тогда вам нужно установить 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 здесь . Примечание: я не проверял это с Delphi 7.
РЕДАКТИРОВАТЬ: Здесь вы можете скачать рабочий демонстрационный проект.