char <-> CString



  • Ich hab ein (für mich) schwerwiegendes Problem.

    Ich habe einige Edit-Felder, die ich mit CString Variablen versehen haben. Die CStrings brauch ich später noch für einen Eintrag in eine INI.

    Nun will ich mich auf einen MySQL-Server connecten. Aber der Befehl akzeptiert nur const char . Wie wandel ich einen CString in einen char[1000] um?

    Und umgekehrt wäre auch gut. Dann hat man beides zusammen falls mans mal braucht.

    Danke


  • Mod

    strcpy?



  • CString -> char*

    CString s("Test");
    ...
    const char *pcBuffer=s.GetBuffer();
    

    char* -> CString

    const char *pcBuffer="kleiner Test-Text";
    CString s=pBuffer;
    


  • Wenn du den Inhalt nicht ändern willst reichts auch so, weil GetBuffer muss dann auch mit ReleaseBuffer wieder freigegeben werden:

    CString bla = _T("TEST");
    LPCTSTR bla2 = (LPCTSTR)bla;



  • so hab alles probiert und auch einiges aus anderen Beiträgen (nachdem ich das schlawort strcpy bekommen hab). Leider klappt keins. immer klappt was mit der typenumwandlung nicht.

    Hier mal das was ich versuche:

    char* test;
    	CString s_text = _T("192.168.3.7");
    
    	strcpy( test, s_text.GetBuffer(s_text.GetLength()));
    	s_text.ReleaseBuffer();
    

    Und das schmeist mit der Copiler um die Ohren:

    error C2664: 'strcpy': Konvertierung des Parameters 2 von 'wchar_t *' in 'const char *' nicht möglich
    Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.

    Die selbe Compilermeldung bekomme ich bei allen Versuchen. Es MUSS aber char werden, weil sonst die MySQL-Funktion runschreit.



  • WideCharToMultiByte



  • CString str(_T("192.168.1.1"));
    	TCHAR text[256] = { 0 };
    	strcpy(text, str);
    

    Benutze TCHAR wenn Du _T(..) verwendest.
    CString besitzt einen (LPCTSTR) cast operator.
    Der sollte reichen; Es ist nicht nötig GetBuffer / ReleaseBuffer aufzurufen.

    Für eine ev. ANSI -> UNICODE Konvertierung: WideCharToMultiByte
    Wie MFK schon erwähnte.

    Edit: Ev. musst Du gar nicht kopieren. Zeig doch mal den Code der den String verwendet.

    Simon



  • Den CString brauch ich nur, weil ich später eine INI schreiben will und fürs Edit-Feld.

    Mit

    char test[1000];
    CString sServer = _T("192.168.3.7");
    WideCharToMultiByte(CP_ACP, NULL, sServer, -1, test, 1000, NULL, NULL);
    

    Klappts jetzt wunderbar.

    Danke an alle ! 👍



  • Die Konvertierung geht am einfachsten mit CStringA:

    CString s_text = _T("192.168.3.7");
    strcpy(test, CStringA(s_text).GetString());
    

    Allerdings ist strcpy böse, besser StringCchCopyA verwenden.


Log in to reply