Windows 将QString转换为BSTR,反之亦然

Windows 将QString转换为BSTR,反之亦然,windows,qt,wchar-t,wstring,bstr,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_); 这是正确的吗?换句话说,是否

我想将
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_);
这是正确的吗?换句话说,是否有数据丢失?如果是,原因是什么
正确的解决方案

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

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

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

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

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

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

实现这一目标的捷径是:

  • 使用QString::utf16将QString转换为以两字节null结尾的字符串。不要使用towcharray,宽字符在windows(两个字节)和linux(四个字节)上是不同的(我知道COM是microsoft技术,但最好确定)

  • 使用SysAllocString创建已包含字符串长度的BSTR字符串

  • 使用完BSTR字符串后,可以选择使用SysFreeString释放该字符串。请阅读下面的文章,了解何时需要发布

  • 要将BSTR转换为QString,可以将强制转换BSTR重新解释为ushort指针,然后使用QString::fromUtf16。记住在完成BSTR后释放它

    QString qstr = QString::fromUtf16(reinterpret_cast<ushort*>(bstr));
    
    QString qstr=QString::fromUtf16(重新解释强制转换(bstr));
    
    下一篇有用的文章很好地解释了BSTR字符串


    我收到错误C2664:'QString::fromUtf16':无法将参数1从'BSTR'转换为'const ushort*'可能是包含问题。尝试包含。不,这不是包含问题。请参阅-您需要将
    wchar\u t
    指针(BSTR typedef)强制转换为
    ushort
    指针,该指针是
    QString::fromUtf16
    所期望的。但是请注意,在某些平台上,wchar\t可能比ushort长-这将导致严重的问题。
    QString qstr = QString::fromUtf16(reinterpret_cast<ushort*>(bstr));