Как сравнить BSTR с строкой в c/С++?
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 *'
Ответы
Ответ 1
Вместо этого вы должны использовать wcscmp
:
if(0 == wcscmp(varName.bstrVal, L"IP Camera [JPEG/MJPEG]"))
{
}
Ниже приведено описание типа данных BSTR оно имеет префикс длины и реальную строку, которая представляет собой всего лишь массив символов WCHAR, Он также имеет 2 NULL-терминатора.
Единственное, на что нужно обратить внимание, это то, что тип данных BSTR может содержать встроенные NULL в части строки, поэтому wcscmp
будет работать только в тех случаях, когда BSTR не содержит встроенных NULL (что, вероятно, в большинстве случаев).
Ответ 2
В качестве более богатой альтернативы времени выполнения C вы можете использовать Unicode CompareString или CompareStringEx API в Win32. Если у вас нет проблем с набором кодировок, wcscmp в порядке.
Ответ 3
Я всегда создаю обертки _bstr_t
вокруг BSTR. Это делает вещи немного легче и более идиоматичными:
if(std::string("IP Camera [JPEG/MJPEG]") ==
static_cast<const char*>( _bstr_t(varName.bstrVal) )
{
}
Ответ 4
Мое решение:
static const std::wstring IPCamera = L"IP Camera [JPEG/MJPEG]";
if (varName.bstrVal == IPCamera {
//...