我想创建一个子句柄继承为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
));
任何想法可能出错?
答案 0 :(得分:0)
尝试发布最小的可编辑&可运行的示例 - 您的代码段中缺少大多数设置代码,并且使用管道处理重定向设置有点挑剔......您需要设置安全属性,处理重复,端点关闭等等。
如果您还没有看到它,this MSDN文章显示了使用C代码的重定向。