CreateProcess:在C ++ / Windows中将子stdoutredirect到父标准输出

根据MSDN,这将小孩stdoutredirect到父标准输出,但它没有,什么是错的?

PROCESS_INFORMATION pi; STARTUPINFOA si; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); si.hStdError = GetStdHandle(STD_ERROR_HANDLE); si.dwFlags |= STARTF_USESTDHANDLES; BOOL ret = CreateProcessA( 0, cmd_line, 0, 0, TRUE, CREATE_NO_WINDOW, 0, 0, & si, & pi); 

使用DuplicateHandle没有帮助:

 HANDLE out, err;//global variables ... PROCESS_INFORMATION pi; STARTUPINFOA si; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); BOOL ret = DuplicateHandle( GetCurrentProcess(), GetStdHandle(STD_OUTPUT_HANDLE), GetCurrentProcess(), &out, 0, TRUE, DUPLICATE_SAME_ACCESS);//todo check ret ret = DuplicateHandle( GetCurrentProcess(), GetStdHandle(STD_ERROR_HANDLE), GetCurrentProcess(), &err, 0, TRUE, DUPLICATE_SAME_ACCESS);//todo check ret si.hStdOutput = out; si.hStdError = err; si.dwFlags |= STARTF_USESTDHANDLES; ret = CreateProcessA( 0, cmd_line, 0, 0, TRUE, CREATE_NO_WINDOW, 0, 0, & si, & pi); 

Solutions Collecting From Web of "CreateProcess:在C ++ / Windows中将子stdoutredirect到父标准输出"

BOOL ret = CreateProcessA( 0, cmd_line, 0, 0, TRUE, CREATE_NO_WINDOW, 0, 0, & si, & pi);

CREATE_NO_WINDOW导致此行为,请将其删除:

BOOL ret = CreateProcessA( 0, cmd_line, 0, 0, TRUE, 0, 0, 0, & si, & pi);

首先,我第二个迈克尔的建议。 你不应该再次使用A版本,除非出于某种疯狂的原因你需要支持Windows 98.提示:你不需要。 你应该只能使用W版本。 总是#define UNICODE !!!

根据文件:

STARTF_USESTDHANDLES 0x00000100 hStdInputhStdOutputhStdError members包含附加信息。

如果调用其中一个进程创建函数时指定了此标志,则该句柄必须是可继承的,并且该函数的bInheritHandles参数必须设置为TRUE。 有关更多信息,请参见处理继承。

GetStdHandle返回的句柄不一定是可继承的句柄,它们可能是不可继承的,也可能是伪句柄。 实际上,它们可能根本不存在,它们可能是null或INVALID_HANDLE_VALUE – 你也需要检查。

为了从一个不可继承的句柄或伪句柄中获得一个可继承的句柄,你需要使用DuplicateHandle

不要将父级的stdout / stderr句柄直接传递给子进程。 使用CreatePipe()创建读/写管道,将其写入端点分配给子进程stdout / stderr句柄,然后让父进程使用ReadFile()从管道读取数据,并将接收到的数据写入其自己的stdout / stderr根据需要。 MSDN展示了如何使用CreatePipe()

使用重定向输入和输出创建子进程