Вверх ↑
Ответов: 321
Рейтинг: 10
#1: 2018-03-24 21:47:24 ЛС | профиль | цитата
Привет ребята, поделитесь пожалуйста опытом, кто как реализует обновление программы ?!
Приложение небольшое, и без записей в реестре, без ini/cfg файлов, dll и т.д, и не хотелось бы к нему делать отдельный updater.
Хочется чтобы оно обновляло само себя, посредством замены нового файла на старый. Это решит проблему, на случай если пользователь использует ярлык для запуска.

Вот мой способ:
1. Загрузка строки с базы mysql с информацией о последней версии в формате [версия;размер файла;md5 сумма файла].
2. Проверяем версию текущей программы с версией последней доступной программы, полученную в первом пункте.
3. Загрузка последней программы на компьютер со статистической ссылкой при необходимости (http://site.ru/latest_version.exe).
4. Проверяем целостность загруженной версии с помощью md5 суммы на всякий случай.
5. Генерация .bat файла.
6. Сохранение .bat файла.
7. Запуск .bat файла.

taskkill /f /im %1 - убиваем процесс основной программы.
del /q %1 - удаляем файл основной программы.
ren latest_version.exe %1 - переименовываем скаченную новую версию на имя старой.
del %0 ›nul - самоудаляем .bat файл.

Add(MainForm,2953706,161,280)
{
Width=641
Height=388
Color=16777215
link(onCreate,1644418:doStart,[])
}
Add(HTTPClient,7265496,763,252)
{
URL="http://ff.zzz.com.ua/latest_version.exe"
FileName="latest_version.exe"
Point(SaveTo)
link(onFinish,15746390:doFileHashsum,[])
link(onDownloadProgress,16118793:doPosition,[(807,272)(807,293)(751,293)(751,307)])
link(SaveTo,2483618:Value,[])
}
Add(Memory,2483618,777,203)
{
Default=Integer(2)
}
Add(ProgressBar,16118793,763,301)
{
Left=10
Top=85
Width=400
Max=0
Point(doMax)
}
Add(FormatStr,2949678,1204,252)
{
DataCount=1
Mask="taskkill /f /im %1\r\ndel /q %1\r\nren latest_version.exe %1\r\ndel %0 ›nul"
link(onFString,15045884:doText,[(1248,258)(1248,296)(1143,296)(1143,335)])
}
Add(Application,13385210,1155,203)
{
}
Add(FilePartElm,11262745,1155,252)
{
Point(Part)
link(onPart,2949678:doString,[])
link(FileName,13385210:AppFileName,[])
}
Add(Hub,8722152,1085,252)
{
OutCount=3
link(onEvent1,11262745:doPart,[])
link(onEvent2,15045884:doSave,[(1127,265)(1127,349)])
link(onEvent3,16078576:doShellExec,[(1120,272)(1120,384)])
}
Add(WinExec,16078576,1155,371)
{
FileName="update.bat"
}
Add(HTTPClient,2548297,273,294)
{
URL="http://ff.zzz.com.ua/update.php"
Point(SaveTo)
link(onFinish,13316639:doSearch,[])
}
Add(Thread,1644418,217,294)
{
Delay=0
FastStop=0
link(onExec,2548297:doLoadString,[])
}
Add(MultiStrData,8339473,385,301)
{
Count=3
link(onPart1,14327245:doCompare,[(436,307)(436,251)])
link(onPart2,16118793:doMax,[])
link(onPart3,11516841:doValue,[])
}
Add(If_else,14327245,455,245)
{
Type=1
link(onTrue,7488172:doEvent1,[(513,251)(513,209)])
link(onFalse,14691263:doData,[])
link(Op1,6228548:Caption,[])
}
Add(Button,5069766,651,161)
{
Left=10
Top=110
Width=150
Visible=1
Caption="Обновить"
Point(doVisible)
link(onClick,7265496:doExecute,[(698,167)(698,279)])
}
Add(DoData,3599545,574,210)
{
Data=String(Доступна новая версия программы, требуется обновление!)
link(onEventData,10264279:doWork2,[])
}
Add(Label,13229877,651,210)
{
Left=10
Top=60
Width=13
Height=17
Font=[MS Sans Serif,12,0,0,1]
Transparent=0
Caption="..."
}
Add(Hub,7488172,539,203)
{
link(onEvent1,12740353:doData,[(563,209)(563,167)])
link(onEvent2,3599545:doData,[])
}
Add(DoData,12740353,574,161)
{
Data=Integer(1)
link(onEventData,5069766:doVisible,[])
}
Add(DoData,14691263,574,252)
{
Data=String(У Вас последняя версия программы, обновление не требуется.)
link(onEventData,10264279:doWork3,[(627,258)])
}
Add(HubEx,10264279,623,210)
{
link(onEvent,13229877:doText,[])
}
Add(Hashsum,15746390,833,252)
{
link(onResult,11288209:doCompare,[])
link(Data,9506228:Value,[])
}
Add(StrList,15045884,1155,308)
{
FileName="update.bat"
}
Add(Memory,9506228,833,203)
{
Default=String(latest_version.exe)
}
Add(GlobalVar,6017712,889,224)
{
Name="md5"
}
Add(If_else,11288209,889,252)
{
link(onTrue,8722152:doEvent1,[])
link(onFalse,15693563:doMessage,[])
link(Op1,6017712:Var,[])
}
Add(Message,15693563,959,259)
{
Message="Ошибка. Сумма md5 не соответствует."
Caption="md5"
}
Add(BlockFind,13316639,329,301)
{
IncludeBlock=1
StartBlock="‹s›"
EndBlock="‹e›"
link(onSearch,8339473:doSplit,[])
}
Add(GlobalVar,11516841,448,315)
{
Name="md5"
}
Add(Label,5077860,406,161)
{
Left=10
Top=5
Width=85
Height=24
Color=16777215
Font=[MS Sans Serif,12,1,0,1]
Caption="program v"
AutoSize=1
}
Add(Label,6228548,455,161)
{
Left=95
Top=5
Width=29
Height=24
Color=16777215
Font=[MS Sans Serif,12,1,0,1]
Caption="1.0"
}


Если запустить второй раз приложение, то должно написать, что обновление не требуется. Запускать второй раз естественно надо не через hiasm
Кто проверит отпишитесь пожалуйста получается ли обновится ?! win7 x64 - получается вроде

______________________________________________________
Вот пару вопросиков...
Можно ли в ProgressBar в Max задавать 508416 байт например, для отображения прогресса загрузки обновлений, или лучше уменьшать кол-во, округляя до Кб хотя бы ?!
Если программу запускать не от имени администратора и на вин10 например, сработает ли .bat и насколько он актуален в 2018 или лучше в memoryStream засунуть updater и запускать из программы...
Еще интересно как антивирусы отреагируют на .bat, не хочу пугать пользователей.
И никто не в курсе md5 починили под разные разрядности ОС ?! Недавно видел где-то тему, что md5 не корректно считается.
Еще пару лет назад видел у кого то способ запуска программы от имени администратора, если есть возможность в ЛС получил бы, если конечно по вашему мнению это нужно для нормального обновления без осложнений.
Вообщем ребята дайте советов пожалуйста, чтобы вы изменили, просто важно в принудительном порядке заставлять обновляться и при этом чтобы не было проблем ;)
карма: 1

0
Редактировалось 6 раз(а), последний 2018-03-24 22:06:31