獲取子進程的輸出

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;
}




大體方法就是通過使用管道來重定向子進程的輸出流.記得加上句柄繼承屬性.不然子進程是無法享用父進程創建的對象的.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章