2012-09-21 16 views
5

मैं कुछ विरासत सी के माध्यम से जा रहा हूँ ++ विंडोज इमेजिंग घटक पुस्तकालय के साथ काम कर कोड के साथ एक समारोह के लिए एक CComPtr पासिंग और मैं इस मनाया:एक कच्चे सूचक प्रोटोटाइप

void setProperties(IPropertyBag2* const pBag) 
{ 
    pBag->Write(...); 
} 

void other_function() 
{ 
    CComPtr<IPropertyBag2> pBag; 
    //Code to initialize pBag 
    setProperties(pBag); 
} 

setProperties विधि बस का एक समूह लिखते हैं संपत्ति बैग के लिए गुण। कोड संकलित करता है और ठीक चलाता है क्योंकि मुझे लगता है कि यह उपयुक्त टाइपकास्टिंग ऑपरेटर को कॉल करता है।

मेरा सवाल यह है कि क्या इस तरह के एक इंटरफेस की सिफारिश की जाती है या सूचक को पास करने का एक बेहतर तरीका है। उदाहरण के लिए, वहाँ कोई अंतर (सुरक्षा/प्रदर्शन के संदर्भ में) है अगर हस्ताक्षर में बदल गया था:

void setProperties(const CComPtr<IPropertyBag2>& pBag) 

उत्तर

2

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

कोई भी COM सूचक, यहां तक ​​कि एक गूंगा व्यक्ति स्वचालित रूप से एक स्मार्ट सूचक है क्योंकि ऑब्जेक्ट स्वयं AddRef और Release लागू करता है। यदि फ़ंक्शन पॉइंटर की एक प्रति नहीं रख रहा है तो इसके बारे में चिंता करने की कोई आवश्यकता नहीं है।

सीसीओएमपीआरटी प्रकार स्वचालित रूप से सुविधा के लिए कच्चे सूचक में स्वयं को डालेगा।

+3

एक CComPtr पैरामीटर का उपयोग करने से आप हमेशा CComPtr का उपयोग करने के लिए बाध्य नहीं होंगे, क्योंकि CComPtr रचनाकार स्पष्ट नहीं हैं। और कच्चे इंटरफ़ेस पॉइंटर्स स्मार्ट पॉइंटर्स नहीं हैं। किसी ऑब्जेक्ट को रिलीज़ करने के लिए भूलना इसे रिसाव कर देगा। इसमें 'नई' के साथ आवंटित स्मृति को हटाने के लिए भूलने जैसी सभी समस्याएं हैं। – user1610015

1

वहाँ एक CComPtr पैरामीटर (उपयोग करने के लिए नहीं कई लाभ हैं, जब तक यह गैर स्थिरांक और तुम हो ' इसे संशोधित करने जा रहे हैं)। स्थानीय चर और आवृत्ति चर के लिए CComPtr अधिक उपयोगी है।

लेकिन यह केवल ठीक है, अगर शैली/स्थिरता के मामले में यह ठीक है।