2010-09-13 8 views

उत्तर

15

इसके बजाय आप wcscmp उपयोग करने के लिए:

if(0 == wcscmp(varName.bstrVal, L"IP Camera [JPEG/MJPEG]")) 
{ 
} 

यहाँ एक description of the BSTR data type है, यह लंबाई उपसर्ग और एक वास्तविक स्ट्रिंग हिस्सा जो सिर्फ एक सरणी है WCHAR वर्णों का। इसमें 2 न्यूल टर्मिनेटर भी हैं।

यह देखने के लिए एकमात्र चीज यह है कि बीएसआर डेटा प्रकार में स्ट्रिंग हिस्से में एम्बेडेड एनयूएलएल हो सकते हैं, इसलिए wcscmp केवल उन मामलों में काम करेगा जहां बीस्ट्र में एम्बेडेड एनयूएलएल (जो शायद अधिकतर मामले हैं) शामिल नहीं है।

+0

क्यों कुछ कार्यों 'w' लगी होती हैं, जबकि कुछ' हैं wc'? – COMer

+0

@COMer: मुझे यकीन नहीं है लेकिन wcs विस्तृत वर्ण स्ट्रिंग के लिए खड़ा है। –

+2

@COMer: मुझे लगता है कि "str" ​​को "wcs" (जैसे strcmp -> wcscmp, strdup -> wcsdup) के साथ प्रतिस्थापित किया जाता है, लेकिन "str" ​​के बिना फ़ंक्शंस कहीं "डाला" मिलता है (उदाहरण के लिए printf -> wprintf, fopen -> _wfopen)। – wj32

1

सी रनटाइम के एक समृद्ध विकल्प के रूप में, आप Win32 में यूनिकोड तुलनास्ट्रिंग या CompareStringEx एपीआई का उपयोग कर सकते हैं। यदि आपके पास विचार करने के लिए वर्णमाला मुद्दे नहीं हैं, तो wcscmp हालांकि ठीक है।

0

मैं हमेशा BSTRs के आस-पास _bstr_t रैपर का निर्माण करता हूं। यह बातें काफ़ी आसान और अधिक मुहावरेदार बनाता है:

if(std::string("IP Camera [JPEG/MJPEG]") == 
        static_cast<const char*>(_bstr_t(varName.bstrVal)) 
{ 
} 
+1

इतना अच्छा विचार नहीं है: _bstr_t कन्स्ट्रक्टर varName.bstrVal में स्ट्रिंग की पूर्ण-लंबाई प्रति बनाता है। – Sebastian

+0

यह यूनिकोड से एएनएसआई तक बीएसटी का रन-टाइम रूपांतरण भी करता है, जो अनावश्यक है क्योंकि आप पहली जगह यूनिकोड शाब्दिक के खिलाफ तुलना कर सकते हैं। – BrendanMcK

0

मेरे समाधान:

static const std::wstring IPCamera = L"IP Camera [JPEG/MJPEG]"; 
if (varName.bstrVal == IPCamera { 
    //...