Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.fds-net.ru/showflat.php?Number=6568745&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Tue Apr 12 23:33:29 2016
Кодировка: Windows-1251
Завершение процесса - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 1
Lehtym
демоверсия

Рег.: 06.12.2004
Сообщений: 332
Из: Shit Building
Рейтинг: 350
  Завершение процесса
      07.09.2007 02:29
 

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

Вариант CreateProcess() - TerminateProcess() отлично работает, однако, везде пишут, что TerminateProcess() использовать очень не рекомендуется, а лучше использовать ExitProcess().

Румянцев (Азбука программирования в Win32 API, стр 247) приводит пример программы, которая делает то, что мне нужно, но использует TerminateProcess(). При этом он оговаривается:
 
Quote:


"Предлагаю читателю обратить внимание на то, что я завершаю процесс посредством вызова TerminateProcess(), а не ExitProcess(). Для того, чтобы завершить процесс обычным способом, пришлось бы писать программу, которая вызывала бы функцию ExitProcess() изнутри процесса, а мне бы не хотелось рассеивать внимание читателя."
 




Я попробовал с помощью CreateRemoteThread() создать в адресном пространстве процесса, который надо завершить, поток , который вызывает ExitProcess(). Но при этом завершение происходит с ошибкой (типа "недопустимая операция, приложение будет закрыто").

Этот путь верный, и надо разбираться с параметрами безопасности?
Или не париться и завершать TerminateProcess'ом?
Или есть еще пути?

Подскажите, благородные доны =)
Спасибо

Orient

Рег.: 18.09.2004
Сообщений: 924
Из: Singapore
Рейтинг: 133
  Re: Завершение процесса [re: Lehtym]
      07.09.2007 03:44
 

ИМХО, путь с созданием одним процессом треда в другом процессе неверный в корне. Я вообще в шоке, что такое возможно.

Если я все правильно понимаю, TerminateProcess убивает процесс, не давая ему выполнить завершающий код - скинуть кэши, сохранить несохраненные данные и т.п.
Если тебя это не волнует, забей и не парься.

Если волнует, то можно сделать вот как.
В дочернем процессе создаешь _опущенный_ семафор, имя которого навроде "MyApplicationExitMutex" + PID. Создаешь отдельный _бэкграундный_ поток, в котором код выглядит так:
code:
exitMutex.Wait(); // Код безопасного завершения приложения

Теперь если родитель захочет зарубить сына, он, зная PID сына, просто получит глобальный семафор, относящийся к этому сыну, и вызовет у него set(). В сыне выполнится твой код завершения и наступит тихое семейное счастье.

yanys
Доктор Кот

Рег.: 08.10.2003
Сообщений: 2098
Рейтинг: 1394
  Re: Завершение процесса [re: Orient]
      07.09.2007 04:23
 

Quote:

и наступит тихое семейное счастье



Это все классно, но у человека похоже ситуация, когда в дочернем процессе запускается программа написанная не им и код, который ты советуешь написать не может. Тогда остается делать TerminateProcess или делать code injection с помощью цепочки вызовов OpenProcess/VirtualAllocEx/WriteProcessMemory/CreateRemoteThread или хука.

Топикстартеру могу посоветовать посмотреть статьи на rsdn.ru, что то там про завершение процессов было.



Get your facts first, and then you can distort them as much as you please. Mark Twain
l0st
ГосДеп

Рег.: 11.11.2005
Сообщений: 7673
Рейтинг: 3078
  Re: Завершение процесса [re: Lehtym]
      07.09.2007 07:49
 

Послать главному окошку WM_CLOSE. Подождать немного. Если не закрылся - делать TerminateProcess.



коммунист
sidaesc
journeyman

Рег.: 24.04.2006
Сообщений: 94
Рейтинг: 3
  Re: Завершение процесса [re: l0st]
      07.09.2007 09:12
 

не WM_CLOSE, а какое-нибуть свое потоковое сообщение, и правильно реагируй на него.

blind
still alive

Рег.: 16.01.2004
Сообщений: 23128
Из: Хамовники
Рейтинг: 16483
  Re: Завершение процесса [re: Lehtym]
      07.09.2007 14:19
 

посылаешь сигнал с помощью GenerateConsoleCtrlEvent
если программа правильно написана одна должна ставить обработчик и все правильно прикрывать, если нет то вызовется дефолтный ExitProcess - что тоже нормально.

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



13/37 =)
Страницы: 1

Technical >> Development (Archive)

Дополнительная информация
0 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в