Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1252592316
DimDim
2009-09-10 18:18
2009.11.08
Касперский блокирует процесс


1-1223062788
FlashParty
2008-10-03 23:39
2009.11.08
Delphi 2007 — INDY 10 — Работа с Gmail


8-1199266718
ТупойПрограммер
2008-01-02 12:38
2009.11.08
Запись миди файла


2-1253003813
новый
2009-09-15 12:36
2009.11.08
pointer. Не могу разобраться...


4-1221114459
МистерТ
2008-09-11 10:27
2009.11.08
Отображение HBITMAP на диалоге ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский