Автообновление программы
Модератор: Модераторы
Автообновление программы
Подскажите пожалуйста. Как лучше всего реализовать автообновление программы. Как идея, запустить скрипт? Спасибо
Моя программа скачивает txt-файл в которой стоит номер новой версии.
Если номер больше того номера, что в программе -> тогда высвечиваю иконочку, что на сайте доступна новая версия или кликнув на эту самую иконку можно напрямую скачать файл.
Если номер равен или меньше того, что в файле, ничего не делаю.
В txt-файл можно конечно и написать, что изменилось в новой версии, и выдавать этот текст.
На первое время пойдет, со временем что то поудобнее придумаю.
Если номер больше того номера, что в программе -> тогда высвечиваю иконочку, что на сайте доступна новая версия или кликнув на эту самую иконку можно напрямую скачать файл.
Если номер равен или меньше того, что в файле, ничего не делаю.
В txt-файл можно конечно и написать, что изменилось в новой версии, и выдавать этот текст.
На первое время пойдет, со временем что то поудобнее придумаю.
Программа - ланчер. Пользователь запускает всегда ее. Уже эта программа проверяет обновления, и скачивает их. А пока идет закачка - запускает предыдущую версию. Если обновление постоянно падает - ланчер запускает предыдущую, стабильную версию. Заодно и проблем и с правами на новые версии экзешника будет меньше - если новую версию ставить не в Program Files, а в какой-нибудь USER\AppData.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
McLion писал(а):Моя программа скачивает txt-файл в которой стоит номер новой версии.
Если номер больше того номера, что в программе -> тогда высвечиваю иконочку, что на сайте доступна новая версия или кликнув на эту самую иконку можно напрямую скачать файл.
Если номер равен или меньше того, что в файле, ничего не делаю.
В txt-файл можно конечно и написать, что изменилось в новой версии, и выдавать этот текст.
На первое время пойдет, со временем что то поудобнее придумаю.
Да, также планирую сделать автообновление. Заодно можно сделать отображение изменений в окошке about. Вот только пока не решил как сделать, чтобы ссылка была скрытой. Программа платная и нужно сделать так, чтобы ссылка для скачивания не попала в паблик. Возможно придется делать эту ссылку динамической, путь к которой будет шифроваться на стороне сервере и по аналогичному алгоритму программа бы определяла этот путь динамически. К примеру в зависимости от версии, а еще лучше юзера и md5 (к примеру) шифрование конечно.
У меня так.
В программе включена нумерация версий. Сама программа находится в репозитарии (через ftp). При запуске идет проверка на соответствии номера версии в программе с названием пакета (нумерации) в репозитарии.
P/S ну естественно онное реализовано под linux
В программе включена нумерация версий. Сама программа находится в репозитарии (через ftp). При запуске идет проверка на соответствии номера версии в программе с названием пакета (нумерации) в репозитарии.
P/S ну естественно онное реализовано под linux
Ichthyander писал(а):Программа платная и нужно сделать так, чтобы ссылка для скачивания не попала в паблик. Возможно придется делать эту ссылку динамической, путь к которой будет шифроваться на стороне сервере и по аналогичному алгоритму программа бы определяла этот путь динамически.
А почему нельзя сделать две ссылки? Одна для скачивания полной платной программы, а вторая только для скачивания обновлений, в наборе которых будет отсутствовать что то типа библиотеки авторизации или т.п.
Ну а как земнять бинарник уже работающей программы?
У меня на сервере лежит файлик с полным списком всех файлов программы с каталогами.
структура примерно такая
путь_к_обекту_обьект |признак каталога| контрольная_сумма|
прога когда надо качает файл и проверяет все свои файлы , если какой то файл отличается от того что на сервере то она качает только его.
Добавлено спустя 1 минуту 38 секунд:
bogdan
не знаю как в фри паскале но в делфи можно .exe работающей программы можно переименовать. получить новый, а затем попросить пользователя перезапустить программу.
структура примерно такая
путь_к_обекту_обьект |признак каталога| контрольная_сумма|
прога когда надо качает файл и проверяет все свои файлы , если какой то файл отличается от того что на сервере то она качает только его.
Добавлено спустя 1 минуту 38 секунд:
bogdan
не знаю как в фри паскале но в делфи можно .exe работающей программы можно переименовать. получить новый, а затем попросить пользователя перезапустить программу.
- Little_Roo
- энтузиаст
- Сообщения: 639
- Зарегистрирован: 27.02.2009 18:56:36
- Откуда: Санкт-Петербург
Вот у меня (подсмотрел где-то...уже не помню, но работает)
Проверка не по номеру версии , а времени компиляции
Lazarus 1.5 rUnknown FPC 3.1.1 i386-win32-win32/win64
WinXP SP3 32 bit
Код: Выделить всё
procedure Tloginform.FormShow(Sender: TObject);
var
res: Boolean;
iLDate, iRDate: TDateTime;
begin
//--!!!!!!!!! AUTO UPDATE PROGRAMM !!!!!!!!!!! ////////
iLDate:=FileDateToDateTime(FileAge(Application.ExeName));
if not FileExists('\\192.168.18.95\ExeLib\'+ ExtractFileName(Application.ExeName)) then exit;
iRDate:=FileDateToDateTime(FileAge('\\192.168.18.95\ExeLib\'+ ExtractFileName(Application.ExeName)));
if iLDate >= iRDate then exit else Application.MessageBox(' Обнаружена НОВАЯ версия программы !'+ #13#13 +
' Нажмите ОК для обновления ...'+ #13#13 +
' И ПЕРЕЗАПУСТИТЕ ПРОГРАММУ '+ #13#13 ,
' Обновление программы мониторинга...',mb_IconExclamation + mb_OK);
// Удаляет файл созданный в предыдущем сеансе
res := DeleteFile(Application.ExeName + '.bak'); //TRUE
// Сам себя удалить не может!
//////////////// res := DeleteFile(Application.ExeName); //FALSE
// Переименование запущенного ехе-шника
MoveFile(PChar(Application.ExeName),PChar(Application.ExeName + '.bak')); // TRUE
// НЕ Удаляет файл созданный в текущем сеансе
res := DeleteFile(Application.ExeName + '.bak'); //FALSE
// Копирование вак-файла на место и с именем текущего запущенного ехе-шника
CopyFile(PChar('\\192.168.18.95\ExeLib\'+ ExtractFileName(Application.ExeName)),PChar(Application.ExeName),True); // TRUE
// Запуск нового ехе-шника (старый [текущий] еще активный)
WinExec(PChar(Application.ExeName), SW_SHOW); // TRUE
// Закрывает текущий сеанс (программу).
Close;
//----------------------------------------------------
end; Проверка не по номеру версии , а времени компиляции
Lazarus 1.5 rUnknown FPC 3.1.1 i386-win32-win32/win64
WinXP SP3 32 bit
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Sharfik писал(а):Ichthyander писал(а):Программа платная и нужно сделать так, чтобы ссылка для скачивания не попала в паблик. Возможно придется делать эту ссылку динамической, путь к которой будет шифроваться на стороне сервере и по аналогичному алгоритму программа бы определяла этот путь динамически.
А почему нельзя сделать две ссылки? Одна для скачивания полной платной программы, а вторая только для скачивания обновлений, в наборе которых будет отсутствовать что то типа библиотеки авторизации или т.п.
Ну, модуль исполняемый у меня один. Делать отдельно библиотеку авторизации и прочее нет смысла. Кроме того, путь к платной "полной" программе тоже неплохо бы зашифровать в Вашем случае
Добавлено спустя 6 минут 24 секунды:
Little_Roo писал(а):Вот у меня (подсмотрел где-то...уже не помню, но работает)Код: Выделить всё
procedure Tloginform.FormShow(Sender: TObject);
var
res: Boolean;
iLDate, iRDate: TDateTime;
begin
//--!!!!!!!!! AUTO UPDATE PROGRAMM !!!!!!!!!!! ////////
iLDate:=FileDateToDateTime(FileAge(Application.ExeName));
if not FileExists('\\192.168.18.95\ExeLib\'+ ExtractFileName(Application.ExeName)) then exit;
iRDate:=FileDateToDateTime(FileAge('\\192.168.18.95\ExeLib\'+ ExtractFileName(Application.ExeName)));
if iLDate >= iRDate then exit else Application.MessageBox(' Обнаружена НОВАЯ версия программы !'+ #13#13 +
' Нажмите ОК для обновления ...'+ #13#13 +
' И ПЕРЕЗАПУСТИТЕ ПРОГРАММУ '+ #13#13 ,
' Обновление программы мониторинга...',mb_IconExclamation + mb_OK);
// Удаляет файл созданный в предыдущем сеансе
res := DeleteFile(Application.ExeName + '.bak'); //TRUE
// Сам себя удалить не может!
//////////////// res := DeleteFile(Application.ExeName); //FALSE
// Переименование запущенного ехе-шника
MoveFile(PChar(Application.ExeName),PChar(Application.ExeName + '.bak')); // TRUE
// НЕ Удаляет файл созданный в текущем сеансе
res := DeleteFile(Application.ExeName + '.bak'); //FALSE
// Копирование вак-файла на место и с именем текущего запущенного ехе-шника
CopyFile(PChar('\\192.168.18.95\ExeLib\'+ ExtractFileName(Application.ExeName)),PChar(Application.ExeName),True); // TRUE
// Запуск нового ехе-шника (старый [текущий] еще активный)
WinExec(PChar(Application.ExeName), SW_SHOW); // TRUE
// Закрывает текущий сеанс (программу).
Close;
//----------------------------------------------------
end;
Проверка не по номеру версии , а времени компиляции
Lazarus 1.5 rUnknown FPC 3.1.1 i386-win32-win32/win64
WinXP SP3 32 bit
Кстати, спасибо за примерчик. Наверное использую в своей проге. Думал перезапуск и замена икзешника будет ручным, а оказывается и так можно сделать
Господа, вы не забыли о том, что по нормам безопасности пользователь не должен иметь прав на запись к программам?
PapaNT писал(а):Господа, вы не забыли о том, что по нормам безопасности пользователь не должен иметь прав на запись к программам?
google это знает, со своими беспардонными автообновлениями из маркета?)))
Проверка прав администратора и проблемы нет, нет?)
Sharfik писал(а):Проверка прав администратора и проблемы нет, нет?)
Приведённый код не сработает если программа запущена под пользователем. И он не предложит запустить под администратором.
В смысле PapaNT прав, код будет работать только если программа установлена в "свободную от прав" директорию (только для Win).
Рекомендую решать поставленную задачу, обыкновенным батником
.
Есть более "крутой" способ: написать настоящий Ланчер с собственной загрузкой настройкой и передачей управления ...
(Для Дос когда-то писал подобное как часть пакета навесной защиты для готовых EXE-шников )
Да, попотеть придется но зато гарантия что обновление не "уползет" будет повыше ...
А вообще для большинства случаев для нужд обновления достаточно упрятать часть кода в скрипты
(Как пример смотри мой вчера выложенный Редактор скриптовили проект "Дополнение к реальности " (Nv_BETA003M.zip )
По идее можно вообще каждый раз качать все "мясо" приложения с удаленного сервера виде кодированного сжатого скрипта ... А уж просто обновления будут вообще качаться "на раз два " ! И проблемы с правами доступа сразу станут совершенно неактуальны .
(Для Дос когда-то писал подобное как часть пакета навесной защиты для готовых EXE-шников )
Да, попотеть придется но зато гарантия что обновление не "уползет" будет повыше ...
А вообще для большинства случаев для нужд обновления достаточно упрятать часть кода в скрипты
(Как пример смотри мой вчера выложенный Редактор скриптовили проект "Дополнение к реальности " (Nv_BETA003M.zip )
По идее можно вообще каждый раз качать все "мясо" приложения с удаленного сервера виде кодированного сжатого скрипта ... А уж просто обновления будут вообще качаться "на раз два " ! И проблемы с правами доступа сразу станут совершенно неактуальны .
PapaNT писал(а):Господа, вы не забыли о том, что по нормам безопасности пользователь не должен иметь прав на запись к программам?
Вот именно, ИМХО, поэтому автообновления нужны только для программ, связанных с этой самой безопасностью.
Для остальных программ, автообновление - понт, за который можно и ответить.
Допустим, скачанный "начальный" дистрибутив, который потом можно под микроскопом в лаборатории изучить, предоставляется AS IS, пользователь ставит галочку, что согласен с этим. Так ведь пользователя еще в лицензии требуется заставить дать согласие на то, что эта программа скачает с интернета АБСОЛЮТНО ЛЮБОЕ Г-НО, которое будет что-то подменять на компе пользователя, писать не пойми куда, играться с правами, да делать все что угодно, а потом еще и подотрет за собой следы. И автор этой программы, а по сути уже лоадера вирусов, не будет ни за что отвечать.
vitaly_l писал(а): код будет работать только если программа установлена в "свободную от прав" директорию (только для Win)
Видел как некоторые чудаки ставятся в \AppData\Roaming или \AppData\Local
vitaly_l писал(а):Рекомендую решать поставленную задачу, обыкновенным батником
Вы, как специалист по лицензиям, эти действия описываете в свой лицензии как?
Alex2013 писал(а):достаточно упрятать часть кода в скрипты
Alex2013 писал(а):проблемы с правами доступа сразу станут совершенно неактуальны
На каком-нить хакерском форуме это наверное бы оценили
з.ы.
https://ru.wikipedia.org/wiki/%D0%9A%D0 ... 1%83%D1%81
Компью́терный ви́рус — вид вредоносного программного обеспечения, способного создавать копии самого себя и внедряться в код других программ, системные области памяти, загрузочные секторы, а также распространять свои копии по разнообразным каналам связи.
Даже если автор вируса не запрограммировал вредоносных эффектов, вирус может приводить к сбоям компьютера из-за ошибок, неучтённых тонкостей взаимодействия с операционной системой и другими программами. Кроме того, вирусы, как правило, занимают место на накопителях информации и потребляют некоторые другие ресурсы системы.
