|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
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; |