您的位置:首页 > 其它

如何捕捉子进程的输出

2014-05-08 08:45 232 查看
上篇文章讲到了如何在Windows服务当中以普通用户启动一个子进程,启动了以后需要跟子进程进行通讯,子进程在获取了一些有用的信息以后需要传递给父进程,Windows进程间通信的方式有很多,但是最适合父子进程之间通信的应该是输入输出重定向的方式,即匿名管道的方式。

在参考了MSDN上的例程以及其他网络上的资料以后,使用如下代码完成父子进程间的通信:

HANDLE hRead = NULL;
HANDLE hWrite = NULL;
char szBuffer[1024]={0};
DWORD dwRead = 0;

SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
// 新创建的进程继承管道读写句柄
sa.bInheritHandle = TRUE;
if ( !CreatePipe( &hRead, &hWrite, &sa, 0 ) )  {
return ;
}

if ( NULL == hRead || NULL == hWrite ) {
return;
}

char cstrNewDosCmd[] = "childprocess.exe";
STARTUPINFO si;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;            // 把创建进程的标准错误输出重定向到管道输入
si.hStdOutput = hWrite;           // 把创建进程的标准输出重定向到管道输入
si.wShowWindow = SW_HIDE;

si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

PROCESS_INFORMATION pi;
// 启动进程
DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS|CREATE_UNICODE_ENVIRONMENT|CREATE_NO_WINDOW;
BOOL bSuc = CreateProcess(NULL, cstrNewDosCmd, NULL, NULL, TRUE, dwCreationFlag, NULL, NULL, &si, &pi);

//在读取管道内容前,关闭写管道
if ( NULL != hWrite )
{
CloseHandle(hWrite);
hWrite = NULL;
}

char szFullPath[MAX_PATH]={0};
//读取管道内的所有内容
while(ReadFile( hRead, szBuffer, 1024, &dwRead, NULL ))
{
strcat(szFullPath, szBuffer);
memset(szBuffer, 0, 1024);
}
//输出内容
cout<<szFullPath<<endl;

CloseHandle(hRead);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: