![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
ihtiandr |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 16.12.2010 Репутация: нет Всего: нет |
Всем доброго времени суток.
Мне нужно из дочернего процесса закрыть родительский, но ничего не выходит. Вот исходник дочернего
Вот родительского
Когда запускаю родительский процесс он запускает дочерний а в дочернем при нажатии на "t" сам себя закрывает а родительский продолжает работать. Помогите разобраться. |
||||
|
|||||
YDean |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 7.9.2009 Репутация: 1 Всего: 1 |
Значение, возвращаемое функцией CreateThread, валидно только в контексте вызывающего ее процесса.
Для передачи описателей(handles) между процессами нужно использовать DuplicateHandle. В данном примере нужно передать описатель потока, а также реальный описатель процесса. Чтоб в том процессе по ним восстановили правильный описатель потока. Поскольку GetCurrentProcess() возвращает псевдоописатель текущего процесса, перед отправкой его нужно преобразовать в реальный через DuplicateHandle(GetCurrentProcess(),GetCurrentProcess(),GetCurrentProcess(), &hRealProcess, 0,0 1,DUPLICATE_SAME_ACCESS) Хотя, TerminateThread использовать нехорошо. Он не освобождает стек потока. (еще могут быть проблемы с правами на разных виндах) Лучше передавать mutex. Или не передавать, а создавать и открывать именованный mutex/event. Это сообщение отредактировал(а) YDean - 18.7.2011, 22:44 |
|||
|
||||
ihtiandr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 16.12.2010 Репутация: нет Всего: нет |
YDean
Я изменил родительский процесс используя DuplicateHandle Вот код:
Теперь у меня при запуске родительского процесса дочернимй вообще не выходит а монитор становится красным и выходит ошибка"Ошибка при инициализации приложения 0хс0000005" при нажатии на "Ок" родительский процесс не завершается а продолжается. |
|||
|
||||
ASMatic |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 254 Регистрация: 14.3.2009 Репутация: 1 Всего: 1 |
ihtiandr, правильней не убивать процесс,а оповещать его что пора ему завершится.
Уже подсказывали как http://msdn.microsoft.com/en-us/library/ms...6(v=VS.85).aspx http://msdn.microsoft.com/en-us/library/ms...1(v=VS.85).aspx создаем, указываем нейм. Открываем. WaitForSingleObject(), можно заюзать с таймаутом и время от времени в треде проверять. *а с кодом что вашим - почему бы под отладчиком не посмотреть на какой инструкции получаем #AV |
|||
|
||||
YDean |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 7.9.2009 Репутация: 1 Всего: 1 |
ihtiandr, опять неверно
DuplicateHandle преобразует описатели между процессами. Поскольку при формировании строки запуска дочерний процесс еще не существует - то и преобразовать к нему мы не сможем. Это он должен сделать сам. Для этого ему нужен реальный описатель родительского процесса. И ASMatic дело говорит. Я именно это и пытался сказать выше после "Хотя...". |
|||
|
||||
bass |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Ребят дубликате хандле конечно круто, но задача вообще банальна..........
Если приложение (родитель)GDI....... то передаем дескриптор главного окна HWND ....... Процес (ребенок) постмессаге вм_клосе..... Приношу извинения за написание на русском языке.......................... Консольное приложение процесс родитель передает дочерниму IdProcees GetCurrentProcessId ............. Дочерний процесс OpenProcess Terminate......... Корректно процесс родитель запускает процесс дочерний и остается ждать евента ...... Пришел евент exit(0); |
|||
|
||||
Estranged |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 30.8.2010 Репутация: 3 Всего: 3 |
YDean, DuplicateHandle в таком виде не подойдет. А HANDLE он может передать, потому что sa.bInheritHandle = TRUE;. Дочерний процесс может использовать его.
Ошибка не давала этому чуду работать:
Добавлено через 5 минут и 58 секунд И еще у родительского заменить void thread() на DWORD WINAPI thread(LPVOID) |
|||
|
||||
YDean |
|
||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 7.9.2009 Репутация: 1 Всего: 1 |
Смешно.
![]() Estranged, +1
Jeffrey Richter ошибается? ![]()
|
||||
|
|||||
Estranged |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 30.8.2010 Репутация: 3 Всего: 3 |
YDean, DuplicateHandle(GetCurrentProcess(),GetCurrentProcess(),GetCurrentProcess(), &hRealProcess, 0,0,DUPLICATE_SAME_ACCESS)
Да Рихтер прав, в MSDN написано все, о чем Рихтер не сказал явно, только намекал. Внимание, вопрос: для какого процесса приведенный пример создает дубликат HANDLE текущего процесса? |
|||
|
||||
YDean |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 7.9.2009 Репутация: 1 Всего: 1 |
Да, да, да. Всё понятно.
![]() bInheritHandle=1 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |