Was ist da Verkehrt ??



  • was ist da Verkehrt, oder wass muss ich anders machen

    MessageBoxW(NULL,TEXT(string(buf).c_str()[string(buf).length()]),TEXT("Server Message"),MB_OK);
    
    Fehler	1	error C2228: Links von ".c_str" muss sich eine Klasse/Struktur/Union befinden.	c:\dokumente und einstellungen\admin\desktop\loadbg\socketserver\socketserver\main.cpp	70
    
    Fehler	2	error C3861: "Lstring": Bezeichner wurde nicht gefunden.	c:\dokumente und einstellungen\admin\desktop\loadbg\socketserver\socketserver\main.cpp	70
    


  • Der Ausdruck

    string(buf).c_str()[string(buf).length()];
    

    liefert normalerweise ein char(0), da der Index 'string(buf).length()' genau hinter den Nutzstring und damit auf die abschließenden '0' zeigt.

    Der erste Compiler-Fehler weißt darauf hin, dass #include <string> oder using namespace std; vergessen wurde. Der zweite kommt von dem Text-Makro. Dieses Makro ist nur für String-Literale gedacht. Zum Beispiel TEXT("Ein String").

    Wenn Du in einer MFC-Umgebung eine automatische Anpassung des std::string an das sogenannte Unicode-Flag haben möchtest, so kannst Du auch

    typedef std::basic_string< TCHAR > tstring;
    

    schreiben und tstring statt std::string benutzen. Aber man sollte vorsichtig damit umgehen. Es ist nicht immer notwendig aus allen Strings wchar_t-Strings zu machen.

    Gruß
    Werner

    @Edit: Tippfehler



  • Und wie muss ich dass dann machen ??

    so ??

    MessageBoxW(NULL,basic_string< string(buf).c_str() >,TEXT("Server Message"),MB_OK);



  • typedef std::basic_string< TCHAR > tstring;
        tstring txt = TEXT("Hallo Welt");
        MessageBox( NULL, txt.c_str(), TEXT("Server Message"), MB_OK);
    

    .. oder so
    Falls Du MessageBoxW benutzt, so musst Du immer std::wstring hernehmen.

    Gruß
    Werner



  • Hi, sorry ich glaub ich bin zu dumm dazu .

    typedef std::basic_string< TCHAR > tstring; 
    			tstring text = TEXT(string(buf).substr(0,empfBytes).c_str());
    			MessageBox(NULL,text.c_str();,TEXT("Server Message"),MB_OK);
    

    So dass kann doch nicht sein etwa 7 Fehler.



  • Und so kommt Lbuf nich deklarierter Bezeichenr

    typedef std::basic_string< TCHAR > tstring; 
    			tstring text = TEXT(buf);
    			MessageBox(NULL,text.c_str(),TEXT("Server Message"),MB_OK);
    


  • Wie Werner Salomon schon sagte, das TEXT-Makro ist für Stringliterale gedacht. Du hast zwar nicht geschrieben, was buf ist, aber ein Stringliteral ist es jedenfalls nicht.



  • Hi hier dass moechte ich damit Anstellen

    do
    	{
    		char buf[1024];
    		empfBytes = recv(connectedSocket,buf,1024,0);
    		if(string(buf).substr(0,empfBytes) != "shutdown")
    		{
                typedef std::basic_string< TCHAR > tstring; 
    			tstring text = TEXT(buf);
    			MessageBox(NULL,text.substr(0,empfBytes).c_str(),TEXT("Server Message"),MB_OK);
    		}break;
    	} while(a!=5);
    

    Die ueber den Socket empfangegnen char Bytes moechte ich ganz einfach in einer Message Box ausgeben.



  • manchmal sind die Dinge einfacher als man glaubt 😉

    do
    {
        char buf[1024];
        const int empfBytes = recv( connectedSocket, buf, sizeof(buf)-1, 0 );
        buf[empfBytes] = char(0); // String-Ende sicher setzen
        if( string(buf) != "shutdown" )
        {
            MessageBox( NULL, buf, TEXT("Server Message"), MB_OK );
        }
        else
            break;
    } while( a!=5 );  // was ist 'a'?
    

    Sollte funktionieren, solange Du die Applikation ohne Unicode übersetzt und nur ASCII-Daten also lesbare Zeichen über die Socket--Schnittstelle reinkommen.

    Gruß
    Werner



  • Leider nicht , es gibt da noch ein Problemchen :-

    do
    	{
    		char buf[1024];
    		const int empfBytes = recv(connectedSocket,buf,sizeof(buf)-1,0);
    
    		buf[empfBytes] = char(0);
    
    		if(string(buf).substr(0,empfBytes) != "shutdown")
    		{
    			cout << string(buf).substr(0,empfBytes);
    			MessageBox(NULL,buf,TEXT("Server Message"),MB_OK);
    		}break;
    	} while(a!=5);
    
    Fehler	1	error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'char [1024]' in 'LPCWSTR' nicht möglich	c:\dokumente und einstellungen\admin\desktop\loadbg\socketserver\socketserver\main.cpp	74
    


  • Wie kann ich machen dass nich Unicode uebersetzt wird ??

    Ich arbeite mit microsoft visual c++.



  • Werner Salomon schrieb:

    Sollte funktionieren, solange Du die Applikation ohne Unicode übersetzt

    Ich arbeite mit microsoft visual c++.

    Welche Version genau?



  • Werner Salomon schrieb:

    Sollte funktionieren, solange Du die Applikation ohne Unicode übersetzt ..

    und wer lesen kann, ist im Vorteil 😉

    Um diesen String in die MessageBox zu schreiben musst Du ihn erst nach Wide-Character konvertieren.

    do
    {
        char buf[1024];
        const int empfBytes = recv( connectedSocket, buf, sizeof(buf)-1, 0 );
        buf[empfBytes] = char(0); // String-Ende sicher setzen
        if( string(buf) != "shutdown" )
        {
            USES_CONVERSION;
            MessageBox( NULL, A2T(buf), TEXT("Server Message"), MB_OK );
        }
        else
            break;
    } while( a!=5 );  // was ist 'a'?
    

    Zu den Details frag' bitte im MFC-Forum nach. .. und lass die substr-Aufrufe weg; in diesem Fall sind die überflüssig.

    Gruß
    Werner



  • @Werner Salomon

    Funktioniert leider nicht 😞

    Fehler	1	error C2065: 'USES_CONVERSION': nichtdeklarierter Bezeichner	c:\dokumente und einstellungen\admin\desktop\loadbg\socketserver\socketserver\main.cpp	73
    
    Fehler	2	error C3861: "A2T": Bezeichner wurde nicht gefunden.	c:\dokumente und einstellungen\admin\desktop\loadbg\socketserver\socketserver\main.cpp	74
    

    @MFK

    Microsoft Visual C++ 2005



  • Meine Loesung die Leider das Programm zum abstürtzen bringt:

    wchar_t* text;
    			mbstowcs(text,buf,1024);
    			MessageBox(NULL,text,TEXT("Server Message"),MB_OK);
    


  • Sei doch nicht so unselbstständig!
    Wenn der dir so ne Fehlermeldung raushaut ist es ja wohl das mindeste mal eben selber in die MSDN zu schauen.
    Was dir fehlt ist nen include von atlconv.h.
    A2W ist aber MFC Kram.Ist das überhaupt ne MFC Anwendung?

    Bei VS 2005 sind die Projekte per default auf Unicode eingestellt.
    Das kannst du unter:
    Projekt->Eigenschaften->Konfigurationseigenschaften->Allgemein ändern.
    Einfach unter Projektstandards->Zeichensatz "nicht festgelegt" auswählen.
    Damit läufst du aber nur vor deinem Problem weg.....und wer wegläuft ist feige 😉

    MfG Spacelord



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten