const wstring& to const TCHAR* ???



  • Ich verstehe diese umwandlung nicht... kann mir jemand helfen?

    void foo2(const TCHAR* lptchr);
    
    void foo(const wstring& wstr)
    {
    foo2(???);
    }
    


  • Egal... Habs geschafft.

    const wchar_t *pwstr = wstr.c_str();
    foo2(pwstr);
    


  • Hi,

    zunächst einmal eine Erklärung zu wstring:
    "A type that describes a specialization of the template class basic_string with elements of type wchar_t as a wstring"

    D.h. wstring ist also ein String aus wchar_t Zeichen.

    Nun, was man wissen muß ist folgende Übersicht:

    char          // 8 bit (ANSI-Zeichen)
    unsigned char // 8/16bit (MBCS-Zeichen)
    wchar_t       // 16 bit (Unicode-Zeichen)
    TCHAR         // 8 bit oder 16 bit (je nach Einstellung von _UNICODE im Compiler)
                  //_UNICODE=0: char 8 bit
                  //_UNICODE=1: wchar_t 16 bit
    

    Der Vollständigkeit halber gibt es noch BSTR, was für "Basic String" steht, besteht aus der Stringlänge plus der eigentlichen Zeichenkette. Dies wird hauptsächlich in Verbindung mit COM-Objekten verwendet.

    HTH,
    Martin



  • typenwirrwar schrieb:

    Egal... Habs geschafft.

    const wchar_t *pwstr = wstr.c_str();
    foo2(pwstr);
    

    Das funktioniert aber nur, wenn UNICODE definiert ist.



  • [Kleiner Nachtrag:]

    Für gewöhnlich müssen sowohl UNICODE als auch _UNICODE (mit zusätzlichenm Underscore) BEIDE gemeinsam definiert werden.
    Also entweder beide mit 0 oder beide mit 1 definieren!
    Eine unterschiedliche Definition führt zu seltsamen Symptomen vor allem in Verbindung mit Win32-API Funktionen!



  • Okay, ich meinte, wenn das Projekt auf Unicode eingestellt ist 🙂



  • Mmacher:

    Für gewöhnlich müssen sowohl UNICODE als auch _UNICODE (mit zusätzlichenm Underscore) BEIDE gemeinsam definiert werden.

    Cool, wusste ich gar nicht.
    Ich habe mich eh schon gefragt warum gewisse Präprozessorflags in beiden Schreibweise existieren. Beispielsweise sah ich schon _DEBUG als auch die DEBUG in einem Projekten! Ich habe es mir so zusammengereimt dass die eine Schreibweise beim Setzen von Flags in der VS GUI benutzt wird, während man im Präprozessor-Flags Feld man die andere Schreibweise benutzt.



  • @Bitte ein Bit: Gern geschehen.

    Angenommen, wir reden hier von Visual C Compilern:
    _DEBUG ist für den Präprozessor normalerweise die einzige maßgebliche Definition was Debug-/Release-Unterscheidung betrifft.

    Die andere Definition DEBUG wird meistens in der Form

    #ifdef _DEBUG
    #define DEBUG
    

    definiert, also von _DEBUG abgeleitet.

    AFAIK wurde das nur eingefügt, um das Includieren von externen Libraries/Modulen (z.B. aus der Unix-Welt) zu vereinfachen.
    Ich selber habe nur mit _DEBUG gearbeitet, mit DEBUG habe ich mich noch nie befassen müssen.

    HTH,
    Martin


Anmelden zum Antworten