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