Download a File from the Internet
Am avut probleme ceva probleme cu funcţia InternetReadFile în sensul că din diferite motive un fişier de pe internet nu putea fi accesat. Astfel, funcţia îmi bloca întreaga aplicaţie, chiar dacă foloseam thread-uri. În sfârşit am găsit soluţia (care merge pe WinXP cu IE 6, dar s-ar putea să nu meargă pe versiuni mai vechi.
Soluţia este setarea unui timeout pentru conexiune cu:
InternetSetOption(NetHandle, INTERNET_OPTION_RECEIVE_TIMEOUT, @timeout, sizeof(timeout));
Întreaga funcţie e mai jos. Eu nu am nevoie să-mi dea excepţii, d-aia am comentat unele chestii.
function DownloadFile(const url: string): string;
var
NetHandle: HINTERNET;
UrlHandle: HINTERNET;
Buffer: array[0..1024] of Char;
BytesRead: dWord;
timeout: longint;
begin
Result := ”;
NetHandle := InternetOpen(‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 1.1.4322)’, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if Assigned(NetHandle) then
begin
timeout := 10000; // timeout in 10 seconds
InternetSetOption(NetHandle, INTERNET_OPTION_RECEIVE_TIMEOUT, @timeout, sizeof(timeout));
UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
if Assigned(UrlHandle) then // UrlHandle valid? then proceed with download
begin
FillChar(Buffer, SizeOf(Buffer), 0);
repeat
Result := Result + Buffer;
FillChar(Buffer, SizeOf(Buffer), 0);
InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
until BytesRead = 0;
InternetCloseHandle(UrlHandle);
end
else // UrlHandle is not valid raise an exception
//raise Exception.CreateFmt(‘Cannot open URL %s’, [Url]);
Result := ”;
InternetCloseHandle(NetHandle);
end
else // NetHandle is not valid raise an exception
//raise Exception.Create(‘Unable to initialize Wininet!’);
Result := ”;
end;
