2010-01-29 7 views
6

क्लिपबोर्ड में डेटा पेस्ट करने के लिए Win32 में मुझे GlobalAlloc() पर कॉल करना होगा, फिर GlobalLock() पॉइंटर प्राप्त करने के लिए, फिर डेटा कॉपी करें, फिर GlobalUnlock() और SetClipboardData() पर कॉल करें।यदि मैं ग्लोबल लॉक() को कॉल करता हूं तो क्या होता है, फिर GlobalUnlock() को कॉल करने में विफल रहता है?

कोड सी में है, तो ++ एक अपवाद GlobalLock() और GlobalUnlock() के लिए कॉल के बीच फेंक दिया जा सकता है और अगर मैं इस GlobalUnlock() की देखभाल नहीं करते बुलाया नहीं किया जाएगा।

यह एक समस्या है? अगर मैं GlobalLock() पर कॉल करता हूं और किसी भी कारण से जोड़ी GlobalUnlock() कॉल को छोड़ देता है तो क्या होगा?

उत्तर

9

प्रश्न केवल तभी नहीं है जब आप GlobalUnlock() पर कॉल न करें। आपको GlobalUnlock() और GlobalFree() पर कॉल करना होगा। आपके द्वारा आवंटित स्मृति को जारी करने के लिए दोनों को कॉल किया जाना चाहिए:

HGLOBAL hdl = NULL; 
void *ptr = NULL 

    try { 
    hdl = GlobalAlloc(); 
    ptr = GlobalLock(hdl); 

    // etc... 
    GlobalUnlock(hdl); 
    ptr = NULL; 
    SetClipboardData(..., hdl); 
    } 
    catch (...) { 
    if(ptr) 
     GlobalUnlock(hdl); 
    if(hdl) 
     GlobalFree(hdl); 
    throw; 
    } 

रिसाव आवेदन व्यापक होगा। जब आप एक विंडोज़ अनुप्रयोग से बाहर निकलते हैं, तो सभी आवंटित निजी मेमोरी स्वचालित रूप से

+1

नहीं है, ग्लोबलफ्री() को क्लिपबोर्ड पर चिपकाया जाने वाला नहीं कहा जाना चाहिए - स्वामित्व क्लिपबोर्ड पर पास हो गया है और यह बाद में स्मृति जारी करेगा। – sharptooth

+1

हाँ आप सही हैं, अगर SetClipboardData को कॉल सफलतापूर्वक बनाया गया है। लेकिन अन्यथा, आपको दोनों को कॉल करना होगा। पोस्ट तदनुसार संशोधित। –

9

से अधिक आप कभी भी पता करने के लिए (वास्तव में) के बारे में GlobalLock(), रेमंड चेन के सौजन्य से चाहता था:

मैं इस समुदाय विकी को चिह्नित कर रहा हूं क्योंकि मुझे वास्तव में पता नहीं है कि ये लेख आपके प्रश्न का उत्तर देते हैं या नहीं। लेकिन वे शायद कम से कम एक स्कीम के माध्यम से wading के लायक हैं।

अपवादों के मुकाबले ग्लोबल अनलॉक() से निपटने की आपकी समस्या को संभालने का एक तरीका है GlobalLock()/GlobalUnlock() कॉल प्रबंधित करने के लिए आरएआईआई कक्षा का उपयोग करना।

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

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