现在我正在做一个 Windows Metro App 工作,我正在开发一个 C++ 组件来获取输入法的候选列表。
输出结果列表的最后一步出现问题。我可以获取候选列表的每个成员,但类型是“Bstr”,要在 Metro App 中获取它们,我必须将它们转换为“Platform::String”的类型。
如何将 Bstr 转换为 Platform::String?
我非常感谢您能提供的任何帮助。
现在我正在做一个 Windows Metro App 工作,我正在开发一个 C++ 组件来获取输入法的候选列表。
输出结果列表的最后一步出现问题。我可以获取候选列表的每个成员,但类型是“Bstr”,要在 Metro App 中获取它们,我必须将它们转换为“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*
or类型unsigned short*
,或者是一个以 null 结尾的 16 位字符串。
从我从Platform::String
构造函数的文档中看到的,接受一个以 null 结尾的 16 位字符串作为const char16*
虽然char16
保证代表 UTF16,wchar
但不是。
更新:正如所Cheers and hth. - Alf
指出的,上述行不适用于 Windows/MSVC。在这种情况下,我找不到任何关于在两种类型之间进行转换是否安全的信息。由于两者wchar_t
和char16_t
都是不同的集成类型,我仍然建议使用它std::codecvt
来避免问题。
因此,您应该使用tostd::codecvt
转换并将结果传递给.wchar_t*
char16_t*
Platform::String