2010-09-13 11 views

Antwort

15

Sie haben stattdessen wcscmp zu verwenden:

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

hier ein description of the BSTR data type ist, hat es eine Länge Präfix und einen Teil echte Zeichenfolge, die nur ein Array ist von WCHAR-Zeichen. Es hat auch 2 NULL-Terminatoren.

Das einzige, worauf zu achten ist, dass der BSTR-Datentyp eingebettete NULL im Stringteil enthalten kann, sodass wcscmp nur in den Fällen funktioniert, in denen der BSTR keine eingebetteten NULL enthält (was wahrscheinlich die meisten Fälle sind).

+0

Warum einige Funktionen mit 'W' vorangestellt werden, während einige 'wc'? – COMer

+0

@COMer: Ich bin mir nicht sicher, aber Wcs steht für breite Zeichenfolge. –

+2

@COMer: Ich vermute, "str" ​​wird durch "wcs" ersetzt (zB strcmp -> wcscmp, strdup -> wcsdup), aber Funktionen ohne "str" ​​bekommen irgendwo ein "w" (zB printf -> wprintf, fopen -> _wfopen). – wj32

1

Als eine bessere Alternative zur C-Laufzeit könnten Sie die Unicode CompareString oder CompareStringEx APIs in Win32 verwenden. Wenn Sie keine Zeichensatzprobleme haben, ist wcscmp in Ordnung.

0

Ich baue immer _bstr_t Wrapper um BSTRs. Es macht die Dinge ein bisschen einfacher und idiomatische:

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

Keine so gute Idee: Der _bstr_t-Konstruktor erstellt eine vollständige Kopie der Zeichenfolge in varName.bstrVal. – Sebastian

+0

Dies ist auch eine Laufzeitkonvertierung der bstr von Unicode zu ANSI, was nicht notwendig ist, da Sie in erster Linie nur mit einem Unicode-Literal vergleichen können. – BrendanMcK

0

Meine Lösung:

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