CStringW innerhalb der DoDataExchange verwenden



  • Ich möchte für eine Datenbankanwendung die Felder meiner View-Klasse mittels DoDataExchange füllen. Jetzt bietet mir aber der Accessor einen CStringW an, da das Projekt als Unicode laufen soll. Allerdings gibt es für CStringW keine Überladung der DDX_FieldText-Methode. Unter http://msdn.microsoft.com/en-us/library/5bzxfsea(VS.71).aspx steht, dass

    CStringT type Declaration
    CStringA An ANSI character type string with CRT support.
    CStringW A Unicode character type string with CRT support.
    CString Both ANSI and Unicode character types with CRT support.

    Kann ich jetzt gefahrlos CStringW nach CString casten? Mir ist die Verwendung der einzelnen String-Typen in Bezug auf Unicode noch nciht ganz klar.


  • Mod

    Was hat DoDataExchange damit zu tun, hier wird IMHO immer CString verwendet?

    1. CString ist entweder ein Container für char* oder wchar_t*, wird also auf CStringA oder CStringW abgebildet.
    Das hängt von Deinen Projekteinstellungen ab (UNICODE/_UNICODE definiert oder nicht).
    2. casten kannst Du mal gar nichts. Aber Du kannst umwandeln. Dafür gibt es nette ATL Makros wie z.B. CT2W!
    3. Da alle CStrings über entsprechende Konstruktoren und Zuweisungsoperatoren für char* und whar_t* kannst Du einfach zuweisen wie Du lustig bist.

    CStringA strA(L"1234");   // Unicode Constructor
    CStringW strW("123");          // MBCS Constructor
    strW = strA;
    strA = strW;
    CString strT(_T("123"));       // ist entweder CStringA oder CStringW
    strT = strA;
    strT = strW;
    const char *szA = "123";
    strT = CA2T(szA);
    strA = szA;
    strW = CA2W(szA);
    const wchar_t *szW = L"123";
    strT = CW2T(szW);
    strA = CW2A(szW);
    strW = szW;
    const TCHAR *szT = _T("123");  // ist entweder char* oder wchar_t*
    strT = szT;
    strA = CT2A(szT);
    strW = CT2W(szT);
    


  • Martin Richter schrieb:

    Was hat DoDataExchange damit zu tun, hier wird IMHO immer CString verwendet?

    Ja eben das war mein Problem. Das Recordset kommuniziert mit der Datenbank über eine CStringW-Variable, für die es aber in der DDX_FieldText-Methode keine Überladung gibt (kennt nur CString). Aber ich denke, dass ich einfach den Datentyp von CStringW in CString im Recordset ändere, da ja CString auch unicodefähig ist und UNICODE gesetzt ist.

    EDIT: mein Fehler war, dass ich vergessen hatte, das Projekt auf Unicode umzustellen (lief noch auf Multibyte). Jetzt funktioniert es... 😕


Anmelden zum Antworten