Форум: "Потрепаться";
Текущий архив: 2002.07.08;
Скачать: [xml.tar.bz2];
ВнизКак реализовать автообновление приложения? Найти похожие ветки
← →
kserg@ukr.net (2002-06-04 18:54) [0]Привет.
Возникла необходимость сделать автообновление моей проги у юзеров. Не имея достаточного опыта сделал я как понимал: на сервере завел папку, куда подкидываю новые версии проги.
А в теле осн.проги вставил проверку времени юзеровской версии ЕХЕ и и версии на сервере.
Если время создания различаются - делаю копирование.
Но т.к. при запущенном ЕХЕ-файле вместо него скопировать новый не возможно, то прога закрывает себя и запускает небольшую сервис-прогу
...
CopyFile(PChar(ParamStr(1)),PChar(ParamStr(2)),false);
WinExec("TimeSheet.exe",SW_SHOWNORMAL);
...
вначале выполняет копирование сервер->юзер,
а затем вновь загружает осн.прогу.
Заметил, что не всегда проходит копирование.
Такое впечатление, что в случае если копирование еще не завершилось и уже вновь запускается осн.прога, то копирование обрывается.
Народ, присоветуйте чё-нибудь дельное...
Спасибо
← →
Volj (2002-06-04 19:01) [1]Не проще ли ВСЕГДА запускать сервис-прогу? Она при необходимости выполняет копирование и затем уже основную прогу загружает.
А что касается subj - как осуществляется процесс вызова сервис-проги?
← →
Song (2002-06-04 19:08) [2]UpGradePath - путь к каталогу, где лежат новый exe файл
Procedure UpGradeCheck;
Var ff:TextFile;
SearchRec,SearchRecOwn:TSearchRec;
S:String;
Begin
IF FindFirst(UpGradePath+"\"+"*.exe",faAnyFile,SearchRec)<>0 then FindClose(SearchRec)
else
IF FindFirst(Application.ExeName,faAnyFile,SearchRecOwn)<>0 then
Begin
FindClose(SearchRecOwn);
FindClose(SearchRec);
End Else
IF not(SearchRec.Size<>SearchRecOwn.Size) then
Begin
FindClose(SearchRecOwn);
FindClose(SearchRec);
End Else IF MessageDlg("Обнаружена обновлёная версия программы. После нажатия кнопки <Ok> текущая копия будет закрыта и будет запущена программа обновления. Для продолжения её работы Вам нужно будет нажать любую клавишу.",mtInformation,[mbOk,mbCancel],0)=mrOk then
// Записываем файл
Begin
AssignFile(ff,"replace.bat");
ReWrite(ff);
S:=ExtractFileDir(Application.ExeName);
try
WriteLn(ff,"@echo off");
WriteLn(ff,"pause");
WriteLn(ff,"cd ""+S+""");
WriteLn(ff,"copy ""+UpgradePath+SearchRec.Name+"""+#32+"""+S+"""+" /Y");
WriteLn(ff,SearchRec.Name);
Flush(ff);
finally
CloseFile(ff);
end;
FindClose(SearchRecOwn);
// Здесь не забудем уничтожить все возможно уже созданные объекты
ShellExecute(Handle,nil,PChar("replace.bat"),nil,nil,SW_MAXIMIZE);
Application.Terminate;
End Else FindClose(SearchRecOwn);
End;
← →
Delirium (2002-06-04 19:30) [3]Хм, в NT можно просто переименовать исполняемый EXE-шник, положить рядом новый, и запустить его, а прогу родитель - благополучно закрыть и забыть :)
← →
Song (2002-06-04 19:39) [4]Да ну ? :)
← →
Delirium (2002-06-04 19:41) [5]> Song
Ну, да! :)
Попробуй сам, у меня так все проги update-тятся (W2k,XP)
← →
kserg@ukr.net (2002-06-05 10:26) [6]>Volj (04.06.02 19:01)
>Не проще ли ВСЕГДА запускать сервис-прогу? Она при >необходимости выполняет копирование и затем уже основную прогу загружает.
В одной из моих ранних прог так и было - юзер запускал start.exe котр. сверяла версии осн.проги и та если надо копировала новую и тогда уже её запускала... всё благородно работало, но были пару юзеров-умников, котр. запускали приложение не через start.exе, а сразу через осн.прогу. Вот я и решил "усилить" контроль.
>Delirium © (04.06.02 19:30)
>Хм, в NT можно просто переименовать исполняемый EXE-шник
проверил и убедился что под NT можно сделать Rename при загруженном ЕХЕ. Но дело в том, что у меня есть юзеры как под NT так и под W98
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.07.08;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c