आपको 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;
जब यह सब किया गया तो सभी निष्पादन योग्य होने के बावजूद सभी बाल प्रक्रियाओं को स्वचालित रूप से समाप्त कर दिया जाएगा। आप जॉब्स एपीआई इकाई here प्राप्त कर सकते हैं। नोट: मैंने डेल्फी 7 के साथ इसका परीक्षण नहीं किया है।
संपादित करें: Here आप काम कर रहे डेमो प्रोजेक्ट को डाउनलोड कर सकते हैं।
बच्चे निष्पादन जब मुख्य निष्पादन बंद करने के लिए एक संदेश भेजने के लिए मुख्य निष्पादन प्राप्त करें। –
तब नहीं जब मुख्य निष्पादन योग्य मारे गए – ZigiZ
नौकरियां एक सुंदर समाधान प्रतीत होती हैं। इसके अलावा, आप पैरेंट प्रोसेस हैंडल का उत्तराधिकारी हो सकते हैं और इसे समाप्त होने पर संकेत दिया जा सकता है। – OnTheFly