Общение с дочерним процессом посредством pipe
Заранее - большое спасибо.
Код дочернего приложения есть? Тогда можно сделать и stdin, stdout.
Кроме того pipe можно сделать и не на stdin/out
STARTUPINFO si;
GetStartupInfo(&si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = stdoutWr;
si.hStdInput = stdinRd;
Где stdoutWr, stdinRd - мною созданные pipe-ы. Примерно так я пытаюсь перенаправить stdin и stdout. В общем работает, когда дочерний процесс - приложение консольное. Иначе оно просто закрывается сразу после вызова CreateProcess. А если не на stdin/out, то на чем и как?
А если не хочешь использовать каналы - используй отображение файлов на память. См. CreateFileMapping и MapViewOfFile.
Ну и в конце концов, оконные приложения могут обмениваться сообщениями (большие объемы данных так не передашь).
STARTUPINFO si;
GetStartupInfo(&si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = stdoutWr;
si.hStdInput = stdinRd;
Где stdoutWr, stdinRd - мною созданные pipe-ы. Примерно так я пытаюсь перенаправить stdin и stdout. В общем работает, когда дочерний процесс - приложение консольное. Иначе оно просто закрывается сразу после вызова CreateProcess. А если не на stdin/out, то на чем и как?[/QUOTE]
Чтобы при этом процессы действительно общались по пайпу, не будучи консольными, существует такая функция как GetStdHandle().
Если вызвать WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),...) - то дочерний процесс будет писать в твой пайп.
Как читать на родительской стороне из собственного пайпа ты наверно и сам знаешь :)
Кстати, вызов GetStartupInfo() НЕ ОСВОБОЖДАЕТ ОТ ЗАПОЛНЕНИЯ поля STARTUPINFO::cb - размер структуры должен быть указан всегда - это твоя ошибка. Да и зачем тебе вообще этот GetStartupInfo()?
ЗЫ: И заимей хорошую привычку обнулять структуры через ZeroMemory перед использованием - помогает.