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 *'
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 *'
你必须使用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(可能大多数情况下)的情况。
作为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))
{
}
不是这样一个好主意:_bstr_t构造函数在varName.bstrVal中生成一个字符串的全长副本。 – Sebastian 2010-09-13 14:16:35
这也可以将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 {
//...
为什么有些功能与'w'前缀,而有些是'wc'? – COMer 2010-09-13 13:31:42
@COMer:我不确定,但wcs代表宽字符串。 – 2010-09-13 13:34:23
@COMer:我猜“str”被替换为“wcs”(例如strcmp - > wcscmp,strdup - > wcsdup),但没有“str”的函数会在某处插入“w”(例如printf - > wprintf, fopen - > _wfopen)。 – wj32 2010-09-14 01:41:21