Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.11.2009, 09:33
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию 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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:14.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter