std::string
сделан char
s; BSTR
обычно является строкой Unicode UTF-16 wchar_t
с префиксом длины.
Даже если можно было бы использовать BSTR
как простой способ маршала массив байтов (так как это BSTR
длина префикса, поэтому она может хранить встроенные NULs), и так потенциально BSTR
может быть использовано также для хранения не- UTF-16, обычный «естественный» режим для BSTR
должен содержать Unicode UTF-16 wchar_t
-строка.
Итак, первая проблема заключается в уточнении какого рода кодирующая std::string
использует (например: Unicode UTF-8 или какой-либо другой код страницы?). Затем вам нужно преобразовать эту строку в Unicode UTF-16 и создать BSTR
, содержащий эту строку UTF-16.
Для преобразования из UTF-8 (или другой кодовой страницы) в UTF-16 вы можете использовать MultiByteToWideChar()
function. Если источник std::string
содержит строку UTF-8, вы можете использовать значение кодовой страницы CP_UTF8
с вышеупомянутым API.
После того, как вы создали преобразованную строку UTF-16, вы можете создать ее с помощью BSTR
и передать это как параметр вывода BSTR*
.
Основной Win32 API для создания BSTR
- SysAllocString()
. Существуют также некоторые варианты, в которых вы можете указать длину строки.
Или, как более удобную альтернативу, вы можете использовать CComBSTR
класс в ATL, чтобы обернуть в пределах безопасных RAII в BSTR
, и использовать его Detach()
method передать BSTR
в качестве выходного параметра BSTR*
. чтение
CComBSTR bstrResult(/* UTF-16 string from std::string */);
*restr = bstrResult.Detach();
Бонус:
Eric's Complete Guide To BSTR Semantics
Зависит. Что такое 'BSTR *'? Пометьте библиотеку, которую вы используете. –