【问题标题】:Conver QString to BSTR and vice versa将 WString 转换为 BSTR,反之亦然
【发布时间】:2013-03-15 02:15:09
【问题描述】:

我想将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_);

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

【问题讨论】:

    标签: windows qt wchar-t wstring bstr


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      要将 BSTR 转换为 QString,您可以简单地使用 QString::fromUtf16 函数:

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

      【讨论】:

      • 我收到错误 C2664: 'QString::fromUtf16' : cannot convert parameter 1 from 'BSTR' to 'const ushort *'
      • 可能是包含问题。尝试包括 .
      • 不,这不是包含问题。请参阅stackoverflow.com/questions/2395514/… - 您需要将wchar_t 指针(BSTR typedef)转换为QString::fromUtf16 期望的ushort 指针。但是请注意,在某些平台上 wchar_t 可能比 ushort 长 - 这会导致严重的问题。
      【解决方案3】:

      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

      【讨论】:

        猜你喜欢
        • 2011-09-11
        • 2012-05-24
        • 2010-12-03
        • 2011-10-08
        • 2019-09-19
        • 2013-12-29
        • 2011-09-22
        • 2012-05-14
        • 2020-03-01
        相关资源
        最近更新 更多