मुझे CString
इंस्टेंस को उचित रूप से आवंटित BSTR
में कनवर्ट करने और COM12 विधि में BSTR
को पास करने की आवश्यकता है। कोड रखने के लिए जो एएनएसआई और यूनिकोड दोनों के लिए इंडेंटिक रूप से संकलित और काम करता है, मैं CString::AllocSysString()
का उपयोग किसी भी प्रारूप CString
को यूनिकोड BSTR में कनवर्ट करने के लिए करता हूं।सीएसटींग में बीएसआर को सर्वोत्तम रूप से परिवर्तित करने के लिए इसे COM विधि में "इन" पैरामीटर के रूप में कैसे पास किया जाए?
चूंकि कोई भी लौटा हुआ बीएसटी का मालिक नहीं है, इसलिए मुझे इसकी देखभाल करने की आवश्यकता है और कॉल के बाद इसे सबसे अपवाद-सुरक्षित तरीके से और यथासंभव कम कोड के साथ कॉल करने के बाद इसे रिलीज़ करने की आवश्यकता है।
वर्तमान में मैं जीवन भर के प्रबंधन के लिए ATL::CComBSTR
का उपयोग करें:
ATL::CComBSTR converted;
converted.Attach(sourceString.AllocSysString()); //simply attaches to BSTR, doesn't reallocate it
interface->CallMethod(converted);
क्या मैं यहाँ पसंद नहीं है कि मैं सिर्फ ATL::CComBSTR
रूपांतरण परिणाम के लिए बाध्य के निर्माण के लिए दो अलग-अलग बयानों की जरूरत है।
क्या एक ही कार्य को पूरा करने का कोई बेहतर तरीका है?
यह निश्चित रूप से काम करेगा, सिवाय इसके कि सीसीओएमबीस्ट्रक्टर कन्स्ट्रक्टर का उपयोग करने के साथ मुझे यह जांचना होगा कि बीएसटी आवंटन सफल रहा था (सीएसटींग :: ऑलोकिस स्ट्रिंग() चेक करता है और अपवाद फेंकता है) और _bstr_t के साथ मुझे देखभाल करना होगा _com_issue_error() फ़ंक्शन - या तो इसे ओवरराइड करें या उससे निकलने वाले _com_error को पकड़ें। – sharptooth
क्यों बुलाया जाने वाला तरीका इसके तर्कों की वैधता की जांच करने के लिए ज़िम्मेदार नहीं है? यदि आवंटन विफल रहता है, तो 'CComBSTR :: m_str' शून्य हो जाएगा। तो या तो बुलाया गया तरीका शून्य के लिए जांच करेगा और 'E_INVALIDARG' वापस करेगा, या यह आपके द्वारा पहले से ही 'सीएसटींग :: AllocSysString()' के लिए 'कैच' नहीं होगा और आपके लिए अपवाद संभाल सकता है। यह स्पष्ट रूप से स्वयं को जांचने की तुलना में एक क्लीनर मुहावरे है, इमो। –
@ फिल बूथ: बुलाया जाने वाला तरीका एक विशेष मामले के रूप में शून्य BSTR की व्याख्या कर सकता है। उदाहरण के लिए, अर्थ "फ़ाइल नाम निर्दिष्ट कर सकता है, यदि खाली स्ट्रिंग पास हो जाती है तो डिफ़ॉल्ट फ़ाइल नाम का उपयोग किया जाता है"। इसलिए बुलाए जाने की विधि को यह जानने का कोई मौका नहीं है कि कोई समस्या है। – sharptooth