如何捕捉子进程的输出
2014-05-08 08:45
232 查看
上篇文章讲到了如何在Windows服务当中以普通用户启动一个子进程,启动了以后需要跟子进程进行通讯,子进程在获取了一些有用的信息以后需要传递给父进程,Windows进程间通信的方式有很多,但是最适合父子进程之间通信的应该是输入输出重定向的方式,即匿名管道的方式。
在参考了MSDN上的例程以及其他网络上的资料以后,使用如下代码完成父子进程间的通信:
在参考了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);
相关文章推荐
- PHP.ini修改配置下载上传文件大小
- Metro UI CSS
- Careercup - Google面试题 - 5162732873580544
- java匿名内部类
- iOS 消息(即方法调用)的两个隐藏参数 :self 和 _cmd
- Qt on Android:将Qt调试信息输出到logcat中
- OCP-1Z0-051 第72题 oracle内置函数
- 如何让编程产能翻二番?
- ngx conf相关
- 连接池中的maxIdle,MaxActive,maxWait参数
- I386体系结构(下)
- 如何让编程产能翻二番?
- 开发者最喜爱的十大开源Xcode插件
- [转载]Android 生成keystore,两种方式
- Linux nc(NetCat)命令详解
- JS数据类型
- CAJViewer文字识别功能的使用方法
- 875875785
- 三星六月或推GALAXY S5高配版 为对抗G3
- 父类引用指向子类对象