InternetOpenUrlA wirft Exception



  • Hallo Forum,

    ich versuche mittels des unten stehenden Codes von dieser Seite: http://www.birminghamchurches.org.uk/category/churches/page/1/?az=b
    den Quelltext herunterzuladen. Leider macht mir mein Programm ein paar Schwierigkeiten.

    Der Grund des Programms ist, dass ich gerne eine Menge Webseiten automatisiert einlesen und verarbeiten möchte.

    Im Debug Modus läuft das Programm bis über den 500. Durchlauf hinaus. Im Release Modus kommt es nur bis zum 7. und bricht mittendrin ab.

    Mir wird eine Meldung angezeigt, dass eine Exception ausgelöst worden wäre und mir wird auch angezeigt, welche Zeile diese ausgelöst hat und das Programm wird angehalten.

    Es liegt nicht an der Webseite, da ich auf diese einfach zugreifen kann. Es ist immer der 8., automatisierte Durchlauf. "Manuell" eingetippte Versuche scheinen nicht zu zählen. Am Server liegt es vermutlich auch nicht, weil der mich nicht für ein mal sperren und dann wieder 8 automatisierte Male gewähren ließe.

    Das ist der Code, den ich dazu benutze:

    #include "stdafx.h"
    #include "InformationGatherer.h"
    #pragma comment(lib,"wininet.lib") //remove if not using VC++.
    
    std::string getSource(const char* URL) {
    	std::string returned;
    
    	HINTERNET connect = InternetOpenA("MyBrowser", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    
    	if (!connect) {
    		throw fail;
    	}
    
    	HINTERNET OpenAddress = InternetOpenUrlA(connect, URL, NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_KEEP_CONNECTION, 0); //<----diese Zeile
    
    	if (!OpenAddress)
    	{
    		DWORD ErrorNum = GetLastError();
    		InternetCloseHandle(connect);
    		throw ErrorNum;
    	}
    
    	char DataReceived[4096];
    	DWORD NumberOfBytesRead = 0;
    	while (InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead)
    	{
    		returned.append(DataReceived, NumberOfBytesRead);
    	}
    
    	InternetCloseHandle(OpenAddress);
    	InternetCloseHandle(connect);
    
    	return returned;
    }
    


  • Da wird doch sicher nicht stehen, dass irgendeine Exception geworfen wurde, sondern auch der Grund und weitere zusätzliche Informationen.



  • Mir wird eine Meldung ausgegeben, dass mein Programm einen Breakpoint ausgelöst habe. Wenn ich dann auf Continue klicke, wird mir dieser Text ausgegeben:

    Unhandled exception at 0x77E1C7C9 (ntdll.dll) in [Programmname]: 0xC0000372: A heap has been corrupted (parameters: 0x77E48890).
    

    Wenn ich jetzt allerdings auf continue klicke, läuft das Programm weiter, als sei nichts passiert.

    Die erwähnte dll scheint eine sehr wichtige Komponente von Windows zu sein und Kernel Funktionen zu enthalten.



  • falls ich das richtig sehe:

    <a href= schrieb:

    https://msdn.microsoft.com/de-de/library/windows/desktop/aa385098(v=vs.85).aspx">dwContext [in]
    A pointer to a variable that specifies the application-defined value that is passed, along with the returned handle, to any callback functions.

    kein optional. also auch nicht 0.



  • @unskilled

    Ich habe, deinem Vorschlag folgend, diesen Wert durch einen Pointer ersetzt. Leider wird noch immer derselbe Fehler an derselben Stelle ausgegeben.
    Trotzdem danke schon mal.


  • Mod

    Dein Heap ist evtl. schon vorher kaputt und es kracht halt erst bei dem Aufruf...



  • Das kann sein.

    Du weißt nicht zufällig, wie ich Heap Corruption Errors debuggen könnte?

    Ich benutze VS 2015 Community mit den letzte Updates.

    Uptdate: Ich bin nun auf Strings und zur Kompilierzeit festgelegte Arraylängen umgestiegen und jetzt bekomme ich keinen Fehler mehr.
    Es stimmt wohl, was sie sagen: Finger weg von Zeigern, wenn du es nicht 100% kannst.

    Vermutlich melde ich mich später noch einmal mit einem Problem aber schon mal vielen Dank. 🙂


Anmelden zum Antworten