Здравствуйте, в этой стать, я хотел бы рассказать, как я в своих проектах делаю поддержку обновлений программы (выдача ссылки на новую версию программы). Кроме обновления программы (выдача ссылки на скачку новой версии программы), я расскажу, как именно сделать проверку на наличие новой версии программы. У кого-то есть свои может примеры, свои алгоритмы, но я расскажу какой прием именно я применяю. Что нам понадобится для этого — нам понадобится какой-нибудь фтп-сервер, где будет храниться наша обновленная версия программы, а также информация о текущей версии программы. Это может быть не обязательно фтп-сервер, это может быть какой-нибудь файлообменник, но на все эти файлы (программу обновленную и файл с версией программы) обязательно должны быть постоянные ссылки. Если есть фтп-сервер, то на нем необязательно должны быть постоянные ссылки, там можно создать папку и просто сканировать ее на файлы, которые там есть. Тем более, если кто-то занимается серьезно разработкой программного обеспечения и распространяет его, то наверняка должен быть у данного разработчика сайт, а вместе с ним и фтп, так что для обновлений я думаю Вам не жаль будет 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('http://devdelphi.ru/update/version.txt');
    if version=Label1.Caption then
     begin
      Application.MessageBox('У Вас самая новая версия программы','Внимание',MB_OK);
     end
    else
     begin
      Application.MessageBox('Появилась новая версия программы, ее можно скачать'+#13#10+'http://devdelphi.ru/update/project.exe','Внимание',MB_OK);
     end;
   except
    on e:Exception do
     //-//-//-//-//-//
   end;
end;
Это тестовый пример, Вы можете изменить в программе версию программы и увидите, что Вам покажет сообщение о том, что есть новая версия программы, а это уже гарантирует о том, что мы сделали все верно и что обновление нашей программы будем работать правильно. Так что делайте поддержку обновлений в Ваших проектах, экономьте время пользователей Ваших разработок.
Вообщем как-то так я делаю поддержку обновлений в своих программах, вроде бы меня все устраивает.
Хочу заметить, что в настоящее время очень популярна sms рассылка, которая помогает донести до Ваших клиентов, пользователей какие-то сведения за короткий промежуток времени. Так вот sms маркетинг поможет быстро оповести Ваших покупателей, поставщиков о чем-то за короткий промежуток времени, так что экономьте свое время.
Исходник статьи можете скачать тут

Метки: , ,




К записи “Поддержка обновлений в программе” оставлено комментариев: 32.

  1. Nezaam:

    Занятный пример. )

  2. ter:

    для хранения номера версии в программе рекомендую ознакомится с пунктов Version Info в настройках проекта Project options.

  3. WoodHead:

    «Кроме этого сразу же из программы можно и скачать последнюю версию, это очень удобно для пользователя, а также он экономит свое время.»

    Как это сделать из программы? Или подразумевалось, что запустится установленный в операционной системе браузер, с помощью которого можно будет скачать новую версию программы? ИМХО, тогда проще просто ссылку дать, а дальше пусть пользователь сам решает, качать или нет.

  4. Andrey53:

    2WoodHead в примере это и реализовано, то есть я просто ссылка даю на скачку новой версии, можно сделать, чтобы скачка происходила внутри программы, с помощью того же самого TIdHTTP

    2ter спасибо, обязательно посмотрю

  5. http://www.rsdn.ru/forum/delphi/3572022.1.aspx

    Здесь я приводил пример организации обновления ПО через Инет.
    Возможно, будет полезно.

  6. Я использую такой вариант обновления.

    Файлы обновления создаю запуском
    Сначала заливаю на сервер, затем запускаю
    [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 загружаеются.

  7. Игорь:

    Ура!!!!! Получилось. Автору спасибо.

  8. Mrak:

    Можете подсказать, а как сделать так, чтобы программа заходила на сайт раз в 1 час но просто для активации никого кода.
    Заранее благодарен.

  9. Mrak:

    Я извиняюсь конечно, а не могли бы вы показать. Я просто только начал программировать и ещё не всё понял.
    И ещё при проверке программы 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.

  10. Mrak:

    Спасибо и на этом.

  11. прчина: ошибки IdHTTP нет в uses. решение: в билдере перейдите на вкладку indy clients положите компонент TIdHTTP на форму программы.

  12. Mrak:

    Ура заработало!!!! Автору СПС, и тебе Lesnik)))
    А может кто-то написать как правильно таймер настроить на отсчёт времени, и выполнения действия. Буду признательно благодарен.

  13. Mrak:

    Я имею ввиду, какое действие нужно написать, чтобы таймер отсчитывал время, и после окончания этого периода он нажимал некую «Кнопку», которая в свою очередь переадресовывается на какой то сайт.
    Заранее благодарен

    • Andrey53:

      на единственное событие OnTimer пишется код Button1Click(Sender), а на OnClick Button1 пишете код который требуется, в свойстве Таймера Interval в милисекундах указывается время, через которое Вам необходимо запустить обработчик

  14. Aqel:

    У меня почему то не работает…
    Меняю версию в файле (на сервере), а прога пишет, что новой версии нет.
    Код проверил всё так же. :-(
    Помогите пожалуйста!

  15. demon-sheff:

    А как сделать чтобы оновления шли не через сайт а через ftp? Может кто-нибудь объяснить?

    • Andrey:

      то же самое, Вам необходимо использовать только компонент TIdFTP и на своем фтп разместить файл update.txt например!

  16. demon-sheff:

    Я делаю так:
    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

  17. demon-sheff:

    да, конечно. пока проблему так и не получилось решить(

  18. q:

    не работает, у меня версия объявлена глобально ver : String=’1.0′; и когда сравниваю if version=ver then все время говорит что доступно обновление, хотя версия в файле такая же как и ver

    • Andrey:

      а Вы выведете version и ver при помощи ShowMessage сравните их, и вообще было бы хорошо увидеть код и файл, что Вы записываете версию!

  19. Max:

    В проге ActualInstaller реализован схожий процесс проверки обновлений программы.

  20. Я использовал тоже GetInetFile только дорабатывал систему. На соединении с низкой скорость часто форма зависала пользователь думал что все и в итоге программа не скачивалась на этот я делал откат обновления и дописал проверку корректности скачанного через проверку md5-хэша. http://myshinobi.ru/kak-sdelat.....na-delphi/ Посмотри те может вам будет интересно.

  21. Все эти обновления при проверке сайтом virustotal постоянно регистрируются как вирус или подозрительная деятельность, а это может отпугнуть некоторых пользователей. Сам думаю из своих программ убирать эти обновления, кому нужно тот сам проверит если новая версия

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*