Как конвертировать Bstr в Platform :: String?

Сейчас я выполняю работу в приложении Windows Metro и разрабатываю компонент C ++, чтобы получить список кандидатов метода ввода.

На последнем шаге возникает проблема с выводом списка результатов. Я могу получить каждого члена списка кандидатов, но тип «Bstr», чтобы получить их в приложении Metro, я должен преобразовать их в тип «Platform :: String».

Как конвертировать Bstr в Platform :: String?

Я действительно ценю любую помощь, которую вы можете оказать.

0

Решение

Перегрузки в конструкторе Platform :: String делают это очень просто:

BSTR comstr = SysAllocString(L"Hello world");
auto wrtstr = ref new Platform::String(comstr);

Чтобы быть полностью завершенным, и BSTR, и строка WinRT могут содержать встроенный 0. Если вы хотите обработать этот угловой случай, то:

BSTR comstr = SysAllocStringLen(L"Hello\0world", 11);
auto wrtstr = ref new Platform::String(comstr, SysStringLen(comstr2));
1

Другие решения

По данным MSDN ([1],[2]) у нас есть следующие определения:

#if !defined(_NATIVE_WCHAR_T_DEFINED)
typedef unsigned short WCHAR;
#else
typedef wchar_t WCHAR;
#endif
typedef WCHAR OLECHAR;
typedef OLECHAR* BSTR;

Так BSTR имеет тип wchar_t* или же unsigned short*или завершенная нулем 16-битная строка.

Из того, что я вижу из документации Platform::String конструктор принимает 16-битную строку с нулевым символом в конце как const char16*

В то время как char16 гарантированно представляет UTF16, wchar не является.

ОБНОВИТЬ: Как Cheers and hth. - Alf указал, что строка выше не относится к Windows / MSVC. Я не смог найти никакой информации о том, безопасно ли проводить приведение между обоими типами в этом случае. Поскольку оба wchar_t а также char16_t разные интегрированные типы я бы по-прежнему рекомендовал использовать std::codecvt чтобы избежать проблем.

Так что вы должны использовать std::codecvt конвертировать из wchar_t* в char16_t* и передать результат конструктору вашего Platform::String,

0

По вопросам рекламы [email protected]