2009-10-01 16 views
12
msdn के अनुसार

, जब मैं CWnd :: FromHandle के साथ एक CWnd * मिलता है,CWnd :: FromHandle से प्राप्त सीडब्ल्यूएनडी का जीवनकाल क्या है?

सूचक अस्थायी हो सकता है और बाद में उपयोग के लिए भंडारित नहीं किया जाना चाहिए।

"बाद में उपयोग" का क्या मतलब है मुझे स्पष्ट नहीं है। क्या यह केवल वर्तमान विधि का दायरा है? जहां तक ​​मुझे पता है, Win32 में कोई जीसी नहीं है!

उत्तर

15

एमएफसी एचडब्ल्यूएनडी से सीडब्ल्यूएनडी, एचडीसी से सीडीसी आदि तक कई हैंडल मैप्स बनाए रखता है, जो थ्रेड राज्य में संग्रहीत हैं। प्रत्येक हैंडल मानचित्र में एक स्थायी नक्शा और अस्थायी नक्शा होता है - जब आप CWnd :: Create या CDC :: Attach जैसे किसी विधि को कॉल करते हैं तो स्थायी प्रविष्टियां जोड़ दी जाती हैं, जबकि अस्थायी प्रविष्टियां तब बनाई जाती हैं जब आप एक हैंडल पर FromHandle को कॉल करते हैं जिसमें कोई नहीं है स्थायी प्रवेश

अस्थायी प्रविष्टियां निष्क्रिय प्रक्रिया (CWinApp :: OnIdle में) के दौरान साफ़ की जाती हैं, ताकि वे वर्तमान संदेश को संसाधित करते समय सुरक्षित रूप से उपयोग किए जा सकें। जैसे ही आप संदेश लूप पर वापस आते हैं, या एक और मोडल पाश दर्ज करें (उदा। DoModal को कॉल करके) तो उन्हें हटाया जा सकता है।

+0

क्या इसका मतलब यह है कि आप (संभवतः अस्थायी) सीडब्ल्यूएनडी से एचडब्ल्यूएनडी प्राप्त कर सकते हैं और इसके बजाय स्टोर कर सकते हैं? फिर, बाद में जब आवश्यक हो, तो आप CWnd प्राप्त करने के लिए संग्रहीत HWND का उपयोग करके FromHandle को कॉल कर सकते हैं। – Steg

+2

हां, यह ठीक होगा, एचडब्ल्यूएनडी खिड़की के जीवनकाल के लिए मान्य होगा। –

+0

उत्कृष्ट, चीयर्स फिल – Steg

0

ही MSDN वर्णन के आधार पर, मैं ग्रहण करेंगे मतलब है कि यह है कि एक वस्तु के रूप में प्रदान करता है, तो कोई CWnd hWnd से जुड़ा हुआ है, यह एक अस्थायी CWnd जो शायद एक बार कुछ नष्ट हो जाता है पैदा करेगा दायरे से बाहर चला जाता है, या एक कहीं और विनाशक को बुलाया जाता है, या सीडब्ल्यूएनडी स्पष्ट रूप से एचडब्ल्यूएनडी के लिए प्रश्न में बनाया गया है। तो यदि आपके पास पहले से ही एक सीडब्ल्यूएनडी बनाया गया है, तो आपको ठीक होना चाहिए, अन्यथा आपको प्राप्त होने वाले पॉइंटर को संग्रहीत करने के लिए आपको बहुत सावधान रहना होगा।

0

आम तौर पर वे केवल आप चाहते हैं कि आप इस फ़ंक्शन के दायरे में इस हैंडल का उपयोग करें। और इसे कक्षा के क्षेत्र के रूप में स्टोर न करें जहां आप इसे अपने ऑब्जेक्ट के जीवन के माध्यम से संदर्भित करते हैं।

+0

ऐसा नहीं है कि ज्यादा, जबकि एक ही संदेश मुझे लगता है कि प्रसंस्करण के रूप में कार्य के दायरे। – EFraim

1

FromHandle मूल रूप से पहले से मौजूद विंडो ऑब्जेक्ट का क्षणिक संदर्भ प्राप्त करने के लिए उपयोग किया जाता है। एमएफसी इन संदर्भों को एक आंतरिक संरचना में संग्रहीत करता है जिसे अस्थायी हैंडल मैप कहा जाता है (एक हैंडल मैप एमएफसी द्वारा उपयोग की जाने वाली एमएफसी सीडब्ल्यूएनडी ऑब्जेक्ट्स के लिए एमएफसी द्वारा उपयोग की जाने वाली एमएफसी सीडब्ल्यूएनडी ऑब्जेक्ट्स का एक मानचित्र है जो एमएफसी ऑब्जेक्ट से संबंधित वास्तविक विंडोज विंडो में हेरफेर करने के लिए Win32 कॉल करता है)। इस संरचना में सभी सीमाओं से आगे बढ़ने से वस्तुओं की संख्या से बचने के लिए, एमएफसी के निष्क्रिय लूप प्रोसेसिंग के दौरान हैंडल मैप से आइटम हटा दिए जाते हैं।

जैसा कि आपने अनुमान लगाया होगा, एक स्थायी हैंडल मैप भी है जिसमें यह स्वचालित साफ-सफाई व्यवहार नहीं होगा। यदि आपको एक सीडब्ल्यूएनडी ऑब्जेक्ट प्राप्त करने की आवश्यकता है जो अस्थायी हैंडल मैप में अपना एचडब्ल्यूएनडी संदर्भ नहीं डालता है तो आप FromHandlePermanent() को कॉल कर सकते हैं।

-Ron