Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как не дать закрыть приложение?


Автор: DIMONSOFT 19.12.2004, 12:48
Как написать два приложения которые проверяли би свое наличие в памяти и не давали себя закрыть?

Автор: Marriage 19.12.2004, 14:02
Код

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=False;
end;


Это подойдет ????

Автор: Albinos_x 19.12.2004, 15:33
Думаю, ему нужен неубиваемый процесс. тогда указанное не подойдёт.

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

Автор: DIMONSOFT 19.12.2004, 15:49
Так вот этого я и хочу Бывалый .Напиши код!!

Автор: Albinos_x 19.12.2004, 18:23
Цитата
Так вот этого я и хочу Бывалый .Напиши код!!


не понятно, к кому обращяешся...
--------------------
код получения списка процессов

Код

procedure TForm2.LoadProcessID(s:TStrings);
var H :THandle;
  Process32:TProcessEntry32;
  next : bool;
  //i:DWord;
begin
Process32.dwSize:=SizeOf(TProcessEntry32);
H:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if Process32First(H,Process32) then
begin
 //i:=Process32.th32ProcessID;
  s.Add(Process32.szExeFile);
  Repeat
  Next:=Process32Next(H,Process32);
  if Next  Then
   begin
   //i:=Process32.th32ProcessID;
    s.Add(Process32.szExeFile);
    end;
 Until Not(Next);
end;
CloseHandle(H);
end;


немного поменяй его, чтобы он не создавал список процессов, а искал необходимый
Далее засунь его в таймер

Автор: DIMONSOFT 19.12.2004, 18:38
Я извеняюсь, в этом форуме недавно, я обращался к тебе Albinos_x. Я не очень понял пример:
я добавил модуль Tlhelp32.К примеру мой exe-файл називается ds.exe.Напиши пример конкретно с ним!!

Автор: Albinos_x 19.12.2004, 23:37
Код

....

function TForm1.LoadProcessID(FN:string): boolean;
var H :THandle;
  Process32:TProcessEntry32;
  next, bool : bool;
  s:string;
begin
bool:=false;
Process32.dwSize:=SizeOf(TProcessEntry32);
H:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if Process32First(H,Process32) then
begin
  s:=Process32.szExeFile;
 if FN<>s then
 begin
  Repeat
  Next:=Process32Next(H,Process32);
  if Next  Then
   begin
    s:=Process32.szExeFile;
     if FN=s then
        bool:=true;
    end;
 Until Not(Next) or bool;
end;
CloseHandle(H);
Result:=bool;
end;

...

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if not LoadProcessID({название ехе вместе с расширением}) then
 {запускаем ехе };
end;

...


Могут быть гденибудь ошибки(не проверял, работать должны по идее), но я думаю разберёшся

Автор: Guest 20.12.2004, 13:04
А она сама себя не обнаружит?

Автор: Pathfider 20.12.2004, 21:49
Как вариант: состряпать хук на системные сообщения. А в добавок сделать процесс системным, чтобы без DebugPrivilege нельзя было закрыть.
Добавлено @ 21:51
Albinos_x
Код

if not LoadProcessID({название ехе вместе с расширением}) then
{запускаем ехе };
end;

А прокатит ли? По-моему лучше последить за событиями CloseQuery и Close.

Автор: xAnejl 21.12.2004, 17:42
Если нужно сделать неубиваемый процесс, то либо используй ACL (http://forum.vingrad.ru/index.php?showtopic=37372&unread=1&st=0&#entry283663), либо делай перехват апи на TerminateProcess

Автор: Fantasist 22.12.2004, 21:25
Самый простой известный способ - на получение cообщения требующего прилажению закрыться, запускать новый такой же процесс, а этот убивать. Зачастую этого достадочно.


Автор: ~FoX~ 23.12.2004, 11:03
Цитата(Fantasist @ 22.12.2004, 21:25)
Самый простой известный способ - на получение cообщения требующего прилажению закрыться, запускать новый такой же процесс, а этот убивать. Зачастую этого достадочно.

А это прокатит если приложение вываливается по ошибке - собственной/виндовой?

Автор: Мебель 27.12.2004, 10:47
А может быть просто
в OnCloseQuery засунуть CanClose:=False; и потом по таймеру
закрывать диспетчер задач? Ведь приложение можно теперь закрыть
только выкинув его из процессов диспетчера... smile

Автор: Pathfider 28.12.2004, 22:21
Цитата
А может быть просто
в OnCloseQuery засунуть CanClose:=False; и потом по таймеру
закрывать диспетчер задач? Ведь приложение можно теперь закрыть
только выкинув его из процессов диспетчера...

А если написана программка для убийства именно этого процесса? Как тады...

Автор: DIMONSOFT 29.12.2004, 09:50
Возмем к примеру Kaspersky Антивирь Lite v4.0 и какую-нибудь выключалку программ. В ней мы находим что запущено два процеса с одинаковыми названиями- aupm.exe. Только я нажимаю на кнопку выключить Каспер орет и выпихивает сообщение кто хотел завесить антивирь. ПРИ ЭТОМ КАСпер как-то блокирует выключение. Он не выключается ни НА СЕКУНДУ!!! Может он как-то перехватывает сообщение? Ничего не можете порекомендовать для моей проги?Ваших примерах прога ВЫКЛЮЧАЕТСЯ но потом быстро вкл. но хотелось бы сделать как Каспер!

Автор: xAnejl 29.12.2004, 17:52
он через перехват АПИ делает

Автор: DIMONSOFT 29.12.2004, 21:21
Цитата
он через перехват АПИ делает

А я могу это сделать?

Автор: _hunter 30.12.2004, 01:39
а почему бы и нет?

Автор: Akella 30.12.2004, 10:07
у серверных СУБД, т.е. у самих приложений(серверов) есть, так сказать, охранник (guardian), например взять тот же Interbase.

Пишешь программу, которая сидит в памяти и следит за твоим приложением и перезапускает его в случае чего, а твое приложение тоже следит за охранником и перезапускает его в случае чего. Охраннику даже форма не нужна.

Автор: &nbsp;Dimonsoft 1.1.2005, 18:08
Цитата(dsergey @ 30.12.2004, 10:07)
и перезапускает его в случае чего

Возможно я не прав но речь снова идет о ПЕРЕЗАПУСКЕ а мне нужен неубываемый процес

Автор: xAnejl 2.1.2005, 11:21
Цитата(dsergey @ 30.12.2004, 10:07)
у серверных СУБД, т.е. у самих приложений(серверов) есть, так сказать, охранник (guardian), например взять тот же Interbase.

Пишешь программу, которая сидит в памяти и следит за твоим приложением и перезапускает его в случае чего, а твое приложение тоже следит за охранником и перезапускает его в случае чего. Охраннику даже форма не нужна.


после первого перезапуска убиваем не по "Завершыть процесс", а по "Завершыть дерево процессов" хоть 10 охранников запускай, все равно вышебет!!!

Автор: Vit 4.1.2005, 02:35
Учитывая что 90% постов DIMONSOFT имеют направленность написания вредоносного кода считаю помощь ему в этом деле исключительно нежелательной. Тема закрыта!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)