LiteNet.Ru - Актуально о ПК и ПО. 2006-2019.
СТАТЬИ | НОВОСТИ | ПРОГРАММЫ | ОБРАТНАЯ СВЯЗЬ | КАРТА САЙТА
Сейчас на сайте: 5 пользователей онлайн
Обновления
Материал Установил CentOS 7 как легко и просто настроить ssh доступ? [24.03.24]
Комментарии Спасибо... [17.02.24]
Материал Форма ввода php [08.05.23]
Материал Windows 11 LTSC выйдет во второй половине 2024 года [08.05.23]
Материал Microsoft прекратит выпуск обновлений для Windows 10 [29.04.23]
Комментарии Огромный респект и... [04.10.22]
Комментарии не помогло... [10.07.22]
Комментарии не получается войт... [02.11.21]
Комментарии Да нет в редакторе... [05.10.21]
Комментарии Toshiba Tecra s11 ... [21.07.21]
Комментарии Все получилось, сп... [21.07.21]
Комментарии не сработало... [04.06.21]
Комментарии Доброго времени! У... [27.03.21]
Комментарии У меня этот метод ... [19.03.21]
Комментарии всё испробовал,не ... [17.03.21]
Материал Представлена настоящая зарядка по воздуху Xiaomi Mi Air Charge [31.01.21]
Материал Отныне для запуска WhatsApp на ПК и в браузере требуется биометрия [31.01.21]
Материал Google Chrome 88.0.4324.104 [31.01.21]
Материал Avast Free Antivirus 20.10.5824 [31.01.21]
Материал Яндекс.Браузер 20.12.3.138 [31.01.21]
Материал Maxthon 6.1.1.1000 [31.01.21]
Материал MKVToolnix 53.0.0 [31.01.21]
Материал ProduKey 1.95 [31.01.21]
Комментарии Самый лучший брауз... [17.11.20]

RSS

Последние добавленные статьи

Delphi - автообновление программы через Интернет
22.05.2006

Если ваша программа содержит подключаемые модули (BPL или DLL) или есть необходимость обновлять саму программу, то наверняка стояла проблема обновления копий программы. С развитием Internet появилась прекрасная возможность сделать это быстро и красиво. В данной статье мы расскажем, как добавить опцию автообновления программ из Internet.

Delphi дает нам полный доступ к API WinInet (wininet.pas), что позволяет подключиться и скачать любой файл с указанного вебсайта, используя протоколы FTP или HTTP. Например, мы можем использовать функции API WinInet для создания FTP-браузера или программы для поиска на публичных FTP-серверах заданных файлов.

Основная функция нашей программы - GetInetFile:

uses Wininet;
function GetInetFile(const fileURL, FileName: String): boolean;
const BufferSize = 1024;
var hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: DWORD;
f: File;
sAppName: string;
begin
Result:=False;
sAppName := ExtractFileName(Application.ExeName);
hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG,
nil, nil, 0);
try
hURL := InternetOpenURL(hSession,
PChar(fileURL),nil,0,0,0);
try
AssignFile(f, FileName);
Rewrite(f,1);
repeat
InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
BlockWrite(f, Buffer, BufferLen)
until BufferLen = 0;
CloseFile(f);
Result:=True;
finally
InternetCloseHandle(hURL)
end
finally
InternetCloseHandle(hSession)
end
end;

Замечание: конечно, этот пример нужно расширить, вставив, например, код для отображения прогресса скачивания в цикл.

Использовать функцию GetInetFile очень просто:

var FileOnNet, LocalFileName: string
begin
FileOnNet:='http://www.TrueMind.ru/files/article/forum.xml';
LocalFileName:='TrueMind.xml';
if GetInetFile(FileOnNet,LocalFileName)=True then
ShowMessage('Download successful')
else
ShowMessage('Error in file download')
end;

Этот кусок кода скачивает файл с http://www.TrueMind.ru/files/article/forum.xml и записывает его в текущий каталог под именем 'TrueMind.xml'. Все очень просто.

Что еще почитать?


Оставленные комментарии:


06:12:11, 16:37 .:|:. Написал: Имя не указано
>>> А у меня скачивает всего 1.71 кб вместо 326 кб. Почему? Потомучто приведенный код кривой. Он работает только на ОЧЕНЬ хорошей линии, ибо предполагается, что передача по сети осуществляется быстрее, чем вы в цикле вычитываете данные из входного буфера. Если линия тонкая или сервак чуть притормозил, то срабатывает "until BufferLen = 0;". По уму нужно внутри ставить цикл ожидания данных while BufferLen = 0... с замером времени и выходом по таймауту, чтоб не зависнуть в ожидании данных навечно. И все равно получится полное Г., если только файл не малюсенький, ибо чтение синхронное и значит нафик все тормозит. Еще нужно бы отсекать весь файл пришел или фашисты провода перерезали... В общем, приведенный код - хорошая демонстрация того как НЕ НАДО делать закачку файлов, чтоб потом не терзаться вопросами "а почему у меня", "1 раз сработало 2 раза нет, почему?" и т.п.

06:12:11, 16:22 .:|:. Написал: BOOJUM
Я не понял причем тут "автообновление программы". Здесь рассматривается просто скачивание левого файла из инета. проблема автоообновления не стянуть файл откуда-либо (на что есть 1000 способов и тут приведен не лучший) а подменить им самого себя, что уже не так тривиально, ибо работающий exe или dll система подменить не даст, а значит нужно своим ехешником породить процесс, который завершит экзешник, поменяет файлы и запустит уже обновленный екзешник обратно, а сам завершится. И чтоб при этом такое обновление не попало в бесконечный цикл. ВЫВОД: название статьи абсолютно не соответствует содержанию.

12:08:11, 10:52 .:|:. Написал: Алексей
А у меня скачивает всего 1.71 кб вместо 326 кб. Почему?

Всего 3 комментариев


Введите Ваше имя:


Не используйте HTML и ВВ-коды - не работает. Пользуйтесь смайликами :)
Very HappySmileLaughingCoolWinkSurprised
RazzSleepSadShockedEvil or Very MadRolling Eyes

В этом поле Вы можете ввести текст комментария:


До конца всего осталось символов

Код на БОТливость: Код на БОТливость:
Введите код: