Сейчас я выполняю работу в приложении Windows Metro и разрабатываю компонент C ++, чтобы получить список кандидатов метода ввода.
На последнем шаге возникает проблема с выводом списка результатов. Я могу получить каждого члена списка кандидатов, но тип «Bstr», чтобы получить их в приложении Metro, я должен преобразовать их в тип «Platform :: String».
Как конвертировать Bstr в Platform :: String?
Я действительно ценю любую помощь, которую вы можете оказать.
Перегрузки в конструкторе 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));
По данным 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
,