如何将BSTR与c/C++中的字符串进行比较?

问题描述:

wprintf(L"Selecting Audio Input Device: %s\n", 
          varName.bstrVal); 

if(0 == strcmp(varName.bstrVal, "IP Camera [JPEG/MJPEG]"))... 

上述报告:如何将BSTR与c/C++中的字符串进行比较?

error C2664: 'strcmp' : cannot convert parameter 1 from 'BSTR' to 'const char *' 

你必须使用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

作为C运行时的更丰富的替代方案,您可以在Win32中使用Unicode CompareString或CompareStringEx API。如果你没有考虑字符集问题,那么wcscmp很好。

我总是构造_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

我的解决办法:

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