StartupinfoEX和控制台重定向

时间:2011-12-23 22:22:38

标签: c++ console handle createprocess

我想创建一个子句柄继承为false并使用控制台重定向的子进程。 为此我创建了stdinput namepipe句柄并将该继承的继承设置为true,并将其添加到我发送到createprocess的结构StartupinfoEX中

问题在于,子进程正确接收句柄(我在进程资源管理器中检查它)但是没有分配控制台重定向(看起来前面的句柄没有分配给stdinput)!

当然,当我在createprocess中使用一个带有继承的标准STARTUPINFO时,一切都很好......

我的代码

FServerPipe:= CreateNamedPipe(....);

.........

  si.StartupInfo.hStdInput  := FServerPipe;
  si.StartupInfo.hStdOutput := INVALID_HANDLE_VALUE;
  si.StartupInfo.hStdError  := INVALID_HANDLE_VALUE; 

.........

UpdateProcThreadAttribute(...)

.........

  CheckError(Not CreateProcess(
                               PChar(aPhpInterpreterFilename),   // pointer to name of executable module
                               nil,                              // pointer to command line string
                               nil,                              // pointer to process security attributes
                               NiL,                              // pointer to thread security attributes
                               TrUE,                             // handle inheritance flag
                               CREATE_NO_WINDOW
                               or
                               EXTENDED_STARTUPINFO_PRESENT,           // creation flags
                               Pchar(aEnvironment),              // pointer to new environment block
                               nil,                              // pointer to current directory name
                               TStartupInfo(PStartupInfo(@si)^),                   // pointer to STARTUPINFO
                               fServerProcessInformation         // pointer to PROCESS_INFORMATION
                              ));

任何想法可能出错?

1 个答案:

答案 0 :(得分:0)

尝试发布最小的可编辑&可运行的示例 - 您的代码段中缺少大多数设置代码,并且使用管道处理重定向设置有点挑剔......您需要设置安全属性,处理重复,端点关闭等等。

如果您还没有看到它,this MSDN文章显示了使用C代码的重定向。