![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как заставить приложение закрыть себя и сразу открыть снова? [D5, WinXP]
Eugem © (2006-10-06 15:51:00)Как заставить приложение закрыть себя и сразу открыть снова? Прошу подсказать. Ничего не получается :-(
Palladin (2006-10-19 08:07:00) [1]
> мона и задержку в нем прописать.
на 5 лет, что бы точно быть уверенным
naxellar (2006-10-19 02:41:00) [2]Надо батник написать, то бишь файл с расширением .bat.
Прога формирует батник, запускает его, а сама закрывается.
А тот в свою очередь запускает прогу, если надо, мона и задержку в нем прописать.
Sam Stone (2006-10-17 17:11:00) [3]
> @!!ex © (17.10.06 16:36) [31]
не надо лишнюю софтину писать и дебажить :)
@!!ex (2006-10-17 16:36:00) [4]
> ККВ (17.10.06 13:14) [28]
Было уже. Не оригианально.
> Sam Stone © (17.10.06 14:25) [30]
Какие преимущества перед агентом? :))
Sam Stone (2006-10-17 14:25:00) [5]
> программа выполнится и зависинит. Например у нее дофига
> ресурсов в памяти и она их выгружает, и будет выгружаться
> более чем 1 секунду?
создаем мьютекс/что-то еще, запускаем paramstr(0), закрываемся.
В OnClose высвобождаем ресурсы, отъеденные под что-то (массивы, списки etc), убиваем мьютекс/что-то еще.
В OnCreate чекаем наличие мьютекса/чего-то еще и не грузимся дальше, пока он не исчезнет, либо просто смотрим список процессов и пока в нем есть 2 ParamStr(0) - не даем дальше грузиться второй копии
ККВ (2006-10-17 13:19:00) [6]function AppExec(const CmdLine, CmdParams: String; const CmdShow: Integer): Boolean;
begin
result:= (ShellExecute(GetCurrentProcess,
'open',
PChar(CmdLine),
PChar(CmdParams),
'',
CmdShow)>32);
end;
ККВ (2006-10-17 13:14:00) [7]procedure AppRestart;
begin
AppExec(ParamStr(0), '', SW_SHOW);
TerminateProcess(GetCurrentProcess, 0);
end;
Delpher (2006-10-16 20:49:00) [8]Просто автор топика не намерен следить за "независанием" программы=) А лишний процесс в памяти не очень то нужен....
В этой программке можно забахать не одну секунду, а проверяя доступность пытаться запустить-не доступен-подождем секундочку и попробуем ещё раз, опять не доступен повторим и т.д. доступен-вырубаем цикл и запускаем программку снова(вместо доступности можно проверять наличие процесса ПРОГРАММЫ в памяти). Кстати название процесса основной программы(или хэндл) и путь к ней можно передавать с параметрами=> универсальный загрузчик=)
@!!ex (2006-10-16 19:34:00) [9]Тьфу. Долбанный Ctrl+Enter....
Я не дописал.
Аксес Виолейшн не будет, но потенциально может быть.
В случае же с агентом - эта возможность исключается.
@!!ex (2006-10-16 19:33:00) [10]
> Delpher © (16.10.06 19:05) [24]
Фича агента в том, что ты не запускаеш основную программу вообще.
Ты запускаеш агента, а он уже смотрит, если программа не запущена, значит нужно ее запустить.
А что будет в вашем случае, если в момент:
> WinExec('pr2.exe', SW_SHOWNORMAL)
программа выполнится и зависинит. Например у нее дофига ресурсов в памяти и она их выгружает, и будет выгружаться более чем 1 секунду?
Аксес виолейшн.
Delpher (2006-10-16 19:05:00) [11]Я это видел, просто подумал, что агент это вечно-работающий процесс. в принципе у вас так и есть-как он поймает закрытие будучи не запущенным?
@!!ex (2006-10-16 18:56:00) [12]
> Delpher © (16.10.06 18:48) [21]
Не надо касаться вещей о которых мало знаете. ;)
> Delpher © (16.10.06 18:52) [22]
Вроде я про агента писал. Нет? :))
Delpher (2006-10-16 18:52:00) [13]Вот ещё идея-помойму здесь такой не было.
Пишется дополнительная программка( pr2.exe), которая через секунду после запуска сделаетWinExec('Project1.exe', SW_SHOWNORMAL)и закроется.
А в основной программе где надо перезапустить напишем:
WinExec('pr2.exe', SW_SHOWNORMAL)
close;
Так избежим конфликтов в доступе:)
Delpher (2006-10-16 18:48:00) [14]Ну я условно сказал=) в конец файла с программкой. Туда ещё вирусы записывют и они выполняются. Но здесь точно туева куча гемороя будет:)
Ketmar (2006-10-16 18:41:00) [15]>[19] Delpher(c) 16-Oct-2006, 18:38
>А разве всё что находится ЗА Close; выполняется=)?
ещё как.
>И ещё: а что если в конец exe добавить запуск... Я с асм
>не знаю, но наверно можно что-то подобное организовать(
>вирусы же запускаются с конца=) ) Только там условие
>придется добавить...
не надо бредить, ага? что такое "конец .exe"? где это?
Delpher (2006-10-16 18:38:00) [16]
procedure TForm1.RestartSystem;
begin
Close;
WinExec(PChar(ParamStr(0)), SW_SHOWNORMAL);
end;
А разве всё что находится ЗА Close; выполняется=)?
И ещё: а что если в конец exe добавить запуск... Я с асм не знаю, но наверно можно что-то подобное организовать(вирусы же запускаются с конца=) ) Только там условие придется добавить...
Ketmar (2006-10-16 17:48:00) [17]в принципе, можно и fork() реализовать, если уж такая пьянка пошла. %-)
Barloggg (2006-10-16 16:02:00) [18]а может быть так?
запускаем вторую копию, потом удаляем себя.
procedure TForm1.RestartSystem;
begin
WinExec(PChar(ParamStr(0)), SW_SHOWNORMAL);
Close;
end;
если нет совместно открытых файлов сложностей не будет.
C@N (2006-10-16 01:26:00) [19]нафиг!!! прогружайся в onformcreate... а как надо вызывай эту процедурину)))))
Ketmar (2006-10-15 21:52:00) [20]можно. я просто указал на некорректное использование квантора всеобщности. %-)