Завершение процесса

vova213

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

"Предлагаю читателю обратить внимание на то, что я завершаю процесс посредством вызова TerminateProcess а не ExitProcess. Для того, чтобы завершить процесс обычным способом, пришлось бы писать программу, которая вызывала бы функцию ExitProcess изнутри процесса, а мне бы не хотелось рассеивать внимание читателя."
Я попробовал с помощью CreateRemoteThread создать в адресном пространстве процесса, который надо завершить, поток , который вызывает ExitProcess. Но при этом завершение происходит с ошибкой (типа "недопустимая операция, приложение будет закрыто").
Этот путь верный, и надо разбираться с параметрами безопасности?
Или не париться и завершать TerminateProcess'ом?
Или есть еще пути?
Подскажите, благородные доны =)
Спасибо

aleks058

ИМХО, путь с созданием одним процессом треда в другом процессе неверный в корне. Я вообще в шоке, что такое возможно.
Если я все правильно понимаю, TerminateProcess убивает процесс, не давая ему выполнить завершающий код - скинуть кэши, сохранить несохраненные данные и т.п.
Если тебя это не волнует, забей и не парься.
Если волнует, то можно сделать вот как.
В дочернем процессе создаешь _опущенный_ семафор, имя которого навроде "MyApplicationExitMutex" + PID. Создаешь отдельный _бэкграундный_ поток, в котором код выглядит так:

exitMutex.Wait;
// Код безопасного завершения приложения

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

psm-home

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

agaaaa

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

Reves2

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

vall

посылаешь сигнал с помощью GenerateConsoleCtrlEvent
если программа правильно написана одна должна ставить обработчик и всё правильно прикрывать, если нет то вызовется дефолтный ExitProcess — что тоже нормально.
хз можно ли понять если твой сигнал проигнорировали, но в любом случае по таймауту надо прибивать TerminateProcess на всякий случай.
Оставить комментарий
Имя или ник:
Комментарий: