2010-09-13 7 views
11
wprintf(L"Selecting Audio Input Device: %s\n", 
          varName.bstrVal); 

if(0 == strcmp(varName.bstrVal, "IP Camera [JPEG/MJPEG]"))... 

Los informes anteriores:¿Cómo comparar BSTR contra una cadena en c/C++?

error C2664: 'strcmp' : cannot convert parameter 1 from 'BSTR' to 'const char *' 

Respuesta

15

usted tiene que utilizar wcscmp lugar:

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

Aquí es una description of the BSTR data type, que tiene una longitud de prefijo y una parte de la cadena real, que es simplemente una matriz de personajes de WCHAR. También tiene 2 terminadores NULL.

Lo único a tener en cuenta es que el tipo de datos BSTR puede contener NULL incorporados en la porción de cadena, por lo que wcscmp solo funcionará en los casos en que el BSTR no contenga NULL incorporados (que probablemente sea la mayoría de los casos).

+0

Por qué algunas funciones tienen el prefijo 'W' mientras que algunos son' wc'? – COMer

+0

@COMer: No estoy seguro, pero wcs significa cadena de caracteres anchos. –

+2

@COMer: Supongo que "str" ​​se reemplaza por "wcs" (por ejemplo, strcmp -> wcscmp, strdup -> wcsdup), pero las funciones sin "str" ​​tienen una "w" insertada en algún lugar (por ejemplo, printf -> wprintf, fopen -> _wfopen). – wj32

1

Como una alternativa más rica al tiempo de ejecución de C, podría usar las API Unicode CompareString o CompareStringEx en Win32. Si no tiene problemas con los juegos de caracteres, Wcscmp está bien.

0

Siempre construyo _bstr_t envoltorios alrededor de BSTRs. Hace las cosas un poco más fácil y más idiomática:

if(std::string("IP Camera [JPEG/MJPEG]") == 
        static_cast<const char*>(_bstr_t(varName.bstrVal)) 
{ 
} 
+1

No es una idea genial: el constructor _bstr_t hace una copia completa de la cadena en varName.bstrVal. – Sebastian

+0

Esto también hace una conversión en tiempo de ejecución del bstr de Unicode a ANSI, lo cual es innecesario ya que, en primer lugar, podría comparar con un literal Unicode. – BrendanMcK

0

Mi solución:

static const std::wstring IPCamera = L"IP Camera [JPEG/MJPEG]"; 
if (varName.bstrVal == IPCamera { 
    //... 
Cuestiones relacionadas