Здравствуйте, в этой стать, я хотел бы рассказать, как я в своих проектах делаю поддержку обновлений программы (выдача ссылки на новую версию программы). Кроме обновления программы (выдача ссылки на скачку новой версии программы), я расскажу, как именно сделать проверку на наличие новой версии программы. У кого-то есть свои может примеры, свои алгоритмы, но я расскажу какой прием именно я применяю. Что нам понадобится для этого — нам понадобится какой-нибудь фтп-сервер, где будет храниться наша обновленная версия программы, а также информация о текущей версии программы. Это может быть не обязательно фтп-сервер, это может быть какой-нибудь файлообменник, но на все эти файлы (программу обновленную и файл с версией программы) обязательно должны быть постоянные ссылки. Если есть фтп-сервер, то на нем необязательно должны быть постоянные ссылки, там можно создать папку и просто сканировать ее на файлы, которые там есть. Тем более, если кто-то занимается серьезно разработкой программного обеспечения и распространяет его, то наверняка должен быть у данного разработчика сайт, а вместе с ним и фтп, так что для обновлений я думаю Вам не жаль будет 50 мб свободного места на Вашем фтп-сервере, а то и меньше. Далее мы создаем на нашем фтп-сервере папку update, например, в которой будет находиться текстовый файл и сама обновленная программа (файл программы с последней версии). В самом текстовом файле у нас будет храниться текущая версия нашей программы, кроме этого в одном текстовом файле, если у Вас несколько программ, в которых необходимо сделать обновление программы, можно хранить версии для всех Ваших программ. После того, как у нас создана папка на фтп-сервере и там подготовлен файл, где хранятся наши версии программ, нам необходимо записать туда текущую версию программа в данный текстовый файл. После этого в нашей программе необходимо также написать версию программы, например записать в какой-нибудь TLabel, который находится во вкладке о программе и на нем будет написана текущая версия программы. Можно хранить версию в программе в каком-нибудь текстовом файле, в ini-файле, в реестре, без разницы, кому как удобно это делать.
В итоге у нас получается следующее: есть программа, на фтп-сервере есть текстовый файл, в котором хранится текущая версия программы, например 1.0.1, в самой программе (в реестре, в ini-файле) также записана текущая версия программы — 1.0.1. Что мы делаем дальше, дальше мы добавляем пункт меню или кнопку в программу, что-то наподобии — «Проверка обновлений» и по нажатию на эту кнопку мы будем сверять версию, что находится на сервере, с версией, которая находится в программе, если они совпадают, то выводим сообщение о том, что у Вас самая новая версия программы, если они не совпадают, то выводим сообщение о том, что появилась новая версия программы и показываем ссылку на скачку, либо говорим о том, что можно скачать на сайте разработчика новую версию программы. Насчет ссылки на программу, можно ее сразу вшить в программу, если делать ее постоянной, например вот такой http://site/update/program.exe, то есть на сервере придется просто заменять exe файл программы, а ссылка у нас будет постоянной, можно просканировать папку на фтп-сервере на наличие exe-файлов и выдать тот файл, который там находится, но в данном случае мы сделаем как постоянная ссылка на файл программы.
Делать наличие проверки обновлений у себя в программе очень удобно и популярно, так как пользователь пользуется программой и может сделать проверку обновлений в любое время, при этом ему ненадо заходить на сайт и смотреть последнии версии программы и качать ее. Кроме этого сразу же из программы можно и скачать последнюю версию, это очень удобно для пользователя, а также он экономит свое время. Для получения версии программы на фтп-сервере мы будем использовать компонент TIdHTTP, кроме этого нам понадобится кнопка TButton, по нажатию на которую и будет производиться проверка обновлений. Что происходит с программами, которые у пользователей. Допустим, у нас на сервере записана версия программы 1.0.1, в программе также записана версия программы 1.0.1, мы выпускаем новую версию программы, в самой программе мы меняем версию программы (в текстовом файле, в TLabel, просто записать как обычной константой), например, на 1.0.2, на сервере делаем тоже самое, в текстовом файле мы ставим 1.0.2. Далее у пользователя, у которого версия программы 1.0.1, он нажимает на кнопку «Проверить обновление», сверяются версии на фтп-сервере и в программе, естественно они не совпадают и пользователю предлагают скачать новую версию программы.
Далее, когда он скачивает, то в новой версии программы вшита версия программы, точно такая же как и на сервере, в итоге он уже не сможет ее обновить, пока не выйдет следующая версия, и пока не измениться версия на фтп-сервере. Итак, я написал следующий код программы, который проверяет наличие обновлений
procedure TForm1.Button1Click(Sender: TObject);
var
version:WideString;
begin
try
version:=IdHTTP1.Get('https://zaokomtek.ru/update/version.txt');
if version=Label1.Caption then
begin
Application.MessageBox('У Вас самая новая версия программы','Внимание',MB_OK);
end
else
begin
Application.MessageBox('Появилась новая версия программы, ее можно скачать'+#13#10+'https://zaokomtek.ru/update/project.exe','Внимание',MB_OK);
end;
except
on e:Exception do
//-//-//-//-//-//
end;
end;
Это тестовый пример, Вы можете изменить в программе версию программы и увидите, что Вам покажет сообщение о том, что есть новая версия программы, а это уже гарантирует о том, что мы сделали все верно и что обновление нашей программы будем работать правильно. Так что делайте поддержку обновлений в Ваших проектах, экономьте время пользователей Ваших разработок.
Вообщем как-то так я делаю поддержку обновлений в своих программах, вроде бы меня все устраивает.
Хочу заметить, что в настоящее время очень популярна sms рассылка, которая помогает донести до Ваших клиентов, пользователей какие-то сведения за короткий промежуток времени. Так вот sms маркетинг поможет быстро оповести Ваших покупателей, поставщиков о чем-то за короткий промежуток времени, так что экономьте свое время. |
Исходник статьи можете скачать тут
Метки: TidHTTP, обновление, обновление программы
Занятный пример. )
для хранения номера версии в программе рекомендую ознакомится с пунктов Version Info в настройках проекта Project options.
«Кроме этого сразу же из программы можно и скачать последнюю версию, это очень удобно для пользователя, а также он экономит свое время.»
Как это сделать из программы? Или подразумевалось, что запустится установленный в операционной системе браузер, с помощью которого можно будет скачать новую версию программы? ИМХО, тогда проще просто ссылку дать, а дальше пусть пользователь сам решает, качать или нет.
2WoodHead в примере это и реализовано, то есть я просто ссылка даю на скачку новой версии, можно сделать, чтобы скачка происходила внутри программы, с помощью того же самого TIdHTTP
2ter спасибо, обязательно посмотрю
http://www.rsdn.ru/forum/delphi/3572022.1.aspx
Здесь я приводил пример организации обновления ПО через Инет.
Возможно, будет полезно.
Я использую такой вариант обновления.
Файлы обновления создаю запуском
Сначала заливаю на сервер, затем запускаю
[code]update.exe createxml http://website/mysoft/ [/code]
в папке mysoft лежат файлы для обновления.
На выходе получаю такой вот xml
[code]
myprog.exe
CCEA9822
47616
http://website/mysoft/myprog.exe
dll
894A0DD2
396288
http://website/mysoft/dll/lib.dll
[/code]
файл update.exe при запуске читает update.ini с таким содержанием
[code]
[update]
URL=http://website/myprog.xml
MainFile=myprog.exe
[/code]
myprog.xml — xml файл обновлений на сервере
myprog.exe — файл программы
далее update проверяет crc файлов на диске с crc файлов из xml
файлы которые имеют разные crc загружаеются.
Ура!!!!! Получилось. Автору спасибо.
Всегда пожалуйста!
Можете подсказать, а как сделать так, чтобы программа заходила на сайт раз в 1 час но просто для активации никого кода.
Заранее благодарен.
используйте таймер
Я извиняюсь конечно, а не могли бы вы показать. Я просто только начал программировать и ещё не всё понял.
И ещё при проверке программы Delphi выдает ошибку на «version:=IdHTTP1.Get»
Что делать.
Заранее благодарен.
вот весь код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
version:WideString;
begin
try
version:=IdHTTP1.Get(‘http://aion-vincitore.ru/mmotop’);
if version=Label1.Caption then
begin
Application.MessageBox(‘Ó Âàñ ñàìàÿ íîâàÿ âåðñèÿ ïðîãðàììû’,’Âíèìàíèå’,MB_OK);
end
else
begin
Application.MessageBox(‘Ïîÿâèëàñü íîâàÿ âåðñèÿ ïðîãðàììû, åå ìîæíî ñêà÷àòü’+#13#10+’http://aion-vincitore.ru/mmotop’,’Âíèìàíèå’,MB_OK);
end;
except
on e:Exception do
//-//-//-//-//-//
end;
end;
end.
не в курсе, сайт такой, что не грузиться как положено!
Спасибо и на этом.
прчина: ошибки IdHTTP нет в uses. решение: в билдере перейдите на вкладку indy clients положите компонент TIdHTTP на форму программы.
Ура заработало!!!! Автору СПС, и тебе Lesnik)))
А может кто-то написать как правильно таймер настроить на отсчёт времени, и выполнения действия. Буду признательно благодарен.
в каком смысле правильно настроить?
Я имею ввиду, какое действие нужно написать, чтобы таймер отсчитывал время, и после окончания этого периода он нажимал некую «Кнопку», которая в свою очередь переадресовывается на какой то сайт.
Заранее благодарен
на единственное событие OnTimer пишется код Button1Click(Sender), а на OnClick Button1 пишете код который требуется, в свойстве Таймера Interval в милисекундах указывается время, через которое Вам необходимо запустить обработчик
У меня почему то не работает…
Меняю версию в файле (на сервере), а прога пишет, что новой версии нет.
Код проверил всё так же.
Помогите пожалуйста!
покажите полностью Ваш код
этого не может быть, покажи еще раз код
А как сделать чтобы оновления шли не через сайт а через ftp? Может кто-нибудь объяснить?
то же самое, Вам необходимо использовать только компонент TIdFTP и на своем фтп разместить файл update.txt например!
Я делаю так:
procedure TForm1.Timer2Timer(Sender: TObject);
Var
version:WideString;
ms:TMemoryStream;
begin
ms:=TMemoryStream.Create;
try
try
IdFTP1.Host:=’10.10.100.200′; // ftp адрес сервера
IdFTP1.Port:=21;
IdFTP1.Username:=’admin'; //логин
IdFTP1.Password:=’admin'; //Пароль
IdFTP1.Passive:=true;
IdFTP1.Connect; // .Connect(true);
AssErt(IdFTP1.Connected);
// IdFTP1.ChangeDir(‘/’);// Установить папку на сервере
IdFTP1.Get(‘Soft/update/version.ini’,true);//Файл Откуда-Куда
try
version:=IdFTP1.Get(‘Soft/update/version.ini’);
if version=Label6.Caption then
begin
Application.MessageBox(‘У Вас самая новая версия программы’,’Внимание’,MB_OK);
end
else
begin
IdFTP1.Get(‘Soft/update/Install.exe’,’c:\Install.exe’,true);//Файл Откуда-Куда
end;
except
on e:Exception do
end;
end;
finally
ms.Free; IdFTP1.Free;
end;
except
ShowMessage (‘Неудачная попытка приема файла с сервера’);
end;
end;
но у меня выдает ошибку E2250 There is no overloaded version of ‘Get’ that can be called with these arguments
а Вы поставили доступ для этого пользователя на фтп, что он может скачивать файлы
да, конечно. пока проблему так и не получилось решить(
надо смотреть сам проект!!! с виду вроде бы все нормально!
не работает, у меня версия объявлена глобально ver : String=’1.0′; и когда сравниваю if version=ver then все время говорит что доступно обновление, хотя версия в файле такая же как и ver
а Вы выведете version и ver при помощи ShowMessage сравните их, и вообще было бы хорошо увидеть код и файл, что Вы записываете версию!
В проге ActualInstaller реализован схожий процесс проверки обновлений программы.
Я использовал тоже GetInetFile только дорабатывал систему. На соединении с низкой скорость часто форма зависала пользователь думал что все и в итоге программа не скачивалась на этот я делал откат обновления и дописал проверку корректности скачанного через проверку md5-хэша. http://myshinobi.ru/kak-sdelat.....na-delphi/ Посмотри те может вам будет интересно.