Подтвердить что ты не робот

Как сравнить 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 *'
4b9b3361

Ответ 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 {
  //...