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

Вниз

обновление программы   Найти похожие ветки 

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

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


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

Мы не против.


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

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


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


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

Может.


 
TIF ©   (2009-09-23 22:20) [4]

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

М?


 
TIF ©   (2009-09-23 22:22) [5]

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

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

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


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

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


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

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


 
TIF ©   (2009-09-24 01:01) [8]

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

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

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

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

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

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

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


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

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


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

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


 
TIF ©   (2009-09-24 22:10) [11]

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

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


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

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

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

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

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


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

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


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

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

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;



Страницы: 1 вся ветка

Текущий архив: 2009.11.08;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
2-1253086545
Роман
2009-09-16 11:35
2009.11.08
как работать с файлом мс прожект


15-1252688079
test
2009-09-11 20:54
2009.11.08
День граненого стакана


8-1199439878
Alex_AA
2008-01-04 12:44
2009.11.08
Как проиграть файл *.avi?


8-1198161253
ZXMaster
2007-12-20 17:34
2009.11.08
chroma key DirectShow


2-1253160510
Руслан
2009-09-17 08:08
2009.11.08
помогите с запросом