3

我想转换QStringBSTR,反之亦然。

这是我尝试转换QStringBSTR

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

并转换BSTRQString

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

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

4

3 回答 3

5

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

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

除此之外,这里没有什么可丢失的——BSTR 和 QString 都使用 16 位 Unicode 编码,因此彼此之间的转换根本不应该修改内部数据缓冲区。

于 2013-03-26T04:12:10.430 回答
3

To convert a BSTR to a QString you can simply use the QString::fromUtf16 function:

BSTR bstrTest = SysAllocString(L"ConvertMe");
QString qstringTest = QString::fromUtf16(bstrTest);
于 2013-10-31T17:12:59.007 回答
1

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

这样做的简短方法是:

  1. 使用 QString::utf16 将 QString 转换为两字节空终止字符串。不要使用 toWCharArray,宽字符在 windows(两个字节)和 linux(四个字节)上是不同的(我知道 COM 是 microsoft tech,但最好确定)

  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

于 2018-09-28T23:13:53.337 回答