+#if wxUSE_STREAMS
+ if ( redirect )
+ {
+ si.dwFlags = STARTF_USESTDHANDLES;
+
+ si.hStdInput = hpipeStdin[0];
+ si.hStdOutput = hpipeStdout[1];
+ si.hStdError = hpipeStderr[1];
+
+ // when the std IO is redirected, we don't show the (console) process
+ // window by default, but this can be overridden by the caller by
+ // specifying wxEXEC_NOHIDE flag
+ if ( !(flags & wxEXEC_NOHIDE) )
+ {
+ si.dwFlags |= STARTF_USESHOWWINDOW;
+ si.wShowWindow = SW_HIDE;
+ }
+
+ // we must duplicate the handle to the write side of stdin pipe to make
+ // it non inheritable: indeed, we must close hpipeStdin[1] before
+ // launching the child process as otherwise this handle will be
+ // inherited by the child which will never close it and so the pipe
+ // will never be closed and the child will be left stuck in ReadFile()
+ if ( !::DuplicateHandle
+ (
+ GetCurrentProcess(),
+ hpipeStdin[1],
+ GetCurrentProcess(),
+ &hpipeStdinWrite,
+ 0, // desired access: unused here
+ FALSE, // not inherited
+ DUPLICATE_SAME_ACCESS // same access as for src handle
+ ) )
+ {
+ wxLogLastError(_T("DuplicateHandle"));
+ }
+
+ ::CloseHandle(hpipeStdin[1]);
+ }
+#endif // wxUSE_STREAMS
+