快速使用VB.NET shell程序
创始人
2024-06-10 10:51:41
0

VB.NET经过长时间的发展,很多用户都很了解VB.NET了,这里我发表一下个人理解,和大家讨论讨论。在Windows环境下的所谓shell程序就是dos命令行程序,比如VC的CL.exe命令行编译器,JDK的javac编译器,启动java程序用的java.exe都是标准的shell程序。截获一个shell程序的输出是很有用的,比如说您可以自己编写一个IDE(集成开发环境),当用户发出编译指令时候,你可以在后台启动shell调用编译器并截获它们的输出,对这些输出信息进行分析后在更为友好的用户界面上显示出来。为了方便起见,我们用VB作为本文的演示语言。

#T#通常,系统启动Shell程序时缺省给定了3个I/O信道,标准输入(stdin),标准输出stdout,标准错误输出stderr。之所以这么区分是因为在早期的计算机系统如PDP-11的一些限制。那时没有GUI,将输出分为stdout,stderr可以避免程序的调试信息和正常输出的信息混杂在一起。通常,shell程序把它们的输出写入标准输出管道(stdout)、把出错信息写入标准错误管道(stderr)。缺省情况下,系统将管道的输出直接送到屏幕,这样一来我们就能看到应用程序运行结果了。为了捕获一个标准控制台应用程序的输出,我们必须把standOutput和standError管道输出重定向到我们自定义的管道。

下面的代码可以启动一个VB.NET shell程序,并将其输出截获。执行并返回一个命令行程序(shell程序)的标准输出和标准错误输出'通常命令行程序的所有输出都直接送到屏幕上

  1. PrivateFunctionExecuteApp(sCmdlineAsString)  
  2. AsStringDimprocAsPROCESS_INFORMATION,  
  3. retAsLongDimstartAsSTARTUPINFO  
  4. DimsaAsSECURITY_ATTRIBUTESDimhReadPipeAsLong'负责读取的管道  
  5. DimhWritePipeAsLong'负责Shell程序的标准输出和标准错误输出的管道  
  6. DimsOutputAsString'放返回的数据  
  7. DimlngBytesReadAsLong,  
  8. sBufferAsString*256sa.nLength=Len(sa)  
  9. sa.bInheritHandle=Trueret=CreatePipe(hReadPipe,  
  10. hWritePipe,sa,0)Ifret=0ThenMsgBox 
  11. "CreatePipefailed.Error:"&Err.LastDllErrorExitFunction  
  12. EndIfstart.cb=Len(start)  
  13. start.dwFlags=STARTF_USESTDHANDLESOrSTARTF_USESHOWWINDOW'把标准输出和标准错误输出重定向到同一个管道中去。  
  14. start.hStdOutput=hWritePipestart.hStdError=hWritePipestart.wShowWindow=SW_HIDE'隐含shell程序窗口'启动shell程序,sCmdLine指明执行的路径  
  15. ret=CreateProcessA(0&,sCmdline,sa,sa,  
  16. True,NORMAL_PRIORITY_CLASS,_0&,0&,start,proc)  
  17. Ifret=0ThenMsgBox"无法建立新进程,错误码:  
  18. "&Err.LastDllErrorExitFunctionEndIf'本例中不必向shell程序送信息,因此可以先关闭  
  19. hWritePipeCloseHandlehWritePipe'循环读取shell程序的输出,每次读取256个字节。  
  20. Doret=ReadFile(hReadPipe,sBuffer,256,lngBytesRead,0&)  
  21. sOutputsOutput=sOutput&Left$(sBuffer,lngBytesRead)LoopWhileret<>0'如果ret=0代表没有更多的信息需要读取了'释放相关资源  
  22. CloseHandleproc.hProcessCloseHandleproc.hThreadCloseHandlehReadPipeExecuteApp=sOutput'输出结果EndFunction 

我对这个程序进行一些解释。

  1. ret=CreatePipe(hReadPipe,hWritePipe,sa,0) 

再把VB.NET shell程序的标准输出和标准错误输出都定向到我们预先建好的管道中。
代码如下:

  1. start.dwFlags=STARTF_USESTDHANDLESOrSTARTF_USESHOWWINDOW 
  2. start.hStdOutput=hWritePipe 
  3. start.hStdError=hWritePipe 

好,现在可以调用建立新进程的函数了:

  1. ret=CreateProcessA(0&,sCmdline,sa,sa,True,NORMAL_PRIORITY_CLASS,0&,0&,start,proc) 


然后,循环读管道里的数据直到无数据可读为止。

  1. Do  
  2. ret=ReadFile(hReadPipe,sBuffer,256,lngBytesRead,0&)'每次读256字节  
  3. sOutputsOutput=sOutput&Left$(sBuffer,lngBytesRead)'送入一个字符串中  
  4. LoopWhileret<>0'若ret=0表明没有数据等待读取。  

然后,释放不用的资源。

VB.NET shell程序用法很简单:比如:

  1. MsgBoxExecuteApp("c:\windows\command\mem.exe) 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...