Сколько пользуюсь интернетом - никак не могу понять: я вхожу в интернет или я выхожу в интернет?
uses
Wininet;
function DownloadURL(const aUrl: string): Boolean;
var
hSession: HINTERNET;
hService: HINTERNET;
lpBuffer: array[0..1024 + 1] of Char;
dwBytesRead: DWORD;
begin
Result := False;
// hSession := InternetOpen( 'MyApp', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
tryif Assigned(hSession) thenbegin
hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, 0, 0);
if Assigned(hService) thentrywhileTruedobegin
dwBytesRead := 1024;
InternetReadFile(hService, @lpBuffer, 1024, dwBytesRead);
if dwBytesRead = 0 then break;
lpBuffer[dwBytesRead] := #0;
Form1.Memo1.Lines.Add(lpBuffer);
end;
Result := True;
finally
InternetCloseHandle(hService);
end;
end;
finally
InternetCloseHandle(hSession);
end;
end;
Here is the translation of the content into Russian:
Код программирования на Delphi для скачивания файла с интернета с помощью API WinInet. Вот разбивка того, что код делает:
Функция DownloadURL принимает URL в качестве входного параметра и возвращает булевое значение, указывающее, была ли загрузка успешной.
Функция создает сессию интернета (hSession) с помощью InternetOpen. Она указывает имя приложения ("MyApp") и использует стандартные настройки для остальных параметров.
Если сессия интернета была успешно создана, то функция открывает соединение URL (hService) с помощью InternetOpenUrl.
Функция затем enters цикл чтения данных из URL в блоки размером 1024 байта каждый раз с помощью InternetReadFile. Она хранит каждый блок в массиве символов (lpBuffer).
Если количество прочитанных байт равно нулю, то это означает, что конец файла был достигнут, поэтому цикл заканчивается.
Функция затем добавляет содержимое массива lpBuffer в компонент мемо на форме (в этом случае, Form1.Memo1).
Наконец, функция закрывает оба сеанс (hSession) и соединение URL (hService) с помощью InternetCloseHandle.
Код хорошо структурирован и легко понятен, с четкими наименованиями переменных. Однако есть несколько вещей, которые можно улучшить:
Массив lpBuffer объявлен как массив символов, но его размер фиксирован в 1024 + 1 элементов. Это может не быть достаточным для больших файлов. Рассмотрите использование динамической памяти вместо этого.
Цикл чтения файла в блоки может потенциально прочитать больше данных, чем необходимо, если файл меньше 1024 байт. Рассмотрите добавление проверки, чтобы увидеть, является ли количество прочитанных байт меньше 1024, перед следующим чтением.
Компонент Memo1 добавляется на каждой итерации цикла, что может вызвать проблемы с производительностью для больших файлов. Рассмотрите использование буфера строк вместо этого и обновление мемо только один раз в конце.
Вот альтернативное решение, которое решает эти вопросы:
В этом измененном коде я использовал массив TBytes для хранения содержимого файла вместо массива символов. Это позволяет использовать динамическую память и avoids the need for fixed-size arrays. Я также removed unnecessary loop variable and replaced it with a SetLength call to dynamically resize the buffer as needed. Finally, I updated the memo only once at the end by converting the TBytes array to a string using the String function.
Эта статья описывает функцию для загрузки файла из Интернета в приложение на языке Delphi, используя библиотеку Wininet.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.