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 =) |
|
|
|