![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
Igorious |
|
||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 14.12.2011 Репутация: нет Всего: нет |
Добрый день.
Помогите со следующей задачей. В главном процессе создаются файлы и дочерний процесс. Дочернему процессу через командную строку передаётся хэндлы файлов. Дочерний процесс должен вывести некоторую информацию в эти файлы. К сожалению, к меня не получается вывести в файл — выводит только в консоль. Помогите найти ошибку в коде. Родительский процесс:
Дочерний процесс:
upd. Добавил проверку результатов каждой функции. Это сообщение отредактировал(а) Igorious - 8.12.2012, 20:25 |
||||
|
|||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
У вас в дочернем процессе никак не обрабатываются результаты выполнения функций. Исправьте это и сообщите, где отваливается выполнение и с какой ошибкой.
-------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: нет Всего: 16 |
Времена глобальных хэндлов прошли почти 20 лет назад, с приходом win32.
Для получения копии хэндла из другого процэсса используйте DuplicateHandle. Добавлено через 1 минуту и 11 секунд Да, я всё-таки дебил. Не заметил его при первом прочтении. |
|||
|
||||
Igorious |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 14.12.2011 Репутация: нет Всего: нет |
||||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
Похоже, через SetStdHandle ничего не получится. Подробности в самом конце темы.
-------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
Igorious |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 14.12.2011 Репутация: нет Всего: нет |
artsb, большое спасибо.
Это довольно неожиданно, что во время исполнения проги она не учитывает SetStdHandle. С учётом приобретённых знаний переписал код следующим образом:
|
|||
|
||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Почему не учитывает, учитывает. Вот здесь:
Но Вы же хотите, чтобы работал printf в соответствии с новым STD_OUTPUT_HANDLE. printf является частью стандартной библиотеки, которая для Windows есть надстройка над WinAPI. Она (если программа вообще ею пользуется) инициализируется при старте приложения, при этом stdout связывается с тем STD_OUTPUT_HANDLE, который был актуальным на момент инициализации. Вызовы SetStdHandle (это чистый WinAPI) никак не влияют на stdin, stdout и stderr (а это уже из стандартной библиотеки). Чтобы синхронизировать STD_OUTPUT_HANDLE из WinAPI и stdout из стд.C.либ. нужно произвести дополнительные действия: Как в GUI приложении открыть консоль и назначить stdin,stdout,stderr ![]() Добавлено через 5 минут и 56 секунд Или вот без переназначения консоли: Adding Console I/O to a Win32 GUI App. Это сообщение отредактировал(а) feodorv - 9.12.2012, 23:02 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
HANDLE |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 25.6.2008 Репутация: нет Всего: нет |
Всё гораздо проще. При создании процесса нужно проинициализировать структуру STARTUPINFO;
STARTUPINFO si; si.hStdInput = сюда положить хендлы созданных файлов; si.hStdOutput = сюда положить хендлы созданных файлов; si.hStdError = сюда положить хендлы созданных файлов; И установить флажок si.dwFlags = STARTF_USESTDHANDLES; И будет вам счастье |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Вопрос стоял о том, чтобы менять stdout . И, может быть, неоднократно. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |