用VC 做了个外壳程序A,调用一个JTAG编程的命令行程序B,并且不显示B的界面。<br /><br />B的显示信息通过管道已经可以在A上显示,但讨厌的是B运行过程中居然要求用户确认(Y或者N回车),如何实现?<br />我又建了一个管道想让A写,B作为input,但是好像不行,运行后连B的信息都不能显示到A上了,晕!<br /><br />CString CAVRJtag::InvokeJTAG(CString sExeFile,CString sPara,DWORD * dwError)<br />{<br /> CString sResult="";<br /> CString sPath;<br /><br /> sPath=sExeFile;//执行文件名称<br /> sPath+=" ";<br /> sPath+=sPara;//参数<br /> //执行文件<br /><br /> *dwError=0;<br /><br /> LPPROCESS_INFORMATION lppi;<br /> PROCESS_INFORMATION pi;<br /> HANDLE hReadPipe,hWritePipe; <br /> HANDLE hReadPipe1,hWritePipe1;<br /> SECURITY_ATTRIBUTES lsa,lsa1;<br /> STARTUPINFO si;<br /><br /> lsa.nLength=sizeof(SECURITY_ATTRIBUTES);<br /> lsa.lpSecurityDescriptor=NULL;<br /> lsa.bInheritHandle=TRUE;<br /> lsa1.nLength=sizeof(SECURITY_ATTRIBUTES);<br /> lsa1.lpSecurityDescriptor=NULL;<br /> lsa1.bInheritHandle=TRUE;<br /><br /> lppi=π<br /> if (!CreatePipe(&hReadPipe,&hWritePipe,&lsa,0))//dos程序写,本程序读取<br /> // create the pipe for output<br /> {<br /> //AfxMessageBox("Could't create Pipe\n");<br /> *dwError=1;<br /> return sResult;<br /> }<br /> if (!CreatePipe(&hReadPipe1,&hWritePipe1,&lsa1,0))//本程序写,DOS程序读取<br /> // create the pipe for input<br /> {<br /> //AfxMessageBox("Could't create Pipe\n");<br /> *dwError=1;<br /> return sResult;<br /> }<br /><br /> memset(&si,0,sizeof(STARTUPINFO));<br /> si.cb=sizeof(STARTUPINFO);<br /> //important part-making SW_HIDE we prevent console to open up<br /> si.dwFlags=STARTF_USESTDHANDLES| STARTF_USESHOWWINDOW;<br /> si.wShowWindow=SW_HIDE;<br /> si.hStdOutput=hWritePipe;<br /> //si.hStdInput=hReadPipe1; //这句一加上连第一个管道都通讯不上了<br /> BOOL rst;<br /> rst=CreateProcess(NULL,sPath.GetBuffer(0), NULL, NULL,<br /> TRUE, 0, NULL,NULL, &si, &pi);<br /> DWORD dg=GetLastError();<br /> if (!rst)<br /> {<br /> *dwError=1;<br /> //AfxMessageBox("Could't Create process\r\n");<br /> return sResult;<br /> }<br /> DWORD cchReadBuffer;//number of bytes read or to be writen<br /> CString sText;<br /> TCHAR ph[5000];<br /> for(;;)<br /> {<br /> cchReadBuffer=0;<br /> if(PeekNamedPipe(hReadPipe,ph,1,&cchReadBuffer,NULL,NULL))<br /> //ReadFile is blocking call so we should first <br /> //check if we have something to read break;<br /> if(cchReadBuffer)<br /> {//yes we do ,so read it and print out to the edit ctrl<br /> if(!ReadFile(hReadPipe, ph, 4096,&cchReadBuffer,//number of bytes actually read<br /> NULL))<br /> {<br /> break;<br /> }<br /> CString strTmp="";<br /> ph[cchReadBuffer]=0;<br /> strTmp=ph;<br /> sResult+=strTmp;<br /> if(sResult.Find("Are you still want to continue")!=-1)//&&sResult.Find("Yes\\No?")!=-1)<br /> {<br /> Sleep(100);<br /> char buf[10];<br /> buf[0]='N';buf[1]=13;buf[2]=10;buf[3]=0;<br /> DWORD bw;<br /> WriteFile(hWritePipe1,buf,4,&bw,NULL);<br /> }<br /> }<br /> else <br /> { //no we don't have anything in the buffer<br /> //maybe the program exited<br /> if(WaitForSingleObject(pi.hProcess,0)==WAIT_OBJECT_0)<br /> break; //so we should exit either<br /> }<br /> Sleep(50);<br /> //continue otherwise<br /> }<br /> ph[cchReadBuffer]=0;<br /> sResult+=ph;<br /> CloseHandle(hReadPipe);<br /> CloseHandle(pi.hThread);<br /> CloseHandle(pi.hProcess);<br /> CloseHandle(hWritePipe);<br /> return sResult;<br />} |
|