मुझे लगता है कि मुझे इस सवाल पर थोड़ी देर हो गई है, लेकिन मैं किसी को भी उसी समस्या के लिए कुछ भी लिखूंगा। यह वही उत्तर है जैसा मैंने इस प्रश्न को दिया था ।
मेरी समस्या यह थी कि मैं अपने आवेदन को जीयूआई अनुप्रयोग बनाना चाहूंगा लेकिन निष्पादित प्रक्रियाओं को पृष्ठभूमि में बिना किसी संवादात्मक कंसोल विंडो के चलाया जाना चाहिए। मुझे लगता है कि यह समाधान तब भी काम करना चाहिए जब मूल प्रक्रिया कंसोल प्रक्रिया हो। हालाँकि आपको "CREATE_NO_WINDOW" झंडे को हटाना पड़ सकता है।
मैं एक आवरण एप्लिकेशन के साथ GenerateConsoleCtrlEvent () का उपयोग करके इसे हल करने में कामयाब रहा । मुश्किल हिस्सा सिर्फ इतना है कि प्रलेखन वास्तव में बिल्कुल स्पष्ट नहीं है कि इसका उपयोग कैसे किया जा सकता है और इसके साथ नुकसान हो सकता है।
मेरा समाधान यहाँ वर्णित है पर आधारित है । लेकिन यह वास्तव में या तो एक त्रुटि के साथ सभी विवरणों की व्याख्या नहीं करता है, इसलिए यहां यह विवरण है कि इसे कैसे काम करना है।
एक नया सहायक एप्लिकेशन "Helper.exe" बनाएं। यह एप्लिकेशन आपके एप्लिकेशन (पैरेंट) और उस बच्चे की प्रक्रिया के बीच बैठेगा जिसे आप बंद करने में सक्षम होना चाहते हैं। यह वास्तविक बाल प्रक्रिया भी बनाएगा। आपके पास यह "मध्यम पुरुष" प्रक्रिया होनी चाहिए या GenerateConsoleCtrlEvent () विफल हो जाएगी।
माता-पिता से हेल्पर प्रक्रिया तक संचार करने के लिए किसी प्रकार के आईपीसी तंत्र का उपयोग करें कि सहायक बच्चे की प्रक्रिया को बंद कर दे। जब सहायक को यह घटना मिलती है, तो वह "GenerateConsoleCtrlEvent (CTRL_BREAK, 0)" को कॉल करता है जो स्वयं और बच्चे की प्रक्रिया को बंद कर देता है। मैंने स्वयं इसके लिए एक ईवेंट ऑब्जेक्ट का उपयोग किया, जिसे माता-पिता तब पूरा करते हैं जब वह बच्चे की प्रक्रिया को रद्द करना चाहता है।
अपना Helper.exe बनाने के लिए इसे CREATE_NO_WINDOW और CREATE_NEW_PROCESS_GROUP के साथ बनाएं। और जब बच्चे की प्रक्रिया बनाते हैं तो इसे बिना झंडे (0) के साथ बनाते हैं, जिसका अर्थ है कि यह अपने माता-पिता से सांत्वना प्राप्त करेगा। ऐसा करने में विफल होने से यह घटना को अनदेखा कर देगा।
यह बहुत महत्वपूर्ण है कि प्रत्येक चरण इस तरह से किया जाता है। मैं सभी प्रकार के संयोजनों की कोशिश कर रहा हूं, लेकिन यह संयोजन केवल एक ही है जो काम करता है। आप CTRL_C ईवेंट नहीं भेज सकते हैं। यह सफलता लौटाएगा लेकिन इस प्रक्रिया को नजरअंदाज कर दिया जाएगा। CTRL_BREAK केवल वही है जो काम करता है। वास्तव में कोई फर्क नहीं पड़ता क्योंकि वे दोनों एक्सिटप्रोसेस () को अंत में कहेंगे।
आप GenerateConsoleCtrlEvent () को चाइल्ड प्रोसेस आईडी के प्रोसेस ग्रुप आईडी के साथ सीधे हेल्पर प्रक्रिया को जारी रखने की अनुमति नहीं दे सकते। यह भी विफल हो जाएगा।
मैंने पूरा दिन इस काम में लगा दिया। यह समाधान मेरे लिए काम करता है लेकिन अगर किसी के पास कृपया जोड़ने के लिए कुछ और है। मैं सभी समान समस्याओं वाले बहुत से लोगों को खोजने के लिए नेट पर गया था लेकिन समस्या का कोई निश्चित समाधान नहीं था। GenerateConsoleCtrlEvent () कैसे काम करता है यह भी थोड़ा अजीब है, अगर किसी को इस पर अधिक जानकारी पता है तो कृपया साझा करें।
jstack
इस विशिष्ट मामले के बदले मज़बूती से इस्तेमाल किया जा सकता है: stackoverflow.com/a/47723393/603516