Как передать BSTR в printf?

У меня есть проект C++ без юникода (MBCS) с VS2013.

Учитывая значение BSTR, как мне безопасно передать его в printf?


person Mr. Boy    schedule 09.09.2015    source источник
comment
Вы искали? Это даст вам большую часть путь туда...   -  person trojanfoe    schedule 09.09.2015
comment
Возможный дубликат Преобразовать BSTR в char*.   -  person Frédéric Hamidi    schedule 09.09.2015
comment
Не дубликат. printf может напечатать wchar_t, поэтому в преобразовании нет смысла.   -  person MSalters    schedule 09.09.2015
comment
Просто используйте спецификатор формата %ls.   -  person Hans Passant    schedule 09.09.2015
comment
Я провел поиск и не нашел прямого дубликата или прямого ответа на других сайтах, что меня очень удивило. Я задался вопросом, является ли ответ _bstr_t, как это часто бывает с BSTR?   -  person Mr. Boy    schedule 09.09.2015


Ответы (2)


BSTR на самом деле является WCHAR* с предшествующей информацией о длине. Вы можете игнорировать эту часть длины для целей печати. Так:

BSTR str = foo();
printf("%S", str); // Capital S
person MSalters    schedule 09.09.2015
comment
Можете ли вы указать документацию для спецификатора printf с заглавной буквой S? Это не похоже на стандарт C. - person eerorika; 09.09.2015
comment
@user2079303 msdn.microsoft.com/en-us/library/hf4y5e3w.aspx - это MSDN, поэтому он специфичен для Microsoft - ссылка говорит об этом. - person xxbbcc; 09.09.2015
comment
Я подумал, что если BSTR специфичен для Microsoft, это не проблема. %ls является портативным. - person MSalters; 09.09.2015

BSTR — это указатель на строку расширенных символов с префиксом длины (по смещению -4) и 0 в конце. Вы можете передать его любой функции, способной обрабатывать строку расширенных символов, заканчивающуюся 0. (Фактическая строка начинается со смещения 0.)

Если целевая функция не может обрабатывать широкие символы, то вам необходимо преобразовать строку в многобайтовые символы (это случай, когда вы хотите использовать стандартные printf, где символ поля типа S недоступен). Эта (уже прокомментированная) ссылка содержит информацию об этом: Преобразовать BSTR в char*

Ответ @MSalters содержит пример кода (не хочу дублировать две тривиальные строки): https://stackoverflow.com/a/32482688/682404

person xxbbcc    schedule 09.09.2015