0

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

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

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

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

4

2 回答 2

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));
于 2015-11-13T10:16:25.327 回答
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; 

所以BSTRwchar_t*or类型unsigned short*,或者是一个以 null 结尾的 16 位字符串。

从我从Platform::String构造函数的文档中看到的,接受一个以 null 结尾的 16 位字符串作为const char16*

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

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

因此,您应该使用tostd::codecvt 转换并将结果传递给.wchar_t*char16_t*Platform::String

于 2015-11-13T06:46:09.417 回答