У меня есть проект C++ без юникода (MBCS) с VS2013.
Учитывая значение BSTR
, как мне безопасно передать его в printf?
У меня есть проект C++ без юникода (MBCS) с VS2013.
Учитывая значение BSTR
, как мне безопасно передать его в printf?
BSTR
на самом деле является WCHAR*
с предшествующей информацией о длине. Вы можете игнорировать эту часть длины для целей печати. Так:
BSTR str = foo();
printf("%S", str); // Capital S
BSTR
специфичен для Microsoft, это не проблема. %ls
является портативным.
- person MSalters; 09.09.2015
BSTR
— это указатель на строку расширенных символов с префиксом длины (по смещению -4) и 0
в конце. Вы можете передать его любой функции, способной обрабатывать строку расширенных символов, заканчивающуюся 0
. (Фактическая строка начинается со смещения 0
.)
Если целевая функция не может обрабатывать широкие символы, то вам необходимо преобразовать строку в многобайтовые символы (это случай, когда вы хотите использовать стандартные printf
, где символ поля типа S
недоступен). Эта (уже прокомментированная) ссылка содержит информацию об этом: Преобразовать BSTR в char*
Ответ @MSalters содержит пример кода (не хочу дублировать две тривиальные строки): https://stackoverflow.com/a/32482688/682404
printf
может напечататьwchar_t
, поэтому в преобразовании нет смысла. - person MSalters   schedule 09.09.2015_bstr_t
, как это часто бывает с BSTR? - person Mr. Boy   schedule 09.09.2015