Autor Beitrag
dirkil2
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130



BeitragVerfasst: Do 17.12.09 16:25 
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:

ausblenden volle Höhe Delphi-Quelltext
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: stringconst pStream: TStream): Boolean;
var
  hSession: HINTERNET;
  hService: HINTERNET;
  lpBuffer: array[0..1024 + 1of Char;
  dwBytesRead: DWORD;
  lTimeOut: Integer;
//  lFileStream: TFileStream;
begin
  Result := False;
  hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nilnil0);
  try
    if Assigned(hSession) then
    begin
      hService := InternetOpenUrl(hSession, PChar(aUrl), nil000);
      if Assigned(hService) then
      begin
        lTimeOut := 3600000// in milleseconds.
        InternetSetOption(hService,INTERNET_OPTION_RECEIVE_TIMEOUT,
                      Pointer(@lTimeOut), SizeOf(lTimeOut));

        try
//          lFileStream := TFileStream.Create( pFileName, fmCreate );
          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);
          //lFileStream.Free;
        end;
      end;
    end;
  finally
    InternetCloseHandle(hSession);
  end;
end;


Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt