IRC Klasse einbinden



  • Hi Joe,

    das ist erstmal allerhand.
    Vielen Dank das Du dir die Mühe machst, es so genau zu erklären. 🙂

    Ich hab jetzt erstmal ne Menge durchzuarbeiten.

    Bis dahin



  • Hi Joe,

    ein paar Probleme hab ich noch.
    1. Ich wollte, wie Du beschrieben hast bei DoReceive() die Msg abfangen.
    Mit

    AfxMessageBox(chBuf);
    

    funktioniert das auch. Jetzt wollte ich die allerdings in meinem Editfeld anzeigen lassen.

    CIrcClientDlg::m_cMsg.AddString(chBuf);
    UpdateData(FALSE);
    

    Der erkennt allerdings CIrcClientDlg nicht. Wenn ich die Header-Datei IrcClientDlg.h in die irc.h aufnehme gibt es 33 Fehler. 😞
    Was mach ich falsch? 😕

    2. Ich habe CIrcSessinoInfo um sJoin erweitert um einen Chatraum zu eröffnen/beizutreten. Die übergebe ich mit

    CString temp = "/JOIN ";
    	temp = temp + m_IrcInfo.sJoin.c_str();	
    	CIrcMessage::CIrcMessage(temp); // ist das Parsen so richtig???
    	m_MySocket.Send(temp,sizeof(temp));
    	temp = temp.Mid(1);
    	m_cMsg.AddString(temp); // Dient der eigenen Anzeige
    	UpdateData(TRUE);
    

    ich bekomme aber keine Rückmeldung über DoReceive().
    3. Wenn ich das Programm verlassen will schließe ich das über meine Logout-Taste

    m_IrcSession.Disconnect();
    

    Dann beibt das Programm hängen. Wenn ich die Verbindung aufgebaut habe und über OnClose() das Programm beende, kommt ne Fehlermeldung, die zeigt das Disconnect noch aufgerufen wird.
    4. Warum antwortet das Progamm nicht auf nen ping, bzw wo baut man sowas ein?
    Ich denke, wenn ich Antworten auf die vier Fragen bekomme, sollte das Programm laufen. Drum bitte sagt mir was ich falsch mache.



  • Letztes posting stark überarbeitet.



  • Hallo !

    Na, Du hast ja ne Menge vor, wie mir scheint !

    Nimm mir bitte folgende Aussage nicht übel, aber:
    Hast Du Dir da nicht ein bisschen zuviel vorgenommen, wenn es schon beim
    Einbinden einer Headerdatei hapert ?

    Die Klassen von Adi Degani beinhalten recht komplexe Programmiertechniken, wie z.B. das starten eines Threads, usw...

    Wie stehtst Du zu dem Vorschlag, das Du erstmal selbst z.B. ein
    Dialogbasiertes, kleines Programm schreibst, das sich mit nem IRC-Server
    verbindet.
    Dann kannst Du sehr gut sehen, wie das mit den Sockets und der Verbindungs-Reihenfolge mit einem IRC-Server funktioniert (connect, accept, receive, usw.)

    Die MFC-CAsyncSocket-Klasse bietet hierfür recht Komfortabel Funktionen an.
    Diesbezüglich helfe ich Dir gern weiter, aber mich weiterhin duch den Code-Dschungel von Adi Degani durchzuwurschteln, dazu fehlt mir jegliche Motivation.

    Gruß, Joe



  • Und Sockets werden im Buch VC++ 6 in 21 Tagen sehr gut erklärt. Such mal in der FAQ. Da gibt es den Link zum Online lésen.



  • Hi Joe,

    ich wollte nicht dass der Eindruck erweckt wird, dass Du qasi das Programm für mich schreiben sollst. Ist ja auch gar nicht nötig, hat ja Adi Degani schon getan.
    Die Sock - Klasse aus VC++ 6 in 21 Tagen habe ich auch schon programmiert und kann das jetzt auch schon besser nachvollziehen.
    Wo mir wirklich was fehlt, ist das Verständnis wie ich externe Klassen einbinde und wie ich erkenne, wo ich diese Ansprechen muß.
    z.B. das Headerproblem. Mir ist total unverständlich warum ich meine IrcClientDlg.h nicht in die irc.h einbinden kann. Oder warum ich hin und wieder mit using namesspace irc arbeiten muß.
    Ein gutes Tutorial hierüber wäre nicht schlecht.
    Ich danke dir aber trotzdem.



  • Trikor schrieb:

    Mir ist total unverständlich warum ich meine IrcClientDlg.h nicht in die irc.h einbinden kann.

    Kannst du doch. Ich versuchs mal zu erklären.
    Also. Wenn du eine neue Klasse in deinem Projekt verwenden willst, musst du natürlich ersteinmal die Klassendefinitionsdatei (cpp-Datei) deinem Projekt hinzufügen (Projekt->Dem Projekt hinzufügen->Dateien) hinzufügen. Ist ja klar, dein Programm muss ja den Code der Klassen wissen.
    Die Headerdatei deiner Klasse musst du nicht hinzufügen (da du das ja immer im Code mit #include machst), wenn du sie aber hinzufügst, hat dies den Vorteil, dass deine Klasse in der Klassenliste erscheint und die Automatische Verfollständigung /bzw. Elemente Auflistung während dem Programmieren funktioniert.
    Die Klassenheaderdateien sind (normalerweise) mit einem Schutzmechanismus versehen, dass man sie nicht doppelt includieren kann:

    #ifndef EINDEUTIGE_KONSTANTE // wenn das Symbol EINDEUTIGE_KONSTANTE noch nicht definiert ist, führe folgenden Code aus
    #define EINDEUTIGE_KONSTANTE // definiere EINDEUTIGE_KONSTANTE
    
    /* Die Deklaration der Klasse */
    #endif // Code bis hier ausführen (falls EINDEUTIGE_KONSTANTE nicht definiert war)
    

    Wenn du dein Projekt kompilierst, fügt der Compiler alle Dateien nacheinander (angefangen bei deiner "Hauptdatei") zusammen.
    Da ja jede Headerdatei (durch den Schutzmechanismus) nur einmal eingebunden wird (sonst gäbs ein Compilerfehler), ist es egal, in welchen Dateien du die Klassenheader mit #include einbindest.
    Dh. du kannst auch 40 mal #include schreiben 😃

    Hoffe ich konnte dir helfen.

    Grüße Rapha



  • Hi Rapha,

    ich glaub, ich hab das noch nicht ganz verstanden.
    Ich habe die Headerdateien (irc.h socket.h CrossThreadsMessagingDevice.h) über Project / Dateien hinzugefügt.
    In meiner Hauptdlg habe ich jetzt

    #ifndef _IRCCLIENTDLG_H 
    #define _IRCCLIENTDLG_H
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    using namespace irc;
    

    Aber jetzt erkennt die Klasse das using namespace irc nicht mehr.
    Und aus der irc.cpp kann ich immer noch nicht auf ircClientDlg zugreifen.



  • Huhu "!!!"

    Schade, wollte grade Quellcode zusammenstellen, wie man nen IRC Server connecten kann....naja..egaaal.

    Ok, Thema #include und namespace:

    Dein #include Problem könnte dieses sein:
    Du hast zwei Klassen, Klasse A und Klasse B.
    Jetzt brauchst du in Klasse A das Objekt B und umgekehrt.

    Da jetzt A von B abhängt und umgekehrt, kannst Du
    die benötigten Objekte als Zeiger deklarieren und
    fürs jeweils benötigte Objekt die Vorwärtsdeklaration benutzen.
    Ich schreibe mal ein Beispiel:

    #include "A.h"

    class B; //<---- Vorwärtsdeklaration

    class A
    {
    public:

    private:
    B* m_b;
    };

    #include "B.h"

    class A; //<---------- Vorwärtsdeklaration

    class B
    {

    public:

    private:
    A* m_a;
    };

    Also, mit Zeigern und den Vorwärtsdeklarationen funzt das 😉

    Ok, jetzt zu der Namespace-Geschichte;
    Namespace, ein Namensraum, wird benutzt, um Namenskonflikte zu
    vermeiden.
    Der arme Compiler weiss sonst gar nicht was er machen soll. *g*

    // A.h
    .....
    void Bescheid()
    {
    AfxMesageBox("Ich bin in A.h deklariert");
    } .....

    // B.h

    ....
    void Bescheid()
    {
    AfxMesageBox("Ich bin in B.h deklariert");
    }
    .....

    // Hauptprogramm

    #include "A.h"
    #include "B.h"

    Bescheid() // welches Bescheid ??

    // Ende Hauptprogramm

    Um Namenskonflikte zu vermeiden, kann man diese Namespace-Geschichte
    Benutzen.

    // A.h
    namespace A
    {
    void Bescheid
    {
    AfxMesageBox("Ich bin in A.h deklariert");
    }
    } // ende namespace

    // B.h
    namespace B
    {
    void Bescheid()
    {
    AfxMesageBox("Ich bin in B.h deklariert");
    }
    }; // ende namespace

    // Hauptprogramm

    #include "A.h"
    #include "B.h"

    ...

    using namespace A;
    Bescheid(); // Message-Box aus A.h wird aufgerufen
    ...
    // Ende Hauptprogramm

    Gruß, Joe



  • Hi Joe,

    das hast Du wirklich klasse erklärt. Danke 😃

    Wenn nicht schon 10 postings vorher wären, würd ich das für die FAQ´s empfehlen.
    Leider muß ich feststellen, das immer wenn ich ein Problem (beim Einbinden der
    Klassen von Adi Degani) gelöst habe, kommen zwei neue hinzu. 😞
    Deshalb versuche ich jetzt, wie Du sagtest mal nen IRC-Client selber zu programmieren. Hab ja schon einiges gelehrnt.
    Ich werd auf jeden Fall wissen lassen, wie es ausgeht.
    Wer weiß, vieleicht schreibe ich auch mal ein kleines Tutorial, wie man IRC in eine dialogbasierende Anwendung einbindet. Vorausgesetzt ich schaffe es. 😉
    Aber es gibt definitiv zu wenig Lektüre darüber.



  • Super, das ist der richtige Weg und die richtige Einstellung 👍


Anmelden zum Antworten