这人多,问个windows下向命令行程序发送字符的问题。

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

发到CSDN上吧……

  
McuPlayer 发表于 2009-5-11 17:29 | 显示全部楼层

这个做法基本是对的

创建PIPE<br />然后执行那个程序(命令行程序)<br />然后把输出分析后,再显示给用户<br /><br />把你遇到的具体问题说出来,看能不能帮到你。
李冬发 发表于 2009-5-11 18:50 | 显示全部楼层

你不用了管道吗,管道不仅可以输出,也还可以输入的。

  
 楼主| 音乐乐乐 发表于 2009-5-12 09:59 | 显示全部楼层

问题出在这里,但不知道原因

if(!ReadFile(hReadPipe,&nbsp;&nbsp;&nbsp;&nbsp;ph,&nbsp;&nbsp;&nbsp;&nbsp;4096,&cchReadBuffer,//number&nbsp;of&nbsp;bytes&nbsp;actually&nbsp;read<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL))<br />在读取管道数据的时候发现,只有等到被调用的命令行程序B运行结束后才能返回数据,这是怎么回事呢?
computer00 发表于 2009-5-12 10:10 | 显示全部楼层

看看有没有不让确认的参数?

  
 楼主| 音乐乐乐 发表于 2009-5-12 10:57 | 显示全部楼层

没有,呵呵,必须要确认,就是烧熔丝的时

&nbsp;这个问题好像比较普遍,就是管道要等到被调用程序结束后才能收到数据,正在搜索方法...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

350

主题

2293

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部