现在我正在做一个Windows Metro App工作,我正在开发一个C ++组件来获取输入方法的候选列表。
输出结果列表的最后一步出现问题。我可以获得候选列表的每个成员,但类型是“Bstr”,要在Metro App中获取它们,我必须将它们转换为“Platform :: String”类型。
如何将Bstr转换为Platform :: String?
我非常感谢您提供的任何帮助。
答案 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)
#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_t
和char16_t
都是不同的集成类型,我仍然建议您使用std::codecvt
来避免问题。
因此,您应该使用std::codecvt
从wchar_t*
转换为char16_t*
,并将结果传递给Platform::String
的构造函数。