WinInet / HttpSendRequest



  • checkt mal kurz folgenden code:

    #include <windows>
    #include <wininet>
    #include <fstream>
    
    using namespace std;
    
    int err(char* fkt)
    {
    	int e = GetLastError();
    	char buffer[256];
    	wsprintf(buffer, "Error %i", e);
    	if(e != 0) MessageBox(NULL, fkt, buffer, MB_OK | MB_ICONEXCLAMATION);
    	return -1;
    }
    
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hCallerInst, LPSTR lpszCommandLine, int iCount)
    {
    	HINTERNET hInternet = InternetOpen("Test/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_FLAG_ASYNC);
    	if(! hInternet) err("InternetOpen");
    
    	HINTERNET hInternetSite = InternetConnect(hInternet, "www.keine-ahnung.de", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, NULL, 0);
    	if(! hInternetSite) err("InternetConnect");
    
    	HINTERNET hInternetSiteRequest = HttpOpenRequest(hInternetSite, "GET", "/", NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0);
    	if(! hInternetSiteRequest) err("HttpOpenRequest");
    
    	bool b = HttpSendRequest(hInternetSiteRequest, NULL, 0, NULL, 0);
    	if(! b) err("HttpSendRequest");
    
    	char buffer[1024];
    	DWORD dwRead;
    	if(! InternetReadFile(hInternetSiteRequest, buffer, 1023, &dwRead)) err("InternetReadFile");
    
    	InternetCloseHandle(hInternetSiteRequest);
    	InternetCloseHandle(hInternetSite);
    	InternetCloseHandle(hInternet);
    
    	buffer[dwRead] = 0;
    	ofstream hDatei("output.html");
    	hDatei << buffer;
    	hDatei.close();
    
    	return 0;
    }
    

    so, in "output.html" hab ich tatsächlich den korrekten inhalt stehen, aber trotzdem gibt HttpSendRequest() false zurück, denn ich erhalte:

    Error 997
    HttpSendRequest
    

    laut system-error-code-tabelle heißt 997: "Overlapped I/O operation is in progress."

    was heißt das ? ist das schlimm? und vor allem: was tu ich dagegen ?

    danke im vor*aus
    lw



  • wenn ich die zeile auskommentiere:

    //if(! b) err("HttpSendRequest");
    

    , dann steht in der ausgabe-datei plötzlich gar nix mehr. da geht doch was nicht mit rechten dingen zu. kann das mal jemand je sich compilieren, und mir sagen, was bei ihm passiert ? oder vielleicht sieht ja jemand auch so einen fehler im code.

    bitte helft mir, ich verzweifel sonst. 😮

    lw



  • Ist doch logisch: Du öffnest mit dem INTERNET_FLAG_ASYNC. Damit kehrt HttpSendRequest sofort zurück. Hättest Du mal GetLastError aufgerufen, hättest Du den Fehler 997 gesehen. Damit ist klar, daß der Request noch nicht abgeschlossen ist.

    Du willst das asynchrone Feature gar nicht verwenden, also weg mit dem Flag.

    <winerror.h> schrieb:

    //
    // MessageId: ERROR_IO_PENDING
    //
    // MessageText:
    //
    //  Overlapped I/O operation is in progress.
    //
    #define ERROR_IO_PENDING                 997L    // dderror
    


  • ich hab doch GetLastError() aufgerufen ! und ich hab auch den Fehler 997 erhalten. hab ich doch geschrieben. 🙄

    aber trotzdem danke. ich hab mich von dem satz verwirren lassen:

    This parameter can be a combination of the following values. ... INTERNET_FLAG_ASYNC ... INTERNET_FLAG_FROM_CACHE ... INTERNET_FLAG_OFFLINE

    und wil ich keine ge-cachten inhalte haben wollte, hab ich halt das erste genommen... *oops* 🤡
    jetzt hab ich dwFlags auf NULL gestzt und es geht.

    king, du hasts immer noch drauf. danke! danke! danke! 👍

    lw



  • Lawilog schrieb:

    hab ich doch geschrieben.

    Das hast Du auch. Ich habe nur Dein zweites Posting gelesen und mir dann den Code im Ersten angesehen. Soweit runter habe ich dann gar nicht mehr geschaut.
    Ich hoffe, Du lässt das als Ausrede gelten. 🙄

    Lawilog schrieb:

    jetzt hab ich dwFlags auf NULL gestzt und es geht.

    Du meinst sicher 0 und nicht NULL, dwFlags ist kein Pointer.



  • Ich hoffe, Du lässt das als Ausrede gelten.

    klar. 😉

    Du meinst sicher 0 und nicht NULL, dwFlags ist kein Pointer.

    ich dachte immer:

    #ifdef __cplusplus 
    #define NULL 0
    

    aber das soll keine grundsatzdiskusion werden und dir zu liebe werde ich natürlich 0 schreiben.

    lw


Anmelden zum Antworten