Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > завершение родительского процесса из дочернего |
Автор: ihtiandr 15.7.2011, 15:41 | ||||
Всем доброго времени суток. Мне нужно из дочернего процесса закрыть родительский, но ничего не выходит. Вот исходник дочернего
Вот родительского
Когда запускаю родительский процесс он запускает дочерний а в дочернем при нажатии на "t" сам себя закрывает а родительский продолжает работать. Помогите разобраться. |
Автор: YDean 15.7.2011, 18:51 |
Значение, возвращаемое функцией CreateThread, валидно только в контексте вызывающего ее процесса. Для передачи описателей(handles) между процессами нужно использовать DuplicateHandle. В данном примере нужно передать описатель потока, а также реальный описатель процесса. Чтоб в том процессе по ним восстановили правильный описатель потока. Поскольку GetCurrentProcess() возвращает псевдоописатель текущего процесса, перед отправкой его нужно преобразовать в реальный через DuplicateHandle(GetCurrentProcess(),GetCurrentProcess(),GetCurrentProcess(), &hRealProcess, 0,0 1,DUPLICATE_SAME_ACCESS) Хотя, TerminateThread использовать нехорошо. Он не освобождает стек потока. (еще могут быть проблемы с правами на разных виндах) Лучше передавать mutex. Или не передавать, а создавать и открывать именованный mutex/event. |
Автор: ihtiandr 16.7.2011, 06:49 | ||
YDean Я изменил родительский процесс используя DuplicateHandle Вот код:
Теперь у меня при запуске родительского процесса дочернимй вообще не выходит а монитор становится красным и выходит ошибка"Ошибка при инициализации приложения 0хс0000005" при нажатии на "Ок" родительский процесс не завершается а продолжается. |
Автор: ASMatic 16.7.2011, 12:42 |
ihtiandr, правильней не убивать процесс,а оповещать его что пора ему завершится. Уже подсказывали как http://msdn.microsoft.com/en-us/library/ms682396(v=VS.85).aspx http://msdn.microsoft.com/en-us/library/ms686211(v=VS.85).aspx создаем, указываем нейм. Открываем. WaitForSingleObject(), можно заюзать с таймаутом и время от времени в треде проверять. *а с кодом что вашим - почему бы под отладчиком не посмотреть на какой инструкции получаем #AV |
Автор: YDean 16.7.2011, 19:54 |
ihtiandr, опять неверно DuplicateHandle преобразует описатели между процессами. Поскольку при формировании строки запуска дочерний процесс еще не существует - то и преобразовать к нему мы не сможем. Это он должен сделать сам. Для этого ему нужен реальный описатель родительского процесса. И ASMatic дело говорит. Я именно это и пытался сказать выше после "Хотя...". |
Автор: bass 16.7.2011, 20:15 |
Ребят дубликате хандле конечно круто, но задача вообще банальна.......... Если приложение (родитель)GDI....... то передаем дескриптор главного окна HWND ....... Процес (ребенок) постмессаге вм_клосе..... Приношу извинения за написание на русском языке.......................... Консольное приложение процесс родитель передает дочерниму IdProcees GetCurrentProcessId ............. Дочерний процесс OpenProcess Terminate......... Корректно процесс родитель запускает процесс дочерний и остается ждать евента ...... Пришел евент exit(0); |
Автор: Estranged 16.7.2011, 23:51 | ||
YDean, DuplicateHandle в таком виде не подойдет. А HANDLE он может передать, потому что sa.bInheritHandle = TRUE;. Дочерний процесс может использовать его. Ошибка не давала этому чуду работать:
Добавлено через 5 минут и 58 секунд И еще у родительского заменить void thread() на DWORD WINAPI thread(LPVOID) |
Автор: YDean 17.7.2011, 11:15 | ||||
Смешно. ![]() Estranged, +1
Jeffrey Richter ошибается? ![]()
|
Автор: Estranged 17.7.2011, 12:35 |
YDean, DuplicateHandle(GetCurrentProcess(),GetCurrentProcess(),GetCurrentProcess(), &hRealProcess, 0,0,DUPLICATE_SAME_ACCESS) Да Рихтер прав, в http://msdn.microsoft.com/en-us/library/ms724251%28v=vs.85%29.aspx написано все, о чем http://wm-help.net/books-online/book/59464/59464-22.html#head3top3p3 не сказал явно, только намекал. Внимание, вопрос: для какого процесса приведенный пример создает дубликат HANDLE текущего процесса? |
Автор: YDean 18.7.2011, 22:51 |
Да, да, да. Всё понятно. ![]() bInheritHandle=1 |