文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何使用VB.NET的shell程序

2023-06-17 20:23

关注

这篇文章主要介绍如何使用VB.NET的shell程序,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

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

通常,系统启动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.NET的shell程序”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯