您的位置:逆风者 VB 正文
原作者:www.upwinder.com 添加时间:2007-09-02 原文发表:2007-08-31 人气:34 来源:未知

本文章共2787字,分2页,当前第1页,快速翻页:
 
在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管道输出重定向到我们自定义的管道。

下面的代码可以启动一个shell程序,并将其输出截获。
'执行并返回一个命令行程序(shell程序)的标准输出和标准错误输出'通常命令行程序的所有输出都直接送到屏幕上Private Function ExecuteApp(sCmdline As String) As String Dim proc As PROCESS_INFORMATION, ret As Long Dim start As STARTUPINFO Dim sa As SECURITY_ATTRIBUTES Dim hReadPipe As Long '负责读取的管道 Dim hWritePipe As Long '负责Shell程序的标准输出和标准错误输出的管道 Dim sOutput As String '放返回的数据 Dim lngBytesRead As Long, sBuffer As String * 256 sa.nLength = Len(sa) sa.bInheritHandle = True ret = CreatePipe(hReadPipe, hWritePipe, sa, 0) If ret = 0 Then MsgBox "CreatePipe failed. Error: " & Err.LastDllError Exit Function End If start.cb = Len(start) start.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW' 把标准输出和标准错误输出重定向到同一个管道中去。start.hStdOutput = hWritePipe start.hStdError = hWritePipe start.wShowWindow = SW_HIDE '隐含shell程序窗口 ' 启动shell程序, sCmdLine指明执行的路径 ret = CreateProcessA(0&, sCmdline, sa, sa, True, NORMAL_PRIORITY_CLASS, _ 0&, 0&, start, proc) If ret = 0 Then MsgBox "无法建立新进程,错误码:" & Err.LastDllError Exit Function End If ' 本例中不必向shell程序送信息,因此可以先关闭hWritePipe CloseHandle hWritePipe ' 循环读取shell程序的输出,每次读取256个字节。 Do ret = ReadFile(hReadPipe, sBuffer, 256, lngBytesRead, 0&) sOutput = sOutput & Left$(sBuffer, lngBytesRead) Loop While ret <> 0 ' 如果ret=0代表没有更多的信息需要读取了 ' 释放相关资源 CloseHandle proc.hProcess CloseHandle proc.hThread CloseHandle hReadPipe ExecuteApp = sOutput ' 输出结果End Function

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

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

大家可以看到,首先我们建立一个匿名管道。该匿名管道稍候将用来取得与被截获的应用程序的联系。其中hReadPipe用来获取shell程序的输出,而hWritePipe可以用来向应用程序发送信息。如同现实世界中的水管一样,水从管道的一端流进从另一端流出。您把水想象为信息,水管就是匿名管道,这样一来就很好理解这段程序了。
然后就是设置shell应用程序的初始属性。 Dwflags可以指示系统在创建新进程时新进程使用了自定义的wShowWindow, hStdInput,hStdOutput和hStdError。(windows显示属性,标准输入,标准输出,标准错误输出。)
 
本文章更多内容1 - 2 - 下一页>>
相关文章

用FileSystemWatcher监控作业
用运算符Like来比较字符串
VB设计动画时钟
如何通过VB获取网卡地址
Boolean 值的转换
用API函数Mcisendstring直接播放背景音乐
VB6中的FSO对象模型
用VB6.0实现几种图文特效的演示程序
取得某个目录底下所有文件大小总和
文本框中光标位置的获得
用VB编写网络寻呼机
Windows API的作用及使用技巧
VB数组小技巧一则
在VB中制作单独程序封面的两种方法
用Visual Basic的Move方法实现动画效果
用FreeFile防止文件打开冲突
VB6.0开发网络应用的5个技巧
VB编程步步高-打印篇(一)
通往 Internet 的捷径---捷径档的结构
操作VB中的无边框窗体

相关评论


本文章所属分类:首页 VB

  热门关键字: