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; }
大体方法就是通过使用管道来重定向子进程的输出流.记得加上句柄继承属性.不然子进程是无法享用父进程创建的对象的.
获取子进程的输出
最新推荐文章于 2022-11-15 11:47:28 发布