| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Передача HANDLE дочернему процессу |
| Автор: Igorious 8.12.2012, 16:42 | ||||
| Добрый день. Помогите со следующей задачей. В главном процессе создаются файлы и дочерний процесс. Дочернему процессу через командную строку передаётся хэндлы файлов. Дочерний процесс должен вывести некоторую информацию в эти файлы. К сожалению, к меня не получается вывести в файл — выводит только в консоль. Помогите найти ошибку в коде. Родительский процесс:
Дочерний процесс:
upd. Добавил проверку результатов каждой функции. |
| Автор: artsb 8.12.2012, 19:26 |
| У вас в дочернем процессе никак не обрабатываются результаты выполнения функций. Исправьте это и сообщите, где отваливается выполнение и с какой ошибкой. |
| Автор: tzirechnoy 8.12.2012, 19:35 |
| Времена глобальных хэндлов прошли почти 20 лет назад, с приходом win32. Для получения копии хэндла из другого процэсса используйте DuplicateHandle. Добавлено через 1 минуту и 11 секунд Да, я всё-таки дебил. Не заметил его при первом прочтении. |
| Автор: artsb 8.12.2012, 20:59 |
| Похоже, через SetStdHandle ничего не получится. http://www.rsdn.ru/forum/winapi/52921.flat#52921 в самом конце темы. |
| Автор: Igorious 8.12.2012, 22:33 | ||
| artsb, большое спасибо. Это довольно неожиданно, что во время исполнения проги она не учитывает SetStdHandle. С учётом приобретённых знаний переписал код следующим образом:
|
| Автор: feodorv 9.12.2012, 23:02 | ||||
Почему не учитывает, учитывает. Вот здесь:
Но Вы же хотите, чтобы работал printf в соответствии с новым STD_OUTPUT_HANDLE. printf является частью стандартной библиотеки, которая для Windows есть надстройка над WinAPI. Она (если программа вообще ею пользуется) инициализируется при старте приложения, при этом stdout связывается с тем STD_OUTPUT_HANDLE, который был актуальным на момент инициализации. Вызовы SetStdHandle (это чистый WinAPI) никак не влияют на stdin, stdout и stderr (а это уже из стандартной библиотеки). Чтобы синхронизировать STD_OUTPUT_HANDLE из WinAPI и stdout из стд.C.либ. нужно произвести дополнительные действия: http://www.tdoc.ru/c/cpp-sources/ui-windows/kak-v-gui-prilozhenii-otkryt-konsol-i-naznatchit-stdinstdoutstderr.html Добавлено через 5 минут и 56 секунд Или вот без переназначения консоли: http://www.halcyon.com/~ast/dload/guicon.htm. |
| Автор: HANDLE 6.1.2015, 05:51 |
| Всё гораздо проще. При создании процесса нужно проинициализировать структуру STARTUPINFO; STARTUPINFO si; si.hStdInput = сюда положить хендлы созданных файлов; si.hStdOutput = сюда положить хендлы созданных файлов; si.hStdError = сюда положить хендлы созданных файлов; И установить флажок si.dwFlags = STARTF_USESTDHANDLES; И будет вам счастье |
| Автор: feodorv 12.1.2015, 10:18 |
Вопрос стоял о том, чтобы менять stdout . И, может быть, неоднократно. |