2010-11-29 3 views

ответ

6

A BSTR на самом деле является WCHAR* с префиксом длины. Значение BSTR указывает на начало строки, а не на префикс длины (который хранится в байтах только «до» местоположения, на которое указывает BSTR).

Другими словами, вы можете лечить BSTR, как если бы это const WCHAR*. Преобразование не требуется.

Так что ваш вопрос действительно: «Как я могу преобразовать строку Unicode (WCHAR*) в char*?» И ответ должен использовать функцию ::WideCharToMultiByte API, как описано here. Или, если вы используете MFC/ATL в своем приложении, используйте ATL and MFC Conversion Macros.

0
typedef OLECHAR FAR * BSTR; 
typedef WCHAR OLECHAR; 

От here.

WCHAR *. Это широкий символ, а не символ. Это означает, что это Unicode, а не ASCII и не нужно преобразовывать. Если вы хотите использовать const char *, не используйте широкие типы.

Хотя возможно использование некоторых хакеров, вы можете потерять данные, так как вы будете преобразовывать текст из Unicode в ASCII.

+0

Узкие строки символов не обязательно должны быть ASCII. Они могут быть UTF-8, и в этом случае вы все равно сможете отображать символы, которые обычно считаются широкими, например. Китайский и японский. – CadentOrange 2010-11-29 10:19:37

4
#include "comutil.h" 

BSTR bstrVal; 
_bstr_t interim(bstrVal, false);  
    // or use true to get original BSTR released through wrapper 
const char* strValue((const char*) bstrVal); 

This обрабатывает все широкоугольные символы для многобайтового преобразования.

Смежные вопросы