繁体   English   中英

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

[英]How to convert Bstr to 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*unsigned short*或以null结尾的16位字符串。

根据我从Platform::String文档中看到的内容,构造函数接受以NULL结尾的16位字符串作为const char16*

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

更新: Cheers and hth. - Alf Cheers and hth. - Alf指出上述行不适用于Windows / MSVC。 在这种情况下,我找不到有关在两种类型之间进行转换是否安全的任何信息。 由于wchar_tchar16_t都是不同的集成类型,因此我仍然建议使用std::codecvt以避免出现问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM