捕获stdout以获取远程进程的子进程

时间:2018-03-06 07:13:44

标签: c++ winapi pipe win32-process

目前处理我需要为外部进程的子进程捕获stdout / stderr的情况。对于这种情况,我需要一个命名管道吗?

我目前尝试了以下内容:

SECURITY_ATTRIBUTES saAttr;
HANDLE hStdOutRd = NULL;
HANDLE hStdOutWr = NULL;
HANDLE hDupStdOutWr = NULL;

saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
saAttr.bInheritHandle = TRUE; 
saAttr.lpSecurityDescriptor = NULL; 

CreatePipe(&hStdOutRd, &hStdOutWr, &saAttr, 0) ) 
SetHandleInformation(hStdOutRd, HANDLE_FLAG_INHERIT, 0) )

HANDLE hExProc = OpenProcess(PROCESS_DUP_HANDLE, false, EXTERNAL_PROC);
DuplicateHandle(GetCurrentProcess(), 
                hStdOutWr, 
                hExProc,
                &hDupStdOutWr, 
                0,
                TRUE,
                DUPLICATE_SAME_ACCESS);

// Child process for EXTERNAL_PROC executes and should inherit the duplicated handle
// Read from hStdOutRd

从管道读取时,它会挂起或不返回任何内容。我假设这是一个匿名管道,只适用于父子进程而不是外部进程。我宁愿不使用命名管道,是否可以将DuplicateHandle()管道从远程进程返回到我的进程然后访问数据?如果是这样,那会是什么样的?

1 个答案:

答案 0 :(得分:0)

不,你不需要使用命名管道,匿名管道就可以了。 MSDN提供了捕获子进程输出的完整示例:

Creating a Child Process with Redirected Input and Output