2008-12-26 9 views
14

CoTaskMemAlloc का उपयोग करना उचित कब है? क्या कोई उदाहरण दे सकता है?CoTaskMemAlloc का उपयोग?

+0

मैं जब आप CoTaskMemAlloc उपयोग करने के लिए आवश्यकता हो सकती है पर नीचे कुछ जानकारी पोस्ट किया है, लेकिन आप प्रदान करने के लिए के लिए यह उपयोगी हो सकता है आपके प्रश्न के लिए कुछ संदर्भ ... – reuben

+0

प्रश्न को ठीक किया गया और यह शीर्षक थोड़ा सा है। – mmcdole

उत्तर

10

हे भगवान, मैं के लिए सोचने के लिए किया था इसके लिए थोड़ी देर - मैंने एटीएल के साथ छोटे पैमाने पर COM प्रोग्रामिंग की उचित मात्रा में काम किया है और शायद ही कभी इसका इस्तेमाल करना पड़ा है।

एक स्थिति है हालांकि यह दिमाग में आता है: Windows Shell extensions। यदि आप फाइल सिस्टम ऑब्जेक्ट्स के सेट से निपट रहे हैं तो आपको PIDLs (आईडी आईडी में पॉइंटर) से निपटना पड़ सकता है। ये विचित्र छोटी फाइल सिस्टम ऑब्जेक्ट अबास्ट्रक्शन हैं और उन्हें CoTaskMemAlloc जैसे COM-aware आवंटक का उपयोग करके स्पष्ट रूप से आवंटित/हटा दिया जाना चाहिए। SHGetMalloc (बहिष्कृत) या CoGetMalloc से प्राप्त IMalloc इंटरफ़ेस पॉइंटर भी वैकल्पिक है, यह उपयोग करने के लिए केवल एक अमूर्त परत है, ताकि आपका कोड किसी विशिष्ट मेमोरी आवंटक से बंधे न हो और किसी भी उपयुक्त का उपयोग कर सके।

बजाय malloc()CoTaskMemAlloc या IMalloc का उपयोग करने का मुद्दा यह है कि स्मृति आवंटन/आवंटन रद्द करने, कुछ ऐसा है जो कि "COM-संवेदी" ताकि उसके आवंटन और आवंटन रद्द करने रन-टाइम में लगातार प्रदर्शन कर रहे हैं की जरूरत है भी आवंटन करता है, तो है और डीलोकेशन पूरी तरह से असंबंधित कोड द्वारा किया जाता है (उदाहरण के लिए विंडोज मेमोरी आवंटित करता है, इसे आपके सी ++ कोड में स्थानांतरित करता है जो बाद में डिलीकेट करता है, या आपका सी ++ कोड आवंटित करता है, इसे किसी और के वीबी कोड में स्थानांतरित करता है जो बाद में विलुप्त हो जाता है)। न तो malloc() और न ही new सिस्टम के रन-टाइम ढेर के साथ अंतःक्रिया करने में सक्षम हैं ताकि आप अन्य COM ऑब्जेक्ट्स में स्थानांतरित करने के लिए स्मृति आवंटित करने के लिए या अन्य COM ऑब्जेक्ट्स से स्मृति प्राप्त करने और डिलीकेट करने के लिए उनका उपयोग नहीं कर सकें।

7

This MSDN article Co32askMemAlloc सहित Win32 द्वारा उजागर किए गए विभिन्न आवंटकों की तुलना करता है। यह मुख्य रूप से COM प्रोग्रामिंग में उपयोग किया जाता है - सबसे विशेष रूप से जब एक COM सर्वर के कार्यान्वयन को क्लाइंट पर वापस लौटने के लिए स्मृति आवंटित करने की आवश्यकता होती है। यदि आप COM सर्वर नहीं लिख रहे हैं, तो आपको शायद इसका उपयोग करने की आवश्यकता नहीं है।

(हालांकि, अगर आप कोड है कि CoTaskMemAlloc का उपयोग कर स्मृति आवंटित करता है और इसे वापस देता है आप के लिए कहते हैं, आप वापस आ आवंटन (रों) CoTaskMemFree का उपयोग कर मुक्त करने की आवश्यकता होगी।)

+0

धन्यवाद रूबेन, मेरी आवश्यकता कॉमसेवर से प्रक्रिया में स्मृति आवंटित करना है -> कॉमक्लिएंट पक्ष से उसी पर एक पुनर्विक्रय करें जो फिर से एक अलग प्रक्रिया है और फिर इसे कॉमर्सवर पक्ष से मुक्त करें ... मुझे आशा है कि मैं कर सकता हूं इसे प्राप्त करने के लिए cotaskmemxxx fns का उपयोग करें - – atVelu

2

CoTaskMemAlloc malloc के समान है, सिवाय इसके कि पूर्व को स्मृति आवंटित करने के लिए उपयोग किया जाता है जो प्रक्रिया सीमाओं में उपयोग किया जाता है।

यानी, यदि हमारे पास दो प्रक्रियाएं हैं, प्रक्रिया 1 और प्रक्रिया 2, मान लें कि प्रक्रिया 1 एक COM सर्वर है, और process2 एक COM क्लाइंट है जो प्रक्रिया 1 द्वारा प्रकट इंटरफेस का उपयोग करता है। यदि प्रक्रिया 1 को कुछ डेटा भेजना है, तो वह स्मृति आवंटित करने और डेटा की प्रतिलिपि बनाने के लिए CoTaskMemAlloc का उपयोग करके स्मृति आवंटित कर सकता है। उस स्मृति स्थान को प्रक्रिया 2 द्वारा उपयोग किया जा सकता है।

COM लाइब्रेरी स्वचालित रूप से marshalling और unmarshalling करता है।

18

एक देशी सी ++ लाइब्रेरी से .NET को स्ट्रिंग के रूप में char * लौटने पर CoTaskMemAlloc का उपयोग करें।

सी #

[DllImport("test.dll", CharSet=CharSet.Ansi)] 
extern static string Foo(); 

सी

char* Foo() 
{ 
    std::string response("response"); 
    int len = response.length() + 1; 
    char* buff = (char*) CoTaskMemAlloc(len); 
    strcpy_s(buff, len, response.c_str()); 
    return buff; 
} 

Since .NET uses CoTaskMemFree, तो आप इस तरह स्ट्रिंग आवंटित करने के लिए है, तो आप यह ढेर या ढेर का उपयोग कर malloc/नई पर आवंटित नहीं कर सकता।

+0

'Foo()' द्वारा वापस संसाधन कब लौटाया जाता है? या इसे मैन्युअल रूप से किया जाना चाहिए? –

+0

@CheeltenBrinke सीएलआर अन्य सभी प्रबंधित संसाधनों के लिए संसाधन के लिए एक ही जीसी नियमों का पालन करेगा। – zz3599

+0

@ zz3599 इसका क्या अर्थ है? सीएलआर को उस स्मृति के सभी संदर्भों को जानने की जरूरत है। लेकिन CoTaskMemAlloc को कॉल करने के बिंदु पर हम अभी भी अप्रबंधित कोड में हैं, इसलिए जहां तक ​​सीएलआर जानता है कि उस स्मृति का कोई संदर्भ नहीं है। लेकिन इसका मतलब यह होगा कि उस स्मृति को आवंटित करने के ठीक बाद उसे एकत्र किया जा सकता है, जो मुझे लगता है कि यह मामला नहीं है, क्योंकि यह इस उदाहरण को अमान्य प्रस्तुत करेगा। प्रश्न यह है कि यह तब कैसे काम करता है? –

3

वहाँ वास्तव में बहुत ही निम्न कॉल सभी एक ही आवंटन के साथ खत्म हो जो गलत हो सकता है नहीं है:

CoTaskMemAlloc/SHAlloc -> IMalloc.Alloc -> GlobalAlloc(GMEM_FIXED) 

केवल यदि आप गैर-खिड़कियां (संकलक पुस्तकालय) का उपयोग कॉल malloc() बातें जाना होगा की तरह गलत।

आधिकारिक तौर पर एक CoTaskMemAlloc का उपयोग करना चाहिए COM कॉल के लिए (एक FORMATETC.ptd क्षेत्र का आवंटन) की तरह CoTaskMemAlloc के बराबर होती है

कि GlobalAlloc() इस तरह से रहना होगा 'जब तक अनंत काल बनाम कॉम STGMEDIUM क्लिपबोर्ड एपीआई पर देखा जाता है। STGMEDIUM क्लिपबोर्ड संरचनाओं और विधि का उपयोग करता है और जब तक STGMEDIUM कॉम CoTaskMemAlloc है और इस तरह, क्लिपबोर्ड apis लिख GlobalAlloc()

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