Problem mit _MBCS und UNICODE und _T()



  • Hallo,

    ich hatte in meinen Projekt Einstellungen das _MBCS beim C++ Präprozessor stehen und habe fast überall _T() Makro verwendet.

    Jetzt habe ich aus der Kompatibilitätsgründen zur einer Lib auch UNICODE (nicht _UNICODE) Makro hinzufügen müssen.

    Ich habe folgenden Code:

    TCHAR *pszCause;
    pszCause = new TCHAR[cc_ExcBuffSize];
    ... // pszCause bekommt ihren Wert ..
    // m_ErrorMessage ist CString
    m_ErrorMessage = _T(pszCause); // <-- Hier ist ERROR
    

    Jetzt wird aber mein _T() Makro ignoriert
    MFC Definition:

    #define _T(x)       __T(x)
    #define __T(x)      L ## x
    

    Und ich habe anstelle von pszCause variable eine LpszCause Variable stehen:
    "error C2065: 'LpszCause' : nichtdeklarierter Bezeichner"

    Hat jemand eine Idee?
    Und kann mir jemand den Unterschied zwischen MultiByte und WideChar erklären?

    Ich habe auch MFC's :"Using TCHAR.H Data Types with _MBCS Code." durchgelesen, eine Antwort auf mein Problem habe ich aber da nicht gefunden 😞



  • Hallo,

    du kannst keine Variablen mit dem T-Makro behandeln, es funktioniert nur mit Zeichenketten-Literalen. Deshalb kann dein Code so nicht funktionieren, vielmehr stellt das WinAPI Funktionen bereit, um Unicode (wide chars) in ANSI zu wandeln. Die Funktionen MultiByteToWideChar bzw. WideCharToMultiByte nehmen jeweils einen wide-char-Buffer und einen char-Buffer als Argument an:

    http://msdn.microsoft.com/library/en-us/intl/unicode_2bj9.asp

    http://msdn.microsoft.com/library/en-us/intl/unicode_17si.asp

    Zum Thema MultiByte/WideChar:

    ein MultiByte-Zeichensatz besteht aus Zeichen, die ein Byte und/oder zwei Byte groß sein können (darunter befinden sich also Single-byte Character Sets als auch Double-byte Character Sets (DBCS)), eine Widechar-Zeichenkette besteht aus Zeichen, die alle zwei Byte groß sind (und UNICODE ist ein solcher WideChar-Zeichensatz, und der wird unter NT-basierten Systemen verwendet).

    Weiteres dazu gibt es hier

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_6bqr.asp

    MfG



  • Probe-Nutzer schrieb:

    du kannst keine Variablen mit dem T-Makro behandeln...

    Das habe ich schon selbst gemerkt. Hat nur bisschen Zeit gekostet..
    Ich dachte nur das _T() nicht nur ".." konvertieren würde, sondern auch irgendwelche Routinen um Variablen zu konvertieren aufrufen wird (je nach konfiguration), da ich das vorher nie benutzt hatte.

    Es lief ja auch, bis ich auf UNICODE umgestellt habe.
    War meine eigene Blödheit.. Alles andere habe ich auch schon umgestellt
    (_TCHAR, _ttoi anstatt atoi u.s.w.)

    Danke für die Hilfe, ich wünschte c-plusplus.net wäre öffter erreichbar, dann hätte
    ich mir viel Zeit sparren können.

    P.S.: _MBCS habe ich aus meiner Konfiguration entfernt (Konfikte mit _UNICODE) und müsste auch noch wWinMainCRTStartup beim Linker eingeben, dann lief alles.


Anmelden zum Antworten