Как сравнить два BSTR или CComBSTR?

Как правильно сравнивать два CComBSTR? я пытался использовать

 bool operator ==(
     const CComBSTR& bstrSrc 
 ) const throw( );

Однако он всегда возвращает false, даже если два ComBSTR одинаковы. Это не сработало правильно.

Нужно ли сначала преобразовывать CComBSTR в строку ANSI, а затем использовать strcmp?

Спасибо!

-bc


person bionicoder    schedule 15.09.2009    source источник


Ответы (2)


Вероятно, вам следует использовать VarBstrCmp.

РЕДАКТИРОВАТЬ: на самом деле это то, что делает CComBSTR::operator==, поэтому без дальнейшего контекста ваш код может быть неверным.

person MSN    schedule 15.09.2009
comment
VarBstrCmp тоже не работает. Он возвращает HRESULT 0x00000002 Система не может найти указанный файл. Мой код выглядит так: CComBSTR m_bstrUrl; ...... HRESULT hr = ::VarBstrCmp( (BSTR)m_bstrUrl, pvURL->bstrVal, ::GetThreadLocale(), 0 ); - person bionicoder; 16.09.2009
comment
каков тип m_bstrUrl? почему вы должны были перевести его на BSTR? - person moogs; 16.09.2009
comment
Прочитайте, что MSDN говорит о возвращаемом результате. Тип данных — HRESULT, но значения не являются значениями HRESULT. - person Windows programmer; 16.09.2009
comment
Спасибо всем! Задача решена. Проблема заключалась в том, что к исходной строке добавлены два странных байта. Он невидим для чтения, но есть в сравнении. Обрежьте лишние два байта. Всё хорошо. - person bionicoder; 16.09.2009
comment
@bionicoder: Эти дополнительные байты являются маркерами Unicode BOM или префикс длины BSTR? - person rwong; 02.08.2011

BSTR (и, следовательно, CComBSTR) обычно являются строками Unicode. Вы можете использовать wcscmp() (или wcsicmp() для сравнения без учета регистра).

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

person sharptooth    schedule 16.09.2009