VB.NET经过长时间的发展,很多用户都很了解VB.NET了,这里我发表一下个人理解,和大家讨论讨论。在Windows环境下的所谓shell程序就是dos命令行程序,比如VC的CL.exe命令行编译器,JDK的javac编译器,启动java程序用的java.exe都是标准的shell程序。截获一个shell程序的输出是很有用的,比如说您可以自己编写一个IDE(集成开发环境),当用户发出编译指令时候,你可以在后台启动shell调用编译器并截获它们的输出,对这些输出信息进行分析后在更为友好的用户界面上显示出来。为了方便起见,我们用VB作为本文的演示语言。
创新互联是专业的桃城网站建设公司,桃城接单;提供成都网站制作、网站设计、外贸网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行桃城网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
#T#通常,系统启动Shell程序时缺省给定了3个I/O信道,标准输入(stdin),标准输出stdout,标准错误输出stderr。之所以这么区分是因为在早期的计算机系统如PDP-11的一些限制。那时没有GUI,将输出分为stdout,stderr可以避免程序的调试信息和正常输出的信息混杂在一起。通常,shell程序把它们的输出写入标准输出管道(stdout)、把出错信息写入标准错误管道(stderr)。缺省情况下,系统将管道的输出直接送到屏幕,这样一来我们就能看到应用程序运行结果了。为了捕获一个标准控制台应用程序的输出,我们必须把standOutput和standError管道输出重定向到我们自定义的管道。
下面的代码可以启动一个VB.NET shell程序,并将其输出截获。执行并返回一个命令行程序(shell程序)的标准输出和标准错误输出'通常命令行程序的所有输出都直接送到屏幕上
- PrivateFunctionExecuteApp(sCmdlineAsString)
- AsStringDimprocAsPROCESS_INFORMATION,
- retAsLongDimstartAsSTARTUPINFO
- DimsaAsSECURITY_ATTRIBUTESDimhReadPipeAsLong'负责读取的管道
- DimhWritePipeAsLong'负责Shell程序的标准输出和标准错误输出的管道
- DimsOutputAsString'放返回的数据
- DimlngBytesReadAsLong,
- sBufferAsString*256sa.nLength=Len(sa)
- sa.bInheritHandle=Trueret=CreatePipe(hReadPipe,
- hWritePipe,sa,0)Ifret=0ThenMsgBox
- "CreatePipefailed.Error:"&Err.LastDllErrorExitFunction
- EndIfstart.cb=Len(start)
- start.dwFlags=STARTF_USESTDHANDLESOrSTARTF_USESHOWWINDOW'把标准输出和标准错误输出重定向到同一个管道中去。
- start.hStdOutput=hWritePipestart.hStdError=hWritePipestart.wShowWindow=SW_HIDE'隐含shell程序窗口'启动shell程序,sCmdLine指明执行的路径
- ret=CreateProcessA(0&,sCmdline,sa,sa,
- True,NORMAL_PRIORITY_CLASS,_0&,0&,start,proc)
- Ifret=0ThenMsgBox"无法建立新进程,错误码:
- "&Err.LastDllErrorExitFunctionEndIf'本例中不必向shell程序送信息,因此可以先关闭
- hWritePipeCloseHandlehWritePipe'循环读取shell程序的输出,每次读取256个字节。
- Doret=ReadFile(hReadPipe,sBuffer,256,lngBytesRead,0&)
- sOutputsOutput=sOutput&Left$(sBuffer,lngBytesRead)LoopWhileret<>0'如果ret=0代表没有更多的信息需要读取了'释放相关资源
- CloseHandleproc.hProcessCloseHandleproc.hThreadCloseHandlehReadPipeExecuteApp=sOutput'输出结果EndFunction
我对这个程序进行一些解释。
- ret=CreatePipe(hReadPipe,hWritePipe,sa,0)
再把VB.NET shell程序的标准输出和标准错误输出都定向到我们预先建好的管道中。
代码如下:
- start.dwFlags=STARTF_USESTDHANDLESOrSTARTF_USESHOWWINDOW
- start.hStdOutput=hWritePipe
- start.hStdError=hWritePipe
好,现在可以调用建立新进程的函数了:
- ret=CreateProcessA(0&,sCmdline,sa,sa,True,NORMAL_PRIORITY_CLASS,0&,0&,start,proc)
然后,循环读管道里的数据直到无数据可读为止。
- Do
- ret=ReadFile(hReadPipe,sBuffer,256,lngBytesRead,0&)'每次读256字节
- sOutputsOutput=sOutput&Left$(sBuffer,lngBytesRead)'送入一个字符串中
- LoopWhileret<>0'若ret=0表明没有数据等待读取。
然后,释放不用的资源。
VB.NET shell程序用法很简单:比如:
- MsgBoxExecuteApp("c:\windows\command\mem.exe)
名称栏目:快速使用VB.NETshell程序
标题路径:http://www.shufengxianlan.com/qtweb/news41/300041.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联