InternetReadFile()- Buffer Problem



  • Hallo !

    Ich habe folgendes Problem: Ich lasse mit dem Code unten eine Datei aus dem Internet
    herunterladen. Wie kreig ich das jetzt hin das ich am ende die Komplette Datei
    in einem Buffer habe ? Weil wenn ich das so mache wird der Buffer immer wieder
    überschrieben.

    Danke

    bool CProgUpdate::GetUpdateInformation(HWND hWnd,HWND hProgressControl,int nDlgItem,int nDlgItem2)
    {
    DWORD dwRead=0;
    DWORD fsize;
    int i=0;
    char *chRead;
    char stat[MAX_PATH];
    
    hTmpFile=InternetOpenUrl(hIntSession,"...",NULL,0,INTERNET_FLAG_RELOAD,0);
    
    fsize=InternetSetFilePointer(hTmpFile,0,NULL,FILE_END,0);
    
    InternetCloseHandle(hTmpFile);
    
    hFile=InternetOpenUrl(hIntSession,"...",NULL,0,INTERNET_FLAG_RELOAD,0);
    
    if(hFile==NULL)
    {
    InternetCloseHandle(hFile);
    SetWindowText(GetDlgItem(hWnd,nDlgItem),"Fehler bei Downloaden...");
    return false;
    }
    
    SetWindowText(GetDlgItem(hWnd,nDlgItem),"Download...");
    
    SendMessage(hProgressControl,PBM_SETRANGE,0,MAKELPARAM(0,fsize/1000));
    SendMessage(hProgressControl,PBM_SETSTEP,(WPARAM)1,0);
    
    chRead=(char*)malloc(fsize);
    
    do
    {
    i++;
    InternetReadFile(hFile,&chRead,1,&dwRead);
    sprintf(stat,"%d kB von %d kB heruntergeladen",i/1000,fsize/1000);
    SetWindowText(GetDlgItem(hWnd,nDlgItem2),stat);
    SendMessage(hProgressControl,PBM_SETPOS,i/1000,0);
    }
    while(dwRead);
    
    InternetCloseHandle(hFile);
    
    SetWindowText(GetDlgItem(hWnd,nDlgItem),"Download erfolgreich abgeschlossen...");
    
    return true;
    }
    


  • Also, du hast einen passenden Puffer und bekommst eine Datei in kleinen Stückchen, die du nacheinander immer wieder an den Anfang des Puffers schreibst. Das funktioniert natürlich nicht.
    Richtig wäre es, die Stücke aneinanderzureihen, sprich den Puffer von vorne der Reihe nach mit Daten zu füllen.

    char *chReadCur;  //--- Lese-Zeiger auf die aktuelle Stelle innerhalb des Pufffers 
    ...
    
    chRead=(char*)malloc(fsize); 
    chReadCur = chRead;   //--- Lese-Zeiger auf Anfang des Puffers setzen
    do { 
        i++; 
        InternetReadFile(hFile, &chReadCur, 1,&dwRead);  //--- Daten an die Stelle des Lese-Zeigers übertragen
        sprintf(stat,"%d kB von %d kB heruntergeladen",i/1000,fsize/1000); 
        SetWindowText(GetDlgItem(hWnd,nDlgItem2),stat); 
        SendMessage(hProgressControl,PBM_SETPOS,i/1000,0); 
        chReadCur += dwRead;  //--- Lese-Zeiger um Anzahl der gelesenen Bytes erhöhen
    } while(dwRead);
    

    ➡ Jetzt hast du die Datei in einem Stück. 😉


Anmelden zum Antworten