IP mit MFC-DialogBox anzeigen lassen



  • Hallo,

    ich weiß, die Frage wurde schon mindestens zweimal gestellt hier, aber ich krieg's nicht auf die Reihe, meine "Internet!!"-IP in einer MFC-DialogBox anzeigen zu lassen. Erstens ist mein Code nicht ganz korrekt:

    CString getHtmlSource(CString url) 
    {       
          CString somecode, s;       
          CInternetSession session; 
          CInternetFile* file = NULL; 
    
          try 
          {       
             file = (CInternetFile*) session.OpenURL(url); 
          } 
          catch (CInternetException* m_pException) 
          {       
             file = NULL; 
             m_pException->Delete(); 
          } 
    
          if(file) 
          {       
             while (file->ReadString(somecode) != NULL) 
             { 
                s = s + somecode; 
             } 
          } 
    
          file->Close(); 
          s.Delete(0,20) 
          return s; 
    }
    

    Ich erhalte folgende Fehlermeldungen:
    error C2601: 'getHtmlSource' : local function definitions are illegal
    error C2958: the left parenthesis '(' found at 'C:\PROGRAMME\MICROSOFT VISUAL STUDIO\MYPROJECTS\IPAdresse\IPAdresseDlg.cpp(191)' was not matched correctly

    Und dann weiß ich nicht, wie ich das mit dem IP-Control Button richtig einbinde.

    Oh mein Gott, das sind ja richtig viele Fragen. Trotzdem vielen Dank schonmal für eure Tipps 😃



  • Ach so, hab vergessen zu sagen, dass ich meine IP von der Website [url]http://checkip.dyndns.org/ [/url] ziehen will...



  • CString HierFehltDerNameDeinerKlasse::getHtmlSource(CString url)
    {
    ...
    }

    und das
    CString getHtmlSource(CString url);
    muss noch in die Header-Datei, falls es noch nicht da ist.
    Funktioniert der Pointer file ohne new ? Mmmhhh.....



  • isabeau schrieb:

    CString HierFehltDerNameDeinerKlasse::getHtmlSource(CString url)
    {
    ...
    }

    und das
    CString getHtmlSource(CString url);
    muss noch in die Header-Datei, falls es noch nicht da ist.
    Funktioniert der Pointer file ohne new ? Mmmhhh.....

    Hmm, bitte um Nachsicht 🙄
    Ich muss also erstmal "string.h" includieren und dann CString getHTML.... deklarieren, richtig? Ist es egal in welcher Header-Datei?
    Und "CIPAnzeigerDlg" (Das Programm heißt IPAnzeiger) wäre dann meine KLasse?!?

    Vielen Dank



  • Wenn dein Programm IPAnzeiger heisst, hast du eine CIPAnzeigerDlg.h und eine CIPAnzeigerDlg.cpp welche beide zu dem Dialog gehören, der bereits in dem Projekt vorhanden ist.
    Wenn du die Funktion getHtmlSource(CString url) nutzen willst, musst du die Zeile
    CString getHtmlSource(CString url);
    in die Header-Datei schreiben, am besten irgendwo unterhalb vom Konstruktor, also unter der Zeile
    CIPAnzeigerDlg();
    Schreib es einfach unter die Zeile
    public:

    Dein geposteter Code gehört in die CIPAnzeigerDlg.cpp (einfach ans Ende schreiben) und die Zeile
    CString getHtmlSource(CString url)
    {
    ...
    }
    ändern in
    CString CIPAnzeigerDlg::getHtmlSource(CString url)

    Dann ist die Funktion vorhanden, wird aber noch nicht benutzt. Für den Aufruf brauchst du noch sowas wie die Zeile
    getHtmlSource("http://www.c-plusplus.net/forum");
    z.B. in einer Funktion von einem Button oder so.

    [edit]
    Steht die IP dann in dem HTML-Code von der Seite ? Müsste man dann noch extrahieren. Die Funktion sieht eher so aus, als ob sie den html-Code von einer ganzen Seite zurück gibt...
    [/edit]



  • Erstmal vielen Dank für deine Hilfe, isabeau.

    Ich hab jetzt alles so gemacht, wie du es geschrieben hast, bekomme jetzt aber eine Unmenge von Fehlermeldungen:

    C:\Programme\Microsoft Visual Studio\MyProjects\IPAnzeiger\IPAnzeigerDlg.cpp(175) : error C2065: 'CInternetSession' : undeclared identifier
    C:\Programme\Microsoft Visual Studio\MyProjects\IPAnzeiger\IPAnzeigerDlg.cpp(175) : error C2146: syntax error : missing ';' before identifier 'session'
    C:\Programme\Microsoft Visual Studio\MyProjects\IPAnzeiger\IPAnzeigerDlg.cpp(175) : error C2065: 'session' : undeclared identifier
    C:\Programme\Microsoft Visual Studio\MyProjects\IPAnzeiger\IPAnzeigerDlg.cpp(176) : error C2065: 'CInternetFile' : undeclared identifier
    C:\Programme\Microsoft Visual Studio\MyProjects\IPAnzeiger\IPAnzeigerDlg.cpp(176) : error C2065: 'file' : undeclared identifier
    C:\Programme\Microsoft Visual Studio\MyProjects\IPAnzeiger\IPAnzeigerDlg.cpp(176) : error C2106: '=' : left operand must be l-value
    C:\Programme\Microsoft Visual Studio\MyProjects\IPAnzeiger\IPAnzeigerDlg.cpp(180) : error C2059: syntax error : ')'
    C:\Programme\Microsoft Visual Studio\MyProjects\IPAnzeiger\IPAnzeigerDlg.cpp(182) : error C2061: syntax error : identifier 'CInternetException'
    C:\Programme\Microsoft Visual Studio\MyProjects\IPAnzeiger\IPAnzeigerDlg.cpp(182) : error C2310: catch handlers must specify one type
    C:\Programme\Microsoft Visual Studio\MyProjects\IPAnzeiger\IPAnzeigerDlg.cpp(185) : error C2065: 'm_pException' : undeclared identifier
    C:\Programme\Microsoft Visual Studio\MyProjects\IPAnzeiger\IPAnzeigerDlg.cpp(185) : error C2227: left of '->Delete' must point to class/struct/union
    C:\Programme\Microsoft Visual Studio\MyProjects\IPAnzeiger\IPAnzeigerDlg.cpp(188) : error C2317: 'try' block starting on line '179' has no catch handlers
    C:\Programme\Microsoft Visual Studio\MyProjects\IPAnzeiger\IPAnzeigerDlg.cpp(190) : error C2227: left of '->ReadString' must point to class/struct/union
    C:\Programme\Microsoft Visual Studio\MyProjects\IPAnzeiger\IPAnzeigerDlg.cpp(190) : fatal error C1903: unable to recover from previous error(s); stopping compilation

    Die IP-Adresse wollte ich mir von der Seite http://checkip.dyndns.org/ ziehen. Die zeigt nur meine momentane IP an, sonst nichts, deswegen würde sich dass extrahieren aus dem HTML-Code anbieten, dachte ich. Ich wollte die IP dann eigentlich mit dem Controlbutton "IP Adress" wiedergeben. Kann man doch so machen, oder?



  • Versuch mal
    #include <afxinet.h>
    an den Anfang von CIPAnzeigerDlg.cpp zu schreiben (wenn da schon irgendwelche include-Anweisungen stehen, dann darunter).



  • Das hat geklappt. Vielen, vielen Dank. Jetzt muss ich nur noch schauen, wie ich die am besten wiedergebe. (Also Button, oder IP Adress Controll-Button oder so)

    Kannst du mir bitte nochmal schreiben, für was die afxinet-Bibliothek so zuständig ist?



  • Hmm, sorry, aber ich bekomme das nicht so richtig hin. Ich habe jetzt einen Controll-Button "IP Adress" und versuche nun den HTML-Code (der wie gesagt nur aus der IP-Adresse besteht) damit wiederzugeben.

    getHtmlSource("http://checkip.dyndns.org/");
    return HtmlSource;
    

    So klappt's leider nicht.

    Noch ne Idee?

    (Ich glaube ich werde für deine umfassende Hilfe das Programm, wenn's denn mal fertig wird, auf deinen Namen taufen:) )



  • Zu afxinet-Bibliothek:
    ich habe nicht die blasseste Ahnung, was das für ein Teil ist. Ich habe nur 'CInternetSession' aus deinem Text kopiert und in die MSDN-Suche eingefügt. Dort steht, dass CInternetSession #include <afxinet.h> benötigt. Mehr nicht.

    Und getHtmlSource(CString url) hat einen Rückgabewert vom Typ CString. Schreib mal das in die Funktion von deinem Button:
    CString strHTMLText = "";
    strHTMLText = getHtmlSource("http://checkip.dyndns.org/");
    AfxMessageBox(strHTMLText);
    Dann sollte eine MessageBox erscheinen, die dir das anzeigt, was getHtmlSource "erzeugt".



  • Super, vielen Dank. Klappt jetzt erstmal.

    Leider hattest du schon recht, wenn man jetzt den Button drückt erhält man eine Messagebox mit:

    "<html><head><title>Current IP Check</title></head><body>Current IP Address: 217.135.11.101</body></html>".

    Das will ich aber wenn möglich vermeiden. Kennst du eine Funktion, die mir nur die Zahlen ausgibt? Oder kann man vielleicht mit dem Control "IP Adress" arbeiten?



  • Noch was:

    Was bedeutet denn in deinem Code:

    CString strHTMLText = ""; 
    strHTMLText = getHtmlSource("http://checkip.dyndns.org/"); 
    AfxMessageBox(strHTMLText);
    

    Das Afx vor Messagebox? Hab ich noc nie gelesen. Was hat das denn für eine Funktion?



  • Die normale MessageBox macht manchmal Probleme und braucht so viele Parameter... Ich nehme immer die AfxMessageBox, aber wo die jetzt genau herkommt... ?!?

    Probier mal:

    CString strHTMLText = ""; 
    strHTMLText = getHtmlSource("http://checkip.dyndns.org/"); 
    AfxMessageBox(strHTMLText);
    int i = strHTMLText.Find("Address:");
    int n = strHTMLText.Find("<", i);
    strHTMLText = strHTMLText.Mid(i+10, n-i);
    AfxMessageBox(strHTMLText);
    

    Ist nicht so schön, könnte aber klappen. Evtl. müssen die Zahlen noch um ein paar Werte nach oben oder unten verschoben werden, damit sie genau den gewünschten Substring ausschneiden, habe ich jetzt nicht ausprobiert.

    [edit] ...jaja, sieht mit Code-Tags besser aus... 😃 [/edit]



  • Ihr seit mir ja Helden...
    Man sollte das auch ohne Inetseite schaffen 😉

    http://c-plusplus.net/forum/viewtopic.php?t=77199&highlight=ip

    Devil



  • *g* das kann ja jeder 😃
    [rausreden]...öhm,... Bedingung des Fragenden war das Ermitteln der IP über die angegebene URL (siehe 2. Posting) [/rausreden]



  • Hmm, jetzt zeigt er mir aber 2 MessageBoxes. Eine mit dem kompletten HTML-Code die zweite dann mit dem definiertem Fragment....



  • Unschön ist es eigentlich auch. Wo könnte ich denn nachlesen, wie ich sowas mit dem "IP Adress" Button mache. Oder hat vielleicht jmd. einen ausführlichen Tipp *hüstel*

    Danke schonmal im Voraus



  • Zu den MessageBoxen:
    das war ja nur, um die jeweiligen Inhalte anzuzeigen. Die 1. MessageBox kannst du weglöschen. Und bei der 2. hast du jetzt eine Möglichkeit, wie du an die IP kommst. Den String kannst du jetzt z.B. nach Punkten unterteilen (mit Find() und Mid(...) wie bereits gemacht), in Zahlen umwandeln (mit atoi(..)) und in ein IP-Kontrol schreiben oder als String belassen und in ein Editfeld schreiben oder in der MessageBox lassen oder...

    Zu deinem IP-Ctrl:
    - Strg-Taste gedrückt halten und im Resourcen-Editor auf das IP-Control klicken -> eine Membervariable der Kategorie Control erstellen (z.B. m_IP)
    - im Code:
    m_IP.SetAddress(168,108,108,106);
    ...und schon steht das drin. Wenn du da andere Zahlen haben willst: siehe fettgedrucktes oben.

    ..und ja, es ist unschön über die Web-Site zu gehen



  • Das werd ich mal heute abend ausprobieren vielen Dank jedenfalls.

    Ich hab gemerkt, dass 2 Messageboxes kamen, weil der String plötzlich zu lange war. Ich hab noch nicht ganz verstanden, wie ich den kompletten String den abschneiden und nur ein bestimmtes Fragment anzeigen lassen kann??

    Nochmals vielen Dank



  • isabeau schrieb:

    Und bei der 2. hast du jetzt eine Möglichkeit, wie du an die IP kommst. Den String kannst du jetzt z.B. nach Punkten unterteilen (mit Find() und Mid(...) wie bereits gemacht), in Zahlen umwandeln (mit atoi(..)) und in ein IP-Kontrol schreiben oder als String belassen und in ein Editfeld schreiben oder in der MessageBox lassen oder...

    Also, ich weiß nicht genau, wie das mit Find(), MID() bzw. atoi funktioniert???


Log in to reply