Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.08;
Скачать: CL | DM;

Вниз

Как реализовать автообновление приложения?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
1-23589
Magic
2002-06-21 15:14
2002.07.08
Проблема с потоками


3-23519
Ш-К
2002-06-18 09:33
2002.07.08
Update


6-23703
Timon
2002-04-24 16:46
2002.07.08
Авторизация


6-23705
Jeck
2002-04-26 01:12
2002.07.08
Подскажите где ошибка?


7-23807
Dizer
2002-04-16 11:05
2002.07.08
Интерфейс RS-485