Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

обновление программы [D7, WinXP]


Алексей Петров ©   (2009-09-23 21:28:00) 

Доброго времени суток уважаемые!
Требуется по нажатию кнопки обновить программу, т.е. скопировать из определенного каталога exe-файл на то место, откуда была запущена программа, а потом что бы эта программа опять сама запустилась.


Пират   (2009-09-25 14:42:00) [1]

А у мен в свое время было написано такое:

procedure TForm1.StartUpdate(NewFileName: string);
const
 BatFileName = 'temp.bat';
 BatFile = '@echo off' + #13#10 +
           ':Loop' + #13#10 +
           'del %1' + #13#10 +
           'if exist %1 goto Loop' + #13#10 +
           'rename %2 %1' + #13#10 +
           'start %1';
var
 sl: TStringList;
begin
 sl:= TStringList.Create;
 try
   sl.Text := BatFile;
   sl.Add('del ' + BatFileName);
   sl.SaveToFile(BatFileName);
   WinExec(PChar(BatFileName + ' ' + ExtractFileName(ParamStr(0)) + ' ' + PChar(NewFileName)), SW_HIDE);
 finally
   sl.Free;
 end;
 Close;
end;


Юрий Зотов   (2009-09-25 12:53:00) [2]

Поправка - MoveFile Ex , конечно


Юрий Зотов   (2009-09-25 11:42:00) [3]

> Алексей Петров   (23.09.09 23:46) [6]

> как отследить например такую ситуацию: программа еще не закрылась,
> а обновлятор уже пытается ее заменить

При запуске обновлятора программа передает ему в параметрах ID своего процесса. По нему обновлятор определяет хэндл процесса и вызывает WaitForSingleObject, а потом делает свое дело.

В обратную сторону - так же (при запуске программы обновлятор передает ей ID своего процесса, программа дожидается его завершения и удаляет обновлятор). Другой вариант: обновлятор дает системе запрос на удаление самого себя при перезагрузке (MoveFile с MOVEFILE_DELAY_UNTIL_REBOOT).


TIF   (2009-09-24 22:10:00) [4]

> для чего всё это понадобилось?

?
> обновление программы


Thrashead   (2009-09-24 16:08:00) [5]

Алексей Петров:
просто интересно - для чего всё это понадобилось?


Алексей Петров   (2009-09-24 13:26:00) [6]

Всем спасибо!


TIF   (2009-09-24 01:01:00) [7]

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

Ну, например как-то так

В том месте кода, где осуществляется замена программы перехватывать сообщения об ошибках от функции, которая это дело будет выполнять. Если есть ошибка - присваиваем логической переменной B значение true, иначе false

Потом заключаем эту часть кода в
repeat
{ Наш код, выполняющий замены программы }
Sleep(1000); // Задержка в 1000 мс (1 с), ждём
until B;

Правда если процесс завершения работы программы застопорился намертво, этот цикл получится бесконечным ;-) Поэтому надо немного доработать идею, решение находится за минуту

Ещё вариант: "убить" процесс своей программы, завершить её принудительно. Способы - в Google/Bing/Яндекс

Можно не убивать, а послать ей "обновлятором" намёк - сообщение (Message), но тогда надо в самой программе предусмотреть возможность это сообщение принимать и на него реагировать (Application.Terminate себя, не забыв сохранить данные, если это необходимо). Про сообщения - messages - много материалов, примеров, если этот вариант интересен - удачных поисков


Алексей Петров   (2009-09-24 00:02:00) [8]

так как нет доступа к файлу...


Алексей Петров   (2009-09-23 23:46:00) [9]

Спасибо! Я так примерно и думал! а как отследить например такую ситуацию: программа еще не закрылась, а обновлятор уже пытается ее заменить, и у него не получается это сделать...


TIF   (2009-09-23 22:22:00) [10]

> Программа завершает работу и запускает обновлятор, который
> копирует во временную папку.

Непонятно написал. Переписываю:

Программа копирует обновлятор во временную папку, запускает его, а сама после этого закрывается.


TIF   (2009-09-23 22:20:00) [11]

Программа завершает работу и запускает обновлятор, который копирует во временную папку.
Обновлятор делает своё дело и запускает обновлённую программу, а сам закрывается.
Программа запускаться и удаляет из временной папки обновлятор.

М?


Германн   (2009-09-23 22:00:00) [12]


> может при закрытии запустить другую программу, которая заменит
> эту программу и опять ее запустит?

Может.


Алексей Петров   (2009-09-23 21:50:00) [13]

Подскажите как это можно сделать? нужно закрыть, обновить, и опять запустить программу. Закрыть , обновить - не проблема... а остальное как? может при закрытии запустить другую программу, которая заменит эту программу и опять ее запустит?


Сергей М.   (2009-09-23 21:35:00) [14]

Мы не против.


Наверх

Титульная страница Поиск, карта сайта Написать письмо