Ich möchte mittels WinInet eine Datei von einer URL laden. Dabei kann es passieren, dass der Sender mittendrin mal für ca. 30-60 Sekunden mal nichts sendet. Die Verbindung wird nicht abgebrochen, sondern es wird einfach für einen Moment nichts gesendet.
Das Problem ist, dass der Aufruf von InternetReadFile das nicht mitmacht. Er wartet zwar auch für ein paar Sekunden, aber die Zeitspanne ist einfach zu kurz. Ich habe schon INTERNET_OPTION_RECEIVE_TIMEOUT gesetzt, aber das hat nichts gebracht. Vielleicht habe ich es auch falsch gesetzt, jedenfalls geht es nicht. Ich denke INTERNET_OPTION_RECEIVE_TIMEOUT ist auch eher dafür, die Gesamtlänge des Downloads zu begrenzen und nichtzwischenzeitliche Unterbrechungen.
Der gleiche Abbruch passiert übrigens auch, wenn ich mit TIdHttp lade. Wenn ich dort dann aber ReadTimeOut entsprechend setze, dann klappt es. Daher bin ich ziemlich sicher, dass es genau um diesen Wert geht.
Leider muss ich die Lösung mit WinInet hinbekommen und kann nicht auf Indy umsteigen.
Wenn jemand eine Idee hat, wäre ich sehr dankbar. Anbei noch mein Code zum Laden:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| function THttpManager.DownloadFileToStream(const aUrl: string; const pStream: TStream): Boolean; var hSession: HINTERNET; hService: HINTERNET; lpBuffer: array[0..1024 + 1] of Char; dwBytesRead: DWORD; lTimeOut: Integer; begin Result := False; hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); try if Assigned(hSession) then begin hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, 0, 0); if Assigned(hService) then begin lTimeOut := 3600000; InternetSetOption(hService,INTERNET_OPTION_RECEIVE_TIMEOUT, Pointer(@lTimeOut), SizeOf(lTimeOut));
try while True do begin dwBytesRead := 1024;
InternetReadFile(hService, @lpBuffer, 1024, dwBytesRead); if dwBytesRead = 0 then break; lpBuffer[dwBytesRead] := #0; pStream.WriteBuffer( lpBuffer, dwBytesRead ); end; Result := True; finally InternetCloseHandle(hService); end; end; end; finally InternetCloseHandle(hSession); end; end; |
Moderiert von
Gausi: Code- durch Delphi-Tags ersetzt