Używam lekko zmodyfikowanego kodu Cyrkla do pobierania pliku z internetu oraz wyświetlenia paska postępowania na Gauge'u.
uses WinInet;
const
addedNo = 1024;
var
h,
f : pointer;
r : cardinal;
buf : array[0..(addedNo-1)]of char;
size_ : dword;
plik : file;
dwBufLen,
dwIndex: DWORD;
buff : pointer;
fil_,
url_ : string;
j : integer;
begin
//pseudo-czyszczenie zmiennych
buf:='';
for j:=low(buf) to high(buf) do buf[j]:=#0;
r:=0;
//end w/w
fil_ := 'C:\pkgirl.wmv';
url_ := 'http://djprog.ovh.org/liv.wmv';
AssignFile(plik, fil_);
Rewrite(plik, 1);
h:=InternetOpen(nil,INTERNET_OPEN_TYPE_DIRECT,nil,nil,0);
f:=InternetOpenUrl(h,PAnsiChar(url_),nil,0,0,0);
dwBufLen := 1024;
dwIndex := 0;
GetMem(Buff, dwBufLen);
HttpQueryInfo(f, HTTP_QUERY_CONTENT_LENGTH, buff, dwBufLen, dwIndex);
size_ := StrToInt(StrPas(Buff));
FreeMem(Buff, dwBufLen);
Gauge1.MaxValue := size_;
repeat
InternetReadFile(f,@buf,addedNo,r);
BlockWrite(plik, buf, sizeof(buf));
Gauge1.Progress:=Gauge1.Progress+addedNo;
Application.ProcessMessages;
until Gauge1.Progress=Gauge1.MaxValue;
Seek(plik, size_);
Truncate(plik);
CloseFile(plik);
InternetCloseHandle(f);
InternetCloseHandle(h);
end;
Wszystko jest pięknie i ładnie, no problems.
Ale gdy w/w kod włożę w pętlę (zmieniając jedynie URL i nazwę pliku docelowego), to pierwszy plik z listy zostanie ściągnięty poprawnie, ale już następne nie. Ich rozmiar jest prawidłowy (zapewne przez wycięcie właściwego rozmiaru :P) lecz struktura nie - zostają zapisane złe bloki. Nie mam pojęcia dlaczego, i właśnie liczę na Waszą pomoc.
Temat stworzony również na Forum KŚE.