[vs 2005] Lpcstr, Lpcwstr

PeterBücherwurm

Grünschnabel
[vs 2005] Lpstr, Lpcwstr

Also ich habe das Problem, dass ich den Namen einer Datei als LPSTR bekomme, ihn aber als LPCWSTR benötige:suspekt:

hat zufällig einer eine Ahnung, wie ich eine Variable von LPSTR in LPCWSTR konvertieren könnte?

Also über Msdn habe ich leider nur herausgefunden, dass LPSTR ein String aus const char ist und LPCWSTR ein String aus const wchar, was mir auch nicht so recht weiterhilft :(
 
Zuletzt bearbeitet:
hm..., danke, so ging es zwar nicht bei mir, da ich auch noch managed code im projekt hatte, aber ich habe selbst schon ne lösung gefunden;-)

hab gemerkt, dass man einfach (LPCWSTR) vor den string schreiben kann, dann konvertiert er von selbst :)
 
Äh, nein, das kann man nicht.

Das kompiliert zwar, aber dein LPCWSTR ist nicht korrekt umgewandelt (vermutlich nur das erste Zeichen).

Tip: MultibyteToWideChar
 
Achso, habe mich schon gewundert, warum die Mesh-Datei nicht geladen werden konnte, ich guck mal nach der Sache :)

Öhm..., also mit den ganzen Parametern kann ich nicht soo viel anfangen. Vor allem CodePage und dwFlags. Könntest Du vielleicht ein Beispiel dafür angeben, was man da nehmen muss, wenn man einen String 1 zu 1 von LPSTR in LPCWSTR umwandeln möchte?
 
Zuletzt bearbeitet:
Hier ein Schnipsel, der benutzt explizit die STL und std::strings, darunter für MultiByteToWideChar.

Liebe STL-Schreiber: Ihr seid genial, aber das da unten ist wirklich nicht elegant.

Code:
    static std::wstring      ToWString( const std::string& strText )
    {
      std::wstring      wstrResult;

      wstrResult.resize( strText.length() );

      typedef std::codecvt<wchar_t, char, mbstate_t> widecvt;

      std::locale     locGlob;

      std::locale::global( locGlob );

      const widecvt& cvt( std::use_facet<widecvt>( locGlob ) );

      mbstate_t   State;

      char*       cTemp;
      wchar_t*    wTemp;

      cvt.in( State,
              &strText[0], &strText[0] + strText.length(), cTemp,
              (wchar_t*)&wstrResult[0], &wstrResult[0] + wstrResult.length(), wTemp );
                  
      return wstrResult;
    }

Mit MultiByteToWideChar (den MAX_PATH und die 256 kannst/musst du natürlich dementsprechend anpassen):

Code:
Über Parameter: const char* szFileName

  WCHAR wstrFileName[MAX_PATH];

  MultiByteToWideChar( CP_ACP, 0, szFileName, -1, wstrFileName, 256 );
 
Zurück