InternetReadFile Buffer leeren
-
Hallo Community
Ich habe ein Problem(chen) mit Wininet.
Ich möchte jede paar Minuten einen Quelltext auslesen, hier im Beispiel ist es Facebook.Meine Funktion sieht bis jetzt so aus:
char* verbinden(char *url) { HINTERNET hInternet; HINTERNET hFile; DWORD ReadSize; char szBuf[1024]; char *content; hInternet = InternetOpen("Mozilla/5.0 (Windows NT 5.1; rv:5.0.1) Gecko/20100101 Firefox/5.0.1",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0); hFile = InternetOpenUrl(hInternet,url,NULL,0,INTERNET_FLAG_RELOAD,0); if(ReadSize != 0){ InternetReadFile(hFile,&szBuf,512,&ReadSize); szBuf[ReadSize] = '\0'; return szBuf; } InternetCloseHandle(hFile); InternetCloseHandle(hInternet); }So rufe ich es auf:
cout << verbinden("http://facebook.com") << "\n\n";Das funktioniert auch soweit. Nur die Ausgabe sieht so aus:
Screenshot: http://img6.imagebanana.com/img/jppmsfgh/Unbenannt.PNG
Mir geht es nicht darum, dass nicht der ganze Quellcode der Seite angezeigt wird, denn das wäre wegen "char szBuf[1024];". Es geht mir darum dass der "szBuf" immer gefüllt wird also er wird nicht auf 0 geleert.
Das heisst, ich bekomme nur zweimal den Quelltext geliefert. (Wie man auf dem Screenshot erkennen kann)
Jetzt die Frage: Was kann ich machen, damit ich bei jedem Aufruf den Quellcode der Seite bekomme ohne das Programm neu zu starten.
Es ist nicht optimal erklärt, aber ich hoffe dennoch dass ich einige hilfreiche Antworten bekomme :=)
Liebe Grüsse,
xRevo
-
Dass es überhaupt funktioniert, ist reines Glück:
char* verbinden(char *url) // warum nicht const char* url? { HINTERNET hInternet; HINTERNET hFile; DWORD ReadSize; // nicht initialisiert char szBuf[1024]; // lokal (!) char *content; // überflüssig hInternet = InternetOpen("Mozilla/5.0 (Windows NT 5.1; rv:5.0.1) Gecko/20100101 Firefox/5.0.1",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0); // keine Fehlerprüfung hFile = InternetOpenUrl(hInternet,url,NULL,0,INTERNET_FLAG_RELOAD,0); // keine Fehlerprüfung if(ReadSize != 0){ // Auswertung der uninitialisierten Variable, wozu eigentlich? InternetReadFile(hFile,&szBuf,512,&ReadSize); // warum hier 512? Keine Fehlerprüfung szBuf[ReadSize] = '\0'; return szBuf; // Rückgabe eines Zeigers auf ein lokales Array -> UB } InternetCloseHandle(hFile); // im Erfolgsfall wird dies nicht aufgerufen InternetCloseHandle(hInternet); // dito // kein Returnwert }Also da sind schon, naja, ein paar ganz böse Fehler drin.
Zuerst könntest du die Funktion so deklarieren
bool verbinden(const char *url, char *buffer, size_t bufsize);Und anschließend mal eine Fehlerüberprüfung einbauen. Zudem könntest du dir, falls du in C++ programmieren solltest, das Stichwort RAII und die STL (-Container) anschauen.
Und sorry, den Satz
Es geht mir darum dass der "szBuf" immer gefüllt wird also er wird nicht auf 0 geleert.
verstehe ich nicht. Der Inhalt, 512 chars, wird eingelesen (wie geschrieben Glück) und du schreibst diese zeichenkette hinter die letzte Ausgabe in die Konsole.
-
Hallo
Okay vielen Dank dafür.
Es funktioniert nun.
Bzw ich habe try except auf der main.Danke für die Tipps

Liebe Grüsse,
xRevo
-
Bzw ich habe try except auf der main.
Aha. Und warum?