C++ 如何将BSTR与c/c++;?

C++ 如何将BSTR与c/c++;?,c++,windows,com,activex,C++,Windows,Com,Activex,上述报告: wprintf(L"Selecting Audio Input Device: %s\n", varName.bstrVal); if(0 == strcmp(varName.bstrVal, "IP Camera [JPEG/MJPEG]"))... 您必须改用wcscmp: error C2664: 'strcmp' : cannot convert parameter 1 from 'BSTR' to 'const

上述报告:

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

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

您必须改用
wcscmp

error C2664: 'strcmp' : cannot convert parameter 1 from 'BSTR' to 'const char *'
这是一个,它有一个长度前缀和一个真正的字符串部分,它只是一个WCHAR字符数组。它还有2个空终止符


唯一需要注意的是,BSTR数据类型可以在字符串部分包含嵌入的空值,因此
wcscmp
仅在BSTR不包含嵌入的空值的情况下工作(这可能是大多数情况)。

作为C运行时更丰富的替代方案,您可以在Win32中使用Unicode CompareString或API。如果您没有考虑CARSET问题,WCSCMP是很好的。

< P>我总是在BSTRs周围构造<代码>它使事情变得更加简单和地道:

if(0 == wcscmp(varName.bstrVal, L"IP Camera [JPEG/MJPEG]"))
{
}
if(std::string(“IP摄像头[JPEG/MJPEG]”)==
静态强制转换(_bstr_t(varName.bstrVal))
{
}
我的解决方案:

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

为什么有些函数的前缀是
w
,而有些函数的前缀是
wc
?@COMer:我不确定,但wcs代表宽字符串。@COMer:我猜“str”会被替换为“wcs”(例如strcmp->wcscmp,strdup->wcsdup),但是没有“str”的函数会在某个地方插入一个“w”(例如printf->wprintf,fopen->-wfoopen)。这不是一个好主意:bstr_t构造函数在varName.bstrVal中生成字符串的完整副本。这还可以执行bstr从unicode到ANSI的运行时转换,这是不必要的,因为您可以首先与unicode文本进行比较。我尝试此操作失败。示例缺少右括号,右括号我更正了(编译过),但逻辑不认为两个相同的字符串相等。
static const std::wstring IPCamera = L"IP Camera [JPEG/MJPEG]";
if (varName.bstrVal == IPCamera {
  //...