Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. [SOLVED]Problems transforming QString to microsofts' CString

[SOLVED]Problems transforming QString to microsofts' CString

Scheduled Pinned Locked Moved General and Desktop
5 Posts 3 Posters 4.0k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • musimbateM Offline
    musimbateM Offline
    musimbate
    wrote on last edited by Chris Kawa
    #1

    Hi,
    I have a set of functions from a previous MFC application that I would like to use in my current Qt application. The problem is that i get this link error:

    widget.obj:-1: error: LNK2019: unresolved external symbol "public: static int __cdecl CConverter::Convert(class ATL::CStringT<unsigned short,class ATL::StrTraitATL<unsigned short,class ATL::ChTraitsCRT<unsigned short> > >,class ATL::CStringT<unsigned short,class ATL::StrTraitATL<unsigned short,class ATL::ChTraitsCRT<unsigned short> > >,enum FormatType)" (?Convert@CConverter@@SAHV?$CStringT@GV?$StrTraitATL@GV?$ChTraitsCRT@G@ATL@@@ATL@@@ATL@@0W4FormatType@@@Z) referenced in function "private: void __thiscall Widget::on_convertButton_clicked(void)" (?on_convertButton_clicked@Widget@@AAEXXZ)
    

    when I try to call this function:

    static BOOL Convert(CString strSourcePath, CString strTargetPath, FormatType formatType);
    

    From http://msdn.microsoft.com/en-us/library/aa300688(v=vs.60).aspx I saw that you can subsitute CStrings for const char * as arguments so I did my transformations and called the function like this:

    void Widget::on_convertButton_clicked()
    {
        //1.CONVERT THE QString to a CString
        QString str1 = ui->lineEdit->text();
        const char * strSrc=str1.toUtf8().constData();
    
        QString destFolder("C:/Users/Daniel/Desktop/karamage.pdf");
         const char * strDest=destFolder.toUtf8().constData();
        //2.DO THE CONVERSION
    
        BOOL bResult = FALSE;
        bResult = CConverter::Convert(strSrc,strDest, ConvertPPT);
        if(bResult)
        {
          QMessageBox message;
          message.setText("Successful.");
          message.exec(&#41;;
        }else
        {
          QMessageBox message;
          message.setText("Failed."&#41;;
          message.exec(&#41;;
        }
    }
    

    ConvertPPT is just an enum defined in my header.I also have to mention that the app links to some MFC stuff So I have a

    DEFINES += _AFXDLL
    

    in my .pro file if this helps.Am I doing sth wrong or is there any linking I have missed form my app to build successfully? I would appreciate any help.
    Thank you for your time.

    Why join the navy if you can be a pirate?-Steve Jobs

    1 Reply Last reply
    0
    • Chris KawaC Offline
      Chris KawaC Offline
      Chris Kawa
      Lifetime Qt Champion
      wrote on last edited by Chris Kawa
      #2

      Yes, you're doing it wrong.

      const char * strSrc=str1.toUtf8().constData();
      

      toUtf8 creates a temporary QByteArray. You then take the address of the data inside it and store the pointer. But after the ; the temporary QByteArray is destroyed and you're left with a pointer to an invalid memory region.

      The other thing is that CString character is either char or wchar_t, depending on whether or not _UNICODE macro is defined in your program. So make sure which one you use and convert the QString accordingly using either toUtf8() or toWcharArray().

      Next thing is that the docs you cited says you can substitute CString for const char* because it provides conversion operators, but not the other way around, so you need to construct the CString objects first to pass it into the function.

      Apart from these coding errors the actual error message is from the linker saying it can't find the definition of your Convert method, so make sure you're including it in your project.

      1 Reply Last reply
      1
      • musimbateM Offline
        musimbateM Offline
        musimbate
        wrote on last edited by
        #3

        Thanks Chris for the reply:
        I have been able to compile the code with the changes below:
        @

        //The source office file
        QString strSrc = ui->lineEdit->text();
        QByteArray srcBa1 = strSrc.toLocal8Bit();
        const char *srcString1 = srcBa1.data();
        CString myStringSrc(srcString1);
        
        
        //The dest office file
        QString strDest="C:/Users/Daniel/Desktop/karamage.pdf";
        QByteArray destBa2 = strDest.toLocal8Bit();
        const char *destString1 = destBa2.data();
        CString myStringDest(destString1);
        

        @

        The method was not being found after these changes though ,I remembered having dealt with such issues in the past and moved the implementation of the convert functions in the header file and it magically compiled(in my dummy test project) ,I am sure there is an explanation to this but may be beyond my understanding :-). I am having other issues integrating all that in the real project but I guess its better to put that in another thread.

        Why join the navy if you can be a pirate?-Steve Jobs

        1 Reply Last reply
        0
        • Chris KawaC Offline
          Chris KawaC Offline
          Chris Kawa
          Lifetime Qt Champion
          wrote on last edited by Chris Kawa
          #4

          Just a comment. If the string contains null character ( \0 ) the conversion you did will chop off what's behind it.
          To correct this you would need to pass the size of the array too:

          QByteArray srcBa1 = ui->lineEdit->text().toLocal8Bit();
          CString myStringSrc(srcBa1.data(), srcBa1.size());
          

          I'm also not sure toLocal8Bit is the right encoding. The more probable would be toLatin1(), but QString can contain unicode characters, in which case you will get the wrong results. So if you have defined _UNICODE you should rather use toWcharArray(), and if not then toUtf8().

          1 Reply Last reply
          0
          • O Offline
            O Offline
            opengpu
            wrote on last edited by
            #5

            so is there a perfect solution to Conver between QString and CString?
            like this ?
            QString to CString: toLocal8Bit for multibyte encoding, toWString for unicode encoding.
            CString to QString: fromLocal8Bit for multibyte encoding, fromWString for unicode encoding.

            and when to use toLatin1()?
            when to use toUtf8()?

            1 Reply Last reply
            0

            • Login

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups
            • Search
            • Get Qt Extensions
            • Unsolved