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. Convert QString to wchar_t*

Convert QString to wchar_t*

Scheduled Pinned Locked Moved Solved General and Desktop
20 Posts 6 Posters 14.3k 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.
  • V Offline
    V Offline
    VRonin
    wrote on 17 Jul 2018, 07:37 last edited by
    #11

    Who has the responsibility of managing memory allocation of those struct members?

    "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
    ~Napoleon Bonaparte

    On a crusade to banish setIndexWidget() from the holy land of Qt

    1 Reply Last reply
    1
    • M Offline
      M Offline
      Mr Gisa
      wrote on 17 Jul 2018, 07:45 last edited by
      #12

      0_1531813356323_2919dca9-6d7f-4076-94ce-b52c80d4630a-image.png
      I couldn't find the docs online.

      RAROpenArchiveEx pretty much.

      You can download the dlls, examples and the docs on the official website: https://www.rarlab.com/rar/UnRARDLL.exe

      1 Reply Last reply
      0
      • V VRonin
        17 Jul 2018, 07:11

        A function that takes non-const wchar_t* is very dodgy! it should have no way of knowing the maximum allocated memory to that pointer/array so it is either allocating it internally (hence our discussion has been pointless so far) or that function is terribly designed and it's just a ticking time bomb.
        Can I ask what that function does?

        V Offline
        V Offline
        VRonin
        wrote on 17 Jul 2018, 08:06 last edited by
        #13

        Ok, got it now, looks like it is used-as-const so the const_cast<wchar_t *>(testWstring.c_str()) should work. The string you see in the debugger might just be because you are trying to read the variable past its lifetime, I wouldn't worry about it

        "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
        ~Napoleon Bonaparte

        On a crusade to banish setIndexWidget() from the holy land of Qt

        1 Reply Last reply
        0
        • M Offline
          M Offline
          Mr Gisa
          wrote on 17 Jul 2018, 08:11 last edited by Mr Gisa
          #14

          @VRonin It's not working. After calling RAROpenArchiveEx it writes to RAROpenArchiveDataEx.OpenResult and the result should be ERAR_SUCCESS but it's returning ERAR_EOPEN and isn't right. For some reason it's only working the way I did before:

              // MAX_FILENAME_SIZE = 2048
              wchar_t filenameW[MAX_FILENAME_SIZE];
              int length = filename.left(MAX_FILENAME_SIZE - 1).toWCharArray(filenameW);
              filenameW[length] = '\0';
          
          J 1 Reply Last reply 17 Jul 2018, 08:27
          0
          • M Mr Gisa
            17 Jul 2018, 08:11

            @VRonin It's not working. After calling RAROpenArchiveEx it writes to RAROpenArchiveDataEx.OpenResult and the result should be ERAR_SUCCESS but it's returning ERAR_EOPEN and isn't right. For some reason it's only working the way I did before:

                // MAX_FILENAME_SIZE = 2048
                wchar_t filenameW[MAX_FILENAME_SIZE];
                int length = filename.left(MAX_FILENAME_SIZE - 1).toWCharArray(filenameW);
                filenameW[length] = '\0';
            
            J Offline
            J Offline
            JonB
            wrote on 17 Jul 2018, 08:27 last edited by
            #15

            @Mr-Gisa said in Convert QString to wchar_t*:

            ERAR_EOPEN

            I don't know what state your code is in. But ERAR_EOPEN is some kind of "file is already open" error on a RAR archive, and it hardly seems likely that could be generated as a direct result of something about converting strings, does it to you?

            M 1 Reply Last reply 17 Jul 2018, 08:41
            1
            • J JonB
              17 Jul 2018, 08:27

              @Mr-Gisa said in Convert QString to wchar_t*:

              ERAR_EOPEN

              I don't know what state your code is in. But ERAR_EOPEN is some kind of "file is already open" error on a RAR archive, and it hardly seems likely that could be generated as a direct result of something about converting strings, does it to you?

              M Offline
              M Offline
              Mr Gisa
              wrote on 17 Jul 2018, 08:41 last edited by
              #16

              @JonB The code I posted worked because it's converting the path for the rar file correctly, altough when I try the alternatives here I get a weird string and not a correct path/rar file.

              V 1 Reply Last reply 17 Jul 2018, 08:48
              0
              • M Mr Gisa
                17 Jul 2018, 08:41

                @JonB The code I posted worked because it's converting the path for the rar file correctly, altough when I try the alternatives here I get a weird string and not a correct path/rar file.

                V Offline
                V Offline
                VRonin
                wrote on 17 Jul 2018, 08:48 last edited by
                #17

                @Mr-Gisa said in Convert QString to wchar_t*:

                I get a weird string

                I suspect you are holding a pointer to a temporary variable. If you are doing something like this, you are doing it wrong:

                void fillName(RAROpenArchiveDataEx* rar, const QString& fileName){
                rar->ArcNameW = const_cast<wchar_t *>(fileName.toStdWString().c_str());
                }
                

                As the temporary std::wstring will be destroyed and rar->ArcNameW will contain garbage

                "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                ~Napoleon Bonaparte

                On a crusade to banish setIndexWidget() from the holy land of Qt

                1 Reply Last reply
                0
                • M Offline
                  M Offline
                  Mr Gisa
                  wrote on 17 Jul 2018, 08:53 last edited by
                  #18
                  bool RAR::open(RAR::OpenMode mode)
                  {
                      RAROpenArchiveDataEx openArchiveData;
                      memset(&openArchiveData, 0, sizeof(openArchiveData));
                  
                      openArchiveData.ArcName = 0;
                  
                      auto archive = const_cast<wchar_t *>(mArchive.toStdWString().c_str());
                  
                      openArchiveData.ArcNameW = archive;
                      openArchiveData.OpenMode = mode;
                      openArchiveData.CmtBuf = 0;
                      openArchiveData.CmtBufSize = 0;
                      openArchiveData.Callback = 0;
                      openArchiveData.UserData = 0;
                  
                      mHandle = RAROpenArchiveEx(&openArchiveData);
                      mResult = openArchiveData.OpenResult;
                  
                      if (mResult != ERAR_SUCCESS) {
                          return false;
                      }
                  
                      scan();
                  
                      return true;
                  }
                  
                  V 1 Reply Last reply 17 Jul 2018, 09:04
                  0
                  • M Mr Gisa
                    17 Jul 2018, 08:53
                    bool RAR::open(RAR::OpenMode mode)
                    {
                        RAROpenArchiveDataEx openArchiveData;
                        memset(&openArchiveData, 0, sizeof(openArchiveData));
                    
                        openArchiveData.ArcName = 0;
                    
                        auto archive = const_cast<wchar_t *>(mArchive.toStdWString().c_str());
                    
                        openArchiveData.ArcNameW = archive;
                        openArchiveData.OpenMode = mode;
                        openArchiveData.CmtBuf = 0;
                        openArchiveData.CmtBufSize = 0;
                        openArchiveData.Callback = 0;
                        openArchiveData.UserData = 0;
                    
                        mHandle = RAROpenArchiveEx(&openArchiveData);
                        mResult = openArchiveData.OpenResult;
                    
                        if (mResult != ERAR_SUCCESS) {
                            return false;
                        }
                    
                        scan();
                    
                        return true;
                    }
                    
                    V Offline
                    V Offline
                    VRonin
                    wrote on 17 Jul 2018, 09:04 last edited by VRonin
                    #19

                    @Mr-Gisa said in Convert QString to wchar_t*:

                    auto archive = const_cast<wchar_t *>(mArchive.toStdWString().c_str());

                    Boom! exactly as I supected!

                    auto archiveWString = mArchive.toStdWString();
                    auto archive = const_cast<wchar_t *>(archiveWString.c_str());
                    

                    "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                    ~Napoleon Bonaparte

                    On a crusade to banish setIndexWidget() from the holy land of Qt

                    1 Reply Last reply
                    3
                    • M Offline
                      M Offline
                      Mr Gisa
                      wrote on 17 Jul 2018, 09:19 last edited by
                      #20

                      @VRonin said in Convert QString to wchar_t*:

                      auto archiveWString = mArchive.toStdWString();
                      auto archive = const_cast<wchar_t *>(archiveWString.c_str());

                      Yay now its working. Thx.

                      1 Reply Last reply
                      0

                      20/20

                      17 Jul 2018, 09:19

                      • Login

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