2010-07-23 10 views
5

मैं wchar_t * से BSTR को बदलने की कोशिश कर रहा हूं।सी ++: wchar_t * को BSTR में कनवर्ट करें?

#include <iostream> 
#include <atlstr.h> 

using namespace std; 

int main() 
{ 
    wchar_t* pwsz = L"foo"; 

    BSTR bstr(pwsz); 

    cout << SysStringLen(bstr) << endl; 

    getchar(); 
} 

यह 0 प्रिंट, जो मैं क्या आशा व्यक्त की थी की तुलना में कम है। इस रूपांतरण को करने का सही तरीका क्या है?

उत्तर

9

आपको SysAllocString (और फिर SysFreeString) का उपयोग करने की आवश्यकता है।

BSTR bstr = SysAllocString(pwsz); 

// ... 

SysFreeString(bstr); 

एक BSTR स्ट्रिंग उनकी लंबाई के उपसर्ग के पात्रों के साथ एक प्रबंधित स्ट्रिंग है। SysAllocString सही मात्रा में भंडारण आवंटित करता है और स्ट्रिंग की लंबाई और सामग्री को सही तरीके से सेट करता है। BSTR सही ढंग से प्रारंभ किए गए, SysStringLen को सही लंबाई वापस करनी चाहिए।

यदि आप सी ++ का उपयोग कर रहे हैं तो आप यह सुनिश्चित करने के लिए कि कोई SysFreeString कॉल न भूलें, आप RAII शैली वर्ग (या यहां तक ​​कि माइक्रोसॉफ्ट के _bstr_t) का उपयोग करने पर विचार करना चाहें।

1

मैं सबसे आसान लगता है या तो उपयोग करने के लिए

CString

या

CComBSTR

दोनों तरीकों ऐसा क्या चार्ल्स उल्लेख

+1

'सीएसटींग'' bSTR' _wrap_ नहीं करता है, हालांकि इसमें 'CSSTRring' ('AllocSysString()') से 'BSTR' आवंटित करने की विधि है)। 'सीएसटींग'' हालांकि, 'BSTR' की स्वत: मुक्त करने में सहायता नहीं करता है। –

+0

अच्छी तरह से यह एक बीएसआर में परिवर्तित करने की कार्यक्षमता को लपेटता है जो ओपी चाहता था, लेकिन तकनीकी रूप से आप सही हैं इसलिए शब्दों की मेरी पसंद सही नहीं थी। –

2

SysStringLen() केवल आवंटित BSTRs पर इस्तेमाल किया जाना चाहिए है SysAllocString() परिवार के कार्यों द्वारा। इसका उपयोग करने के रूप में आप अपरिभाषित व्यवहार का नेतृत्व करेंगे - प्रोग्राम अप्रत्याशित परिणामों को क्रैश या उत्पन्न कर सकता है। बेहतर अभी तक रैपर वर्गों का उपयोग करें - ATL::CComBSTR या _bstr_t

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