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