如何比较BSTR与c / c ++中的字符串?

时间:2010-09-13 13:22:11

标签: c++ windows com activex

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

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

以上报告:

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

4 个答案:

答案 0 :(得分:17)

您必须改为使用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的情况(可能最多例)。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

我总是在BSTR周围构建_bstr_t个包装器。它使事情变得更容易和更惯用:

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

答案 3 :(得分:0)

我的解决方案:

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