Завершение процесса
Если я все правильно понимаю, TerminateProcess убивает процесс, не давая ему выполнить завершающий код - скинуть кэши, сохранить несохраненные данные и т.п.
Если тебя это не волнует, забей и не парься.
Если волнует, то можно сделать вот как.
В дочернем процессе создаешь _опущенный_ семафор, имя которого навроде "MyApplicationExitMutex" + PID. Создаешь отдельный _бэкграундный_ поток, в котором код выглядит так:
exitMutex.Wait;
// Код безопасного завершения приложения
Теперь если родитель захочет зарубить сына, он, зная PID сына, просто получит глобальный семафор, относящийся к этому сыну, и вызовет у него set. В сыне выполнится твой код завершения и наступит тихое семейное счастье.
и наступит тихое семейное счастьеЭто все классно, но у человека похоже ситуация, когда в дочернем процессе запускается программа написанная не им и код, который ты советуешь написать не может. Тогда остается делать TerminateProcess или делать code injection с помощью цепочки вызовов OpenProcess/VirtualAllocEx/WriteProcessMemory/CreateRemoteThread или хука.
Топикстартеру могу посоветовать посмотреть статьи на rsdn.ru, что то там про завершение процессов было.
Послать главному окошку WM_CLOSE. Подождать немного. Если не закрылся - делать TerminateProcess.
не WM_CLOSE, а какое-нибуть свое потоковое сообщение, и правильно реагируй на него.
если программа правильно написана одна должна ставить обработчик и всё правильно прикрывать, если нет то вызовется дефолтный ExitProcess — что тоже нормально.
хз можно ли понять если твой сигнал проигнорировали, но в любом случае по таймауту надо прибивать TerminateProcess на всякий случай.
Оставить комментарий
vova213
Нужно сделать так, чтобы программа запускала другую программу, а потом, при определенном условии, завершала бы ее.Вариант CreateProcess - TerminateProcess отлично работает, однако, везде пишут, что TerminateProcess использовать очень не рекомендуется, а лучше использовать ExitProcess.
Румянцев (Азбука программирования в Win32 API, стр 247) приводит пример программы, которая делает то, что мне нужно, но использует TerminateProcess. При этом он оговаривается:
Я попробовал с помощью CreateRemoteThread создать в адресном пространстве процесса, который надо завершить, поток , который вызывает ExitProcess. Но при этом завершение происходит с ошибкой (типа "недопустимая операция, приложение будет закрыто").
Этот путь верный, и надо разбираться с параметрами безопасности?
Или не париться и завершать TerminateProcess'ом?
Или есть еще пути?
Подскажите, благородные доны =)
Спасибо