这里就启动VB.NET shell程序,并将其输出截获做出了详细的代码分析,执行并返回一个命令行程序(shell程序)的标准输出和标准错误输出'通常命令行程序的所有输出都直接送到屏幕上。

VB.NET通过长期的开展,许多用户都很了解VB.NET了,这儿我宣布一下个人了解,和咱们评论评论。在Windows环境下的所谓shell程序便是dos命令行程序,比方VC的CL.exe命令行编译器,JDK的javac编译器,发动java程序用的java.exe都是规范的shell程序。截获一个shell程序的输出是很有用的,比方说您能够自己编写一个IDE(集成开发环境),当用户宣布编译指令时分,你能够在后台发动shell调用编译器并截获它们的输出,对这些输出信息进行剖析后在更为友爱的用户界面上显示出来。为了便利起见,咱们用VB作为本文的演示言语。

快速运用VB.NET shell程序(vb.net shell函数)  VB.NET shell程序 第1张

#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)
转载请说明出处
知优网 » 快速运用VB.NET shell程序(vb.net shell函数)

发表评论

您需要后才能发表评论