我想将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_);
这是对的吗?换句话说,是否有任何数据丢失?如果是,那是什么 正确的方法?
答案 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字符串由两部分组成:字符串长度的四个字节;以及其本身可以包含空字符的内容。
最简单的方法是:
使用QString :: utf16将QString转换为两个字节的以null结尾的字符串。不要使用toWCharArray,在Windows(两个字节)和linux(四个字节)上,宽字符是不同的(我知道COM是微软技术,但最好确保)
使用SysAllocString创建一个已经包含字符串长度的BSTR字符串。
(可选)完成使用后,使用SysFreeString释放BSTR字符串。请阅读以下文章,以了解何时需要发布。
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