如何将Bstr转换为Platform :: String?

时间:2015-11-13 05:59:35

标签: c++ windows-runtime winrt-component

现在我正在做一个Windows Metro App工作,我正在开发一个C ++组件来获取输入方法的候选列表。

输出结果列表的最后一步出现问题。我可以获得候选列表的每个成员,但类型是“Bstr”,要在Metro App中获取它们,我必须将它们转换为“Platform :: String”类型。

如何将Bstr转换为Platform :: String?

我非常感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

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 :(得分:0)

根据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的文档中看到的,构造函数接受以const char16*为单位的以空值终止的16位字符串

虽然保证char16代表UTF16,但wchar不是。

更新: 正如Cheers and hth. - Alf所指出,对于Windows / MSVC,上面的行并不是真的。在这种情况下,我无法找到关于两种类型之间是否安全投射的信息。由于wchar_tchar16_t都是不同的集成类型,我仍然建议您使用std::codecvt来避免问题。

因此,您应该使用std::codecvtwchar_t*转换为char16_t*,并将结果传递给Platform::String的构造函数。