Как сравнить BSTR со строкой в ​​c / c ++? - PullRequest
11 голосов
/ 13 сентября 2010
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 *'

Ответы [ 4 ]

17 голосов
/ 13 сентября 2010

Вместо этого вы должны использовать wcscmp:

if(0 == wcscmp(varName.bstrVal, L"IP Camera [JPEG/MJPEG]"))
{
}

Вот описание типа данных BSTR , оно имеет префикс длины и реальную строковую часть, которая простомассив символов WCHAR.Он также имеет 2 NULL-терминатора.

Единственное, на что нужно обратить внимание, это то, что тип данных BSTR может содержать встроенные значения NULL в части строки, поэтому wcscmp будет работать только в тех случаях, когда BSTR не работает.содержат встроенные значения NULL (что, вероятно, в большинстве случаев).

2 голосов
/ 13 сентября 2010

В качестве более богатой альтернативы среде выполнения C вы можете использовать Unicode CompareString или CompareStringEx API в Win32.Если у вас нет проблем с кодировкой, wcscmp может подойти.

0 голосов
/ 25 ноября 2011

Мое решение:

static const std::wstring IPCamera = L"IP Camera [JPEG/MJPEG]";
if (varName.bstrVal == IPCamera {
  //...
0 голосов
/ 13 сентября 2010

Я всегда создаю _bstr_t оболочки вокруг BSTR. Это делает все немного проще и более идиоматичным:

if(std::string("IP Camera [JPEG/MJPEG]") ==
                   static_cast<const char*>( _bstr_t(varName.bstrVal) )
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...