WinAPI: Скачивание HTML страницы
Есть у меня одна функция скачивания текстового файла из инета, но она работает очень тугодумно. Браузер страницу (исходник) грузит 2-3 секунды, а эта функция может думать до 1-2 минут. Притом ещё и не работает (просто виснет) в потоке. Помогите исправить изъяны:
Код:
function LoadHtml(fURL : WideString): AnsiString;
var
hInternet : pointer;
hConnect : pointer;
hRequest : pointer;
Size : cardinal;
B : boolean;
Buff : ANSIString;
ReadedSize : cardinal;
I, L : cardinal;
function OpenInternet(Name: WideString): pointer;
begin
result := InternetOpenW(@Name[1], INTERNET_OPEN_TYPE_PRECONFIG,
nil, nil, 0);
end;
function Connect(hInternet : pointer): pointer;
var
SiteURL: String;
begin
result := nil;
SiteURL := ADExtractUrlHostName(fURL);
if hInternet = nil then exit;
result := InternetConnectW(hInternet, @SiteURL[1],
INTERNET_DEFAULT_HTTP_PORT,
'anonymous', nil, INTERNET_SERVICE_HTTP, 0, 0);
end;
function NewRequest(fURL : WideString; hConnect: pointer): pointer;
begin
result := nil;
if hConnect = nil then exit;
result := HTTPopenRequestW(hConnect, nil, @fURL[1],
nil, nil, nil, INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD, 0);
end;
function SendRequest(hRequest: pointer): boolean;
begin
result := false;
if hRequest = nil then exit;
result := HTTPsendRequestW(hRequest, nil, 0, nil, 0);
end;
function DataAvailable(hRequest: pointer; out Size : cardinal): boolean;
begin
result := wininet.InternetQueryDataAvailable(hRequest, Size, 0, 0);
end;
function SizeQuery(hRequest: pointer; out Size : cardinal): boolean;
var
RSize,rv : cardinal;
p : pointer;
begin
RSize := 4;
result := HttpQueryInfoW(hRequest,
HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER,
@Size, RSize, rv);
if NOT result then Size := 0;
end;
begin
result := '';
hInternet := OpenInternet('ADworldMiniDownloader');
hConnect := Connect(hInternet);
hRequest := NewRequest(ADExtractUrlFilePath(fURL), hConnect);
if NOT SendRequest(hRequest) then
begin
if hRequest <> nil then InternetCloseHandle(hRequest);
if hConnect <> nil then InternetCloseHandle(hConnect);
if hInternet <> nil then InternetCloseHandle(hInternet);
exit;
end;
SizeQuery(hRequest, Size);
inc(Size);
SetLength(Buff, Size);
B := false;
I := 1;
while true do
begin
DataAvailable(hRequest, L);
if L = 0 then
break;
if (I + L) > Size then
SetLength(Buff, I + L);
B := InternetReadFile(hRequest, @Buff[i], L, ReadedSize);
if not B then
break;
inc(I, ReadedSize);
end;
if hRequest <> nil then InternetCloseHandle(hRequest);
if hConnect <> nil then InternetCloseHandle(hConnect);
if hInternet <> nil then InternetCloseHandle(hInternet);
Result := Buff;
end;
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
|