| 
 
|  用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 />} | 
 |