LoadString



  • Jemand n tipp fuer mich ?

    wie kann ich LoadString direkt in ein std::wstring machen ?

    TCHAR tcstr[256];
    LoadString(hInst, IDS_NAME, tcstr, 256);
    std::wstring str(tcstr);
    

    so gehts, aber ich haette gern

    std::wstring str;
    LoadString(hInst, IDS_NAME, str, 256);
    

    jemand n schubs ?



  • Hallo,

    was ist LoadString?

    gruss
    v R



  • virtuell Realisticer schrieb:

    was ist LoadString?

    eine winapi-funktion zum holen von strings aus einer sogenannten 'stringtable'
    :xmas2:



  • Hallo

    Das geht nicht anders, LoadString erwartet nunmal einen C-style String, und kann mit (String-) Klassen nichts anfangen.

    bis bald
    akari



  • MrEvil:
    kannste die mfc-klasse 'CString' verwenden? die kann auch mit wchar_t umgehen und hat auch 'ne memberfunktion 'LoadString'...
    :xmas2:



  • std::wstring str;
    str.resize(256); // hiess das wirklich resize bei string??
    LoadString(hInst, IDS_NAME, const_cast<wchar_t*>(str.c_str()), 256);
    


  • Hallo

    @ Kenner : Der Schreibzzgriff über c_str() auf den internen Speicher des wstrings ist undefiniert. Nicht umsonst ist der Rückgabetyp const. Das mit dem const_cast kann gutgehen, kann aber auch den PC in Flammen aufgehen lassen.

    bis bald
    akari



  • akari schrieb:

    Hallo

    @ Kenner : Der Schreibzzgriff über c_str() auf den internen Speicher des wstrings ist undefiniert. Nicht umsonst ist der Rückgabetyp const. Das mit dem const_cast kann gutgehen, kann aber auch den PC in Flammen aufgehen lassen.

    bis bald
    akari

    Klar, der Standard definiert das Verhalten nicht, aber wir wissen doch beide, dass es bei den bekannten Implementierungen ohne Probleme machbar ist.



  • akari schrieb:

    Der Schreibzzgriff über c_str() auf den internen Speicher des wstrings ist undefiniert.

    Undefiniert ist leicht untertrieben. Es ist schlichtweg nicht erlaubt, den Inhalt des durch c_str() zurückgegeben Arrays zu ändern. Es macht daher auch keinen Unterschied, ob eine Implementation dies gutmütig über sich ergehen lässt oder nicht. Just don't do it! Never ever.



  • Du musst den Weg über das Array gehen, mach es so:

    int LoadString( HINSTANCE hInstance, UINT uID, wstring& str )
    {
      wchar_t tmp[ 256 ];
      int res = LoadString( hInstance, uID, tmp, 256 );
      str = tmp;
    
      return res;
    }
    

    Dann kannst du es ganz komfortabel nutzen.

    Diese Methode mit dem String entsprechend groß machen und dann ein Pointer auf den zu übergeben ist nicht klug, da der String fortan 256 Zeichen lang ist auch wenn der geladene String nur 12Zeichen lang wäre. Denn string&wstring terminieren den String nicht durch eine abschließende Null.


Anmelden zum Antworten