获取子进程的输出

CStdioFile file;
	CString strRead;
	CStringList stacklist; 
	int itemID = 0;
	CDebugTombstoneDlg * pthis = (CDebugTombstoneDlg *) lpParameter;
	HANDLE   hReadPipe, hWritePipe; 
	SECURITY_ATTRIBUTES   sat; 
	STARTUPINFO   startupinfo; 
	PROCESS_INFORMATION   pinfo; 
	BYTE   buffer[1024]; 
	DWORD   byteRead; 
	CString   temp;
	CString cmdline;
	sat.nLength=sizeof(SECURITY_ATTRIBUTES); 
	sat.bInheritHandle=true; 
	sat.lpSecurityDescriptor=NULL; 
	file.Open(_T(pthis->m_logpath), NULL, NULL);

	while(file.ReadString(strRead))
	{
		if(strRead.Find("#", 0) != -1)
		{
			if(!CreatePipe(&hReadPipe, &hWritePipe, &sat, NULL)){ 
				AfxMessageBox("Create Pipe Error!"); 
				return 0; 
			} 
			stacklist.AddHead(strRead);
			int item=pthis->m_list.InsertItem(itemID,"");
			pthis->m_list.SetItemText(item, 0, strRead.SpanExcluding(_T("/")).Right(10));
			pthis->m_list.SetItemText(item, 1, strRead.Right(strRead.GetLength() - strRead.Find("/")));
			int x = strRead.Replace("/","\\");
			startupinfo.cb=sizeof(STARTUPINFO); 
			GetStartupInfo(&startupinfo); 
			startupinfo.hStdOutput=hWritePipe; 
			startupinfo.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; 
			startupinfo.wShowWindow=SW_HIDE; 
			cmdline = "";
			cmdline = "arm-linux-androideabi-addr2line.exe -e ";
			cmdline += pthis->m_sympath;
			cmdline += strRead.Right(strRead.GetLength() - strRead.Find("\\"));
			cmdline += " -C -f -i ";
			cmdline += strRead.SpanExcluding(_T("\\")).Right(10);
			if(!CreateProcess(NULL, (LPSTR)(LPCTSTR)cmdline, NULL, NULL, TRUE, NULL, NULL, NULL, &startupinfo, &pinfo)) 
			{
				return GetLastError();

			}
			CloseHandle(hWritePipe);
			RtlZeroMemory(buffer,1024);
			temp="";
			while(ReadFile(hReadPipe,buffer,1024*sizeof(BYTE),&byteRead,NULL)!=NULL){ 
				 
				temp+=buffer;
				RtlZeroMemory(buffer,1024);
			}
			pthis->m_list.SetItemText(item, 2, temp);
			CloseHandle(hReadPipe);
			
		}
	}
	return 0;
}




大体方法就是通过使用管道来重定向子进程的输出流.记得加上句柄继承属性.不然子进程是无法享用父进程创建的对象的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值