将QString转换为_bstr_t的问题

时间:2015-02-08 03:48:01

标签: c++ qt

我正在尝试将QString转换为_bstr_t类型,如下所示:

QString mFilename =" C:/agatebo/amahoro.doc" ;;

    QByteArray srcBa1 = mFilename.toLocal8Bit();
    const char *srcString1 = srcBa1.data();
    CString myStringSrc(srcString1,srcBa1.size());

    BSTR bstrUser = myStringSrc.AllocSysString();

    _bstr_t user(bstrUser,TRUE);

但是当我通过_bstr_t时,我得到了这个函数:

pdfObject->cPrintFile(user);

PDFCreator,我正在使用的COM接口只是崩溃的程序。我怀疑这与unicode有关但无法弄清楚是什么。我应该提到当我直接将路径传递给这样的文件时:

 pdfObject->cPrintFile(L"c:\\agatebo\\amahoro.doc");

一切正常,我只是希望能够使用来自我的Qt应用程序的其他模块的QStrings。我正在使用Qt 4.8 msvc2010进行编译,如果这很重要的话。我会很感激

2 个答案:

答案 0 :(得分:0)

您应该可以使用QString.utf16()

void ProcedureThatTakesWChar(const wchar_t* s) {
  std::wcout<<s<<L'\n';
}

void ProcedureThatTakesBstr(const BSTR& s) {
  std::wcout<<s<<L'\n';
}


int main(int argc, char *argv[]) {

    QString qs("this is a qstring");

    //pass directly
    ProcedureThatTakesWChar(qs.utf16());


    //if you really want to use a _b_str initialise it with .utf16()
    //_b_str will handle SysAllocString and SysFreeString. QString
    //does not have to stay in scope.
    {
      _bstr_t bs(qs.utf16());
      ProcedureThatTakesBstr(bs);
    }

    return 0;
}

答案 1 :(得分:0)

由于您使用的是Windows,并且在传入宽字符串时方法调用有效,这意味着您要在Unicode模式下进行编译。这意味着TCHAR,_bstr_t等被类型定义为wchar_t。您可以在Windows here中了解有关Unicode支持的更多信息。

好消息是QString和Microsoft的Unicode实现都使用相同的字符编码UTF-16

要获取原始QString数据,只需调用QString&#39; s utf16() method即可。这将返回一个指向空终止无符号短裤数组的指针 - 与Windows上的wchar_t类型相同!

所以你应该做的就是:

pdfObject->cPrintFile(mFilename.utf16());