2012-01-11 13 views
7

मेरा आवेदन (main.exe) ShellExecuteEx का उपयोग कर एक चाइल्ड प्रक्रिया (child.exe) निष्पादित कर रहा है।इसके माता-पिता के आधार पर बाल प्रक्रिया कैसे बनाएं?

लेकिन जब मैं बंद करता हूं या मारता हूं (प्रोसेस-एक्सप्लोरर के माध्यम से) main.exe बाल प्रक्रिया सक्रिय रहती है।

कैसे शान से कि संभाल करने के लिए, जब main.exe समाप्त हो जाता है child.exe भी समाप्त हो जाता है?

+0

बच्चे निष्पादन जब मुख्य निष्पादन बंद करने के लिए एक संदेश भेजने के लिए मुख्य निष्पादन प्राप्त करें। –

+1

तब नहीं जब मुख्य निष्पादन योग्य मारे गए – ZigiZ

+1

नौकरियां एक सुंदर समाधान प्रतीत होती हैं। इसके अलावा, आप पैरेंट प्रोसेस हैंडल का उत्तराधिकारी हो सकते हैं और इसे समाप्त होने पर संकेत दिया जा सकता है। – OnTheFly

उत्तर

13

आपको 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 समारोह जहां dwCreationFlagsCREATE_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 आप काम कर रहे डेमो प्रोजेक्ट को डाउनलोड कर सकते हैं।

+0

मैंने आपके कोड का परीक्षण किया है। मैंने अपने फॉर्म बनाने पर 'CreateJobObject' का उपयोग किया। 'ExecuteProcess' के लिए एक बटन जोड़ा गया। बाल प्रक्रिया ठीक चलती है, 'AssignProcessToJobObject' सही लौटाता है। लेकिन जब मैं अपना मूल आवेदन बंद करता हूं तो बच्चा प्रक्रिया जीवित बनी हुई है। – ZigiZ

+0

@ zigi70 शायद आप कुछ गलत कर रहे हैं। हम इस तकनीक का सफलतापूर्वक हमारे बहु-मॉड्यूलर सॉफ्टवेयर में उपयोग कर रहे हैं।मैंने अपना जवाब संपादित कर लिया है और मेरे कामकाजी डेमो परियोजना स्रोत कोड लिंक को शामिल किया है। – Linas

+0

मैंने अपनी परियोजना [यहां] अपलोड की है (http://www.4shared.com/zip/1yveHVAO/Jobs.html)। क्या आप एक नज़र डालने के लिए बहुत दयालु होंगे। – ZigiZ

3

Job Objects का उपयोग करने का प्रयास करें, इन कार्यों को CreateJobObject और AssignProcessToJobObject देखें।

एक नौकरी वस्तु प्रक्रियाओं के समूह को एक इकाई के रूप में प्रबंधित करने की अनुमति देती है। नौकरी ऑब्जेक्ट्स नामनीय, सुरक्षित, साझा करने योग्य ऑब्जेक्ट्स हैं जो उनके साथ जुड़े प्रक्रियाओं के गुणों को नियंत्रित करते हैं। नौकरी ऑब्जेक्ट पर ऑपरेशंस ने जॉब ऑब्जेक्ट से जुड़े सभी प्रक्रियाओं को प्रभावित किया है। उदाहरणों में कार्य सेट आकार और प्रक्रिया प्राथमिकता या नौकरी से संबंधित सभी प्रक्रियाओं को समाप्त करने जैसी प्रक्रियाओं को लागू करना शामिल है।

0

मुझे लगता है, यह बहुत अच्छा कोड है। यह मेरे लिए काम कर रहा है, लेकिन मैं SW_SHOW/SW_HIDE जैसी बाल प्रक्रियाओं के लिए शो विंडो फ्लैग सेट करने में सक्षम होने के लिए कुछ बदलाव जोड़ता हूं।

...

function ExecuteProcess(const EXE : String; const AParams: string = ''; 
    const nCmdShow: Integer = SW_SHOW; 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); 
    SI.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; 
    SI.wShowWindow := nCmdShow; 

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

...

संबंधित मुद्दे