MessageBox an Server senden...



  • Ich hab ein Client/Server, der Client kann eine Nachricht per Konsole zum Server senden und diese wird dann beim Server als MessageBox ausgegeben. Jede neue MessageBox wird als Thread geöffnet.
    Ich hab folgenden Code:

    DWORD APIENTRY show_msg_box(void *msg)
    {		
    	MessageBox(NULL, (char*)msg, "IP-USER...", MB_OK);
    	return 0;
    }
    

    Aufruf der Funktion mit:

    CreateThread(NULL, NULL, show_msg_box, "Nachricht", NULL, NULL);
    

    Mein Ziel ist es in der Titelleiste z.B. die IP oder Usernamen des Clients auszugeben.
    Nun meine Frage: Wie kann ich bei der MessageBox in der Titelleiste die IP des Clients ausgeben? Also das empfangen der IP ist nicht das Problem, ich weiß nur nicht wie ich noch ein Parameter bei der Funktion CreateThread() angeben kann, also eine für die Nachricht und eine für die Titelleiste. Ich dachte mir ob man nicht die Funktion show_msg_box() um ein Parameter erweitern kann aber dabei bekomme ich Fehler.

    Hilfe!!!





  • Threads brauche ich damit der Client weiter läuft wenn die Nachricht angekommen ist, sonst müsste ich so lange warten bis die MessagBox weggeklickt wird.

    Mein Code:

    struct daten
    {
    	string IP;
    	string UserName;
    	string ClientName;
    	string Nachricht;
    };
    
    int main()
    { 
    //Server...
    //Empfangene Daten vom Client
    char recvClientIP[128];	
    char recvUserName[128];
    char recvClientName[128];
    char Message[256];
    
    daten d;
    d.IP = recvClientIP;
    d.UserName = recvUserName;
    d.ClientName = ClientName;
    d.Nachricht = Message;
    
    CreateThread(NULL, NULL, show_msg_box, &d, NULL, NULL);
    

    Nun wird die Funktion aufgerufen dabei bekomme ich Compiler Fehler beim Empfangen eines structs:

    DWORD APIENTRY show_msg_box(struct daten *a)
    {	
    	//MessageBox(NULL, (char*)msg, "Nachricht", MB_OK);
    	return 0;
    }
    


  • du musst void* empfangen und diesen dann in deine struct casten.

    DWORD APIENTRY show_msg_box(void *param) { // ..
    

    ich glaube std::string ist nicht geeignet für deine struktur, ich würde dir zu einem festen char array raten. ich lasse mich auch vom gegenteil überzeugen 😃



  • Wenn ich das so mache wie in: http://www.c-plusplus.net/forum/viewtopic-var-t-is-143584.html
    dann bekomme ich mit dem Code Fehler...

    Der linke Teil von '->IP' muss auf Klasse/Struktur/Union zeigen

    DWORD APIENTRY show_msg_box(void *msg)
    {
    	cout << msg->IP << endl;
    	cout << msg->UserName << endl;
    	cout << msg->ClientName << endl;
    
    	MessageBox(NULL, (char*)msg, "Nachricht", MB_OK);
    	return 0;
    }
    

    Außerdem sollen da später keine Ausgaben stehen sondern die drei Inhalte in ein string(oder ähnliches) gepackt werden und dann an MessageBox() im dritten Parameter übergeben werden. Nicht zu vergessen das ja noch die Nachricht auch noch hinzukommt. Also wie sollte ich das am besten erledigen?



  • Du musst einen void pointer dann schon explizit in einen "daten" pointer casten in der funktion.



  • kernel64 schrieb:

    Wenn ich das so mache wie in: http://www.c-plusplus.net/forum/viewtopic-var-t-is-143584.html
    dann bekomme ich mit dem Code Fehler...

    Der linke Teil von '->IP' muss auf Klasse/Struktur/Union zeigen

    lies was ich schreibe ⚠

    miller_m schrieb:

    du musst void* empfangen und diesen dann in deine struct casten.

    DWORD APIENTRY show_msg_box(void *msg)
    {
        daten *pData = (daten*)msg;
    
    	cout << pData ->IP << endl;
    }
    

    kernel64 schrieb:

    Außerdem sollen da später keine Ausgaben stehen sondern die drei Inhalte in ein string(oder ähnliches) gepackt werden und dann an MessageBox() im dritten Parameter übergeben werden. Nicht zu vergessen das ja noch die Nachricht auch noch hinzukommt. Also wie sollte ich das am besten erledigen?

    wie du es schon gemacht hast, mittels einer struktur. zum einem string oder einem char array zusammenbauen wirst du wohl hinbekommen.



  • @miller_m
    Wenn ich das so mache:

    DWORD APIENTRY show_msg_box(void *msg)
    {
        daten *pData = (daten*)msg;
    
        cout << pData ->IP << endl;
    }
    

    Dann kommt nichts raus als wäre pData leer. Habs auch mit pData->Nachricht probiert aber es kommt nichts an.



  • zeige doch mal deinen kompletten code.



  • struct daten {
    	char szCaption[128];
    	char szMsg[128];
    };
    
    unsigned long __stdcall threadfunc( void *arg )
    {
    	struct daten *p = (struct daten*)arg;
    	MessageBox( NULL, p->szMsg, p->szCaption, 0 );
    	return 0;
    }
    
    int main(int argc, char* argv[])
    {
    	HANDLE hThread;
    	struct daten *data = (struct daten*)malloc( sizeof(daten) );
    	strcpy( data->szCaption, "Thread Title" );
    	strcpy( data->szMsg, "Hello from thread" );
    	hThread = CreateThread( NULL, 0, threadfunc, data, 0, 0 );
    	WaitForSingleObject( hThread, INFINITE );
    	return 0;
    }
    


  • Kernel65 du bist der BESTE !!!

    Gibt es noch mehr kernel? 😉


Anmelden zum Antworten