在VB中如何使用匿名管道与CMD建立通信?

来源:百度知道 编辑:UC知道 时间:2024/05/17 09:07:34
如题,在VB中有一个主窗体Form1,两个文本框Text1和Text2,一个按钮Command1,现在我想在Text1中输入一个CMD命令,点命令按钮后执行这个命令,并将CMD的返回值打印到Text2中,要求使用匿名管道,要测试过能用的,如果太长发我邮箱wzy950507@sina.con.cn,谢谢!好的追加。
首先谢谢tzwsoho和ljl88900的回答
也许是我没有说清楚,我想要的是 与CMD建立通信 ,就是实现和用CMD一样的效果,让我所有的命令都在同一个CMD中执行。
回复 tzwsoho和 ljl88900,你们的回复我看了,但是如果用CreateProcess直接执行命令的话,一些CMD的命令执行时会报错。我用"ipconfig" ," ","cd..","c:","cls"和"hud"五个命令检验了你们的代码,这五个命令前四个在CMD中都应该能正确执行,但你们的程序只能执行"ipconfig"这一个命令
希望得到你们更改后的源码,另外希望如果有其他回答者注意 "让我所有的命令都在同一个CMD中执行"这一句话,谢谢!

我确切地告诉楼主,目前没有完善地解决方法。
所有控制台程序的确可以通过管道通讯与其它程序建立输入输出联系,但是要进行交互,就要看这个程序本身了。
由于标准输入输出流的缓冲的存在,经常会导致通过管道获取输出的程序的卡死。
比如你要用管道获取ping的结果,那么必须等到ping完成之后才能获取。你要用管道获取cmd中一个命令的执行结果,那么如果这个命令的输出没有引起缓冲区刷新,则你的程序会一直卡死在那里。

上面俩人给的例子我都看了,都是那种最简单的执行一个程序获取控制台输出的例子。不能完成与cmd的交互,也不能完成与绝大部分有控制台输入输出的程序的交互,因为这些例子都是等待一个程序执行完毕后才获取输出,假如一个程序在执行中暂停,等待输入,那么这些例子无一例外的会被卡死。
————————————————————————————

楼主有意无视我的回答啊。

他们只是随便搞了份可以获取控制台输出的代码而已,这种代码网上一搜一大堆的。
我都说的这么明确了,目前没有好的解决方法。你不用指望他们能怎么改进了,你的本质要求是“制作一个程序,能够和cmd进行交互,向cmd发送输入,同时即时获取cmd的输出”,而他们的程序的作用是“执行一个程序并在这个程序结束后获取它的控制台输出”,两个东西完全不一样的。
他们的程序为什么只能成功执行ipconfig?因为那四个可以在cmd中执行的命令里面只有ipconfig是个程序,其它三个都是cmd命令。他们的程序并不是调用cmd,而是自己直执行了程序并获取输出,和cmd一点关系都没沾上。

我专门在这个方面研究过很久,最后微软官方站点给出的答复:“没有完善的解决方案,必须要求控制台程序在每次输出后fflush自己的缓冲才能避免卡死。”这是官方的话(原文是英文的)。
因此你能否通过管道与一个控制台程序交互的关键因素在于这个控制台程序是否经常刷新它的输出缓冲,如果它不做,你自己的程序再努力也没办法的。

如果你还无视我的回答,那我只能无语了。