2010-09-13 157 views

回答

15

你必須使用wcscmp代替:

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

這裏是一個description of the BSTR data type,它有一個長度前綴和一個真正的字符串,其中一部分只是一個數組的WCHAR字符。它也有2個NULL終止符。

唯一需要注意的是BSTR數據類型可以在字符串部分包含嵌入NULL,所以wcscmp只適用於BSTR不包含嵌入NULL(可能大多數情況下)的情況。

+0

爲什麼有些功能與'w'前綴,而有些是'wc'? – COMer 2010-09-13 13:31:42

+0

@COMer:我不確定,但wcs代表寬字符串。 – 2010-09-13 13:34:23

+2

@COMer:我猜「str」被替換爲「wcs」(例如strcmp - > wcscmp,strdup - > wcsdup),但沒有「str」的函數會在某處插入「w」(例如printf - > wprintf, fopen - > _wfopen)。 – wj32 2010-09-14 01:41:21

1

作爲C運行時的更豐富的替代方案,您可以在Win32中使用Unicode CompareString或CompareStringEx API。如果你沒有考慮字符集問題,那麼wcscmp很好。

0

我總是構造_bstr_t圍繞BSTR的包裝。這使事情相當多的更簡單,更地道:

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

不是這樣一個好主意:_bstr_t構造函數在varName.bstrVal中生成一個字符串的全長副本。 – Sebastian 2010-09-13 14:16:35

+0

這也可以將bstr從unicode運行時轉換爲ANSI,這是不必要的,因爲您可以首先比較unicode字面值。 – BrendanMcK 2011-11-25 16:23:11

0

我的解決辦法:

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