Форум: "Начинающим";
Текущий архив: 2009.11.08;
Скачать: [xml.tar.bz2];
Внизобновление программы Найти похожие ветки
← →
Алексей Петров (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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c