Conver QString到BSTR,反之亦然

时间:2013-03-25 14:31:50

标签: windows qt wchar-t wstring bstr

我想将QString转换为BSTR,反之亦然。

这是我尝试将QString转换为BSTR

std::wstring str_ = QString("some texts").toStdWString();
BSTR bstr_ = str_.c_str();

并将BSTR转换为QString

BSTR bstr_;
wchar_t *str_ = bstr_;
QString qstring_ = QString::fromWCharArray(str_);

这是对的吗?换句话说,是否有任何数据丢失?如果是,那是什么 正确的方法?

3 个答案:

答案 0 :(得分:5)

您应该使用SysAllocString来执行此操作 - BSTR还包含长度前缀,该代码不包含在您的代码中。

std::wstring str_ = QString("some texts").toStdWString();
BSTR bstr_ = SysAllocString(str_.c_str());

除此之外没有任何东西要丢失 - BSTR和QString都使用16位Unicode编码,因此相互之间的转换根本不应该修改内部数据缓冲区。

答案 1 :(得分:3)

要将BSTR转换为QString,您只需使用QString::fromUtf16函数:

BSTR bstrTest = SysAllocString(L"ConvertMe");
QString qstringTest = QString::fromUtf16(bstrTest);

答案 2 :(得分:1)

BSTR字符串由两部分组成:字符串长度的四个字节;以及其本身可以包含空字符的内容。

最简单的方法是:

  1. 使用QString :: utf16将QString转换为两个字节的以null结尾的字符串。不要使用toWCharArray,在Windows(两个字节)和linux(四个字节)上,宽字符是不同的(我知道COM是微软技术,但最好确保)

  2. 使用SysAllocString创建一个已经包含字符串长度的BSTR字符串。

  3. (可选)完成使用后,使用SysFreeString释放BSTR字符串。请阅读以下文章,以了解何时需要发布。

https://docs.microsoft.com/en-us/cpp/atl-mfc-shared/allocating-and-releasing-memory-for-a-bstr?view=vs-2017

BSTR bstr = ::SysAllocString(QString("stuff").utf16())
// use it
::SysFreeString(bstr)

要从BSTR转换为QString,可以将广播的BSTR重新解释为ushort指针,然后使用QString :: fromUtf16。完成操作后,请记住释放BSTR。

QString qstr = QString::fromUtf16(reinterpret_cast<ushort*>(bstr));

下一篇有用的文章很好地解释了BSTR字符串。

https://www.codeproject.com/Articles/13862/COM-in-plain-C-Part