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

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

Как заставить приложение закрыть себя и сразу открыть снова? [D5, WinXP]


Страницы:   1 2

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]

можно. я просто указал на некорректное использование квантора всеобщности. %-)


Страницы:   1 2

Наверх

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