2011-06-23 5 views
7

मैं कुछ प्रक्रिया में एक डीएलएल इंजेक्शन कर रहा हूं, डीएलएल में एक वर्कर थ्रेड है जो एक संदेश लूप चला रहा है।इंजेक्शन डीएलएल में वर्कर थ्रेड को ठीक से कैसे समाप्त करें?

मैं थ्रेड को ठीक से छोड़ना चाहता हूं यानी एक छोड़ संदेश (पोस्ट थ्रेड मैसेज) पोस्ट करें और इसके लिए प्रतीक्षा करें (WaitForSingleObject)।

मैं इस धागे को बंद करने के लिए कहां इंतजार कर सकता हूं? मैं इसे DLL_PROCESS_DETACH पर नहीं कर सकता क्योंकि तब तक सभी धागे बंद या समाप्त हो जाते हैं और मुझे नहीं पता कि प्रक्रिया कब बंद होने वाली है।

मेरा एकमात्र विचार था, क्या मुख्य धागा संदेश लूप को रोकने और WM_CLOSE \ DESTROY msgs के लिए देखने का कोई तरीका है?

मुझे किसी भी अन्य विचार \ समाधान सुनना अच्छा लगेगा।

संपादित करें:
मुख्य थ्रेड WH_CALLWNDPROC साथ SetWindowsHookEx का उपयोग कर हुक करने की कोशिश की, लेकिन यह काम किया नहीं था बहुत अच्छी तरह से, मैं हुक और धागे के संदेशों को प्राप्त करने में कामयाब रहे। हालांकि, मुझे केवल WM_DESTROY और WM_NCDESTROY WM_QUIT संदेश प्राप्त नहीं हुआ था और वे सभी विंडोज़ से जुड़े थे।

धन्यवाद,
ओमर

उत्तर

3

आप पर कुछ कार्रवाई करने के लिए की जरूरत है "के बारे में-से-बंद" आप WH_CALLWNDPROC साथ SetWindowsHookEx का उपयोग कर मुख्य थ्रेड हुक और WM_CLOSE के लिए देखने के लिए और कार्रवाई करने की जरूरत/संकेत बंद करने के लिए धागा।

+0

धन्यवाद, कोशिश कर रहा है, ठीक वैसे ही लगता है जो मैं देख रहा हूं :) – Omer

+0

यह काफी अच्छा काम नहीं करता है, मैं थ्रेड के संदेशों को हुक और प्राप्त करने में कामयाब हूं। हालांकि, मुझे केवल WM_DESTROY और WM_NCDESTROY WM_QUIT संदेश प्राप्त नहीं होता है और वे सभी विंडोज़ से जुड़े हुए हैं। – Omer

+0

WM_QUIT के बारे में जागरूक होने के लिए, WH_CALLWNDPROC गलत प्रकार का हुक उपयोग करने के लिए है (क्योंकि विंडो प्रक्रिया को WM_QUIT के साथ नहीं कहा जा रहा है)। WM_QUIT के बारे में जागरूक होने के लिए आपको WH_GETMESSAGE हुक का उपयोग करने की आवश्यकता है। –

4

प्रक्रिया में कोई संकेत नहीं है कि धागा मौजूद है, यह परवाह नहीं करेगा कि यह अच्छी तरह से बाहर निकलता है या नहीं। वास्तव में, अगर यह प्रोग्राम लिखा गया था, तो इसे समाप्त कर दिया जाएगा, सी, इसकी रनटाइम लाइब्रेरी टर्मिनेट प्रोसेस को कॉल करती है जब इसकी मुख्य() विधि निकलती है। हरिकिरी शैली।

यदि आप बाहरी थ्रेड के बारे में परवाह करते हैं, तो आपने जो प्रोग्राम लिखा है वह थ्रेड की निगरानी कर रहा है, तो आपको बाहर निकलने पर एक ब्रेडक्रंब छोड़ने की आवश्यकता है। या तो नामित पाइप की तरह, जो भी प्रक्रिया इंटरऑप तंत्र का उपयोग करते हैं, उसके साथ आपके प्रोग्राम में संचार करके। या एक नामित घटना सेट करके। सुनिश्चित करें कि आप हरिकिरी परिदृश्य से निपटें, आप यह भी जांचना चाहेंगे कि प्रक्रिया संभालने से संकेत मिलता है कि यह समाप्त हो गया है।

+0

धन्यवाद लेकिन मुझे आंतरिक रूप से इसकी देखभाल करने की आवश्यकता है, मैं cprogrammer का समाधान करने की कोशिश करूंगा। – Omer

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