大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 如何在VB中截获shell程序的输出

如何在VB中截获shell程序的输出

时间: 2021-07-31 作者:daque

在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表露属性,规范输出,规范输入,规范缺点输入。) 再把shell运用步调的规范输入和规范缺点输入都定向到咱们预先建好的弹道中。 代码如次: start.dwflags = startf_usestdhandles or startf_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字节 soutput = soutput & left$(sbuffer, lngbytesread) '送入一个字符串中 loop while ret <> 0 '若 ret = 0 表白没罕见据等候读取。 而后,开释不必的资源。 用法很大略:比方: msgbox executeapp("c:\windows\command\mem.exe) 是很简单吧? 然而,那些步调是在nt下的,即使要在95下实行还须要一点点变换。由于即使该因变量挪用一个纯win32的步调,没题目。然而95是16,win32搀和的体例,当你试图挪用一个16位的dos运用步调那么,那么这个方法会引导关系过程挂起。由于这波及到windowsnt和windows 95对shell的各别实行。 在win9第5中学,16位shell步调封闭时并不保护重定向的弹道也封闭,如许,当你的步调试图读取一个仍旧封闭的shell步调的重定向弹道时,你的步调就挂了。 那么,有处置方法吗?回复是确定的。 处置方法即是用一个win32的运用步调动作您的运用步调和shell步调的中央人。中央人步调接受并列定向了主步调的输出输入,而后中央人步调启用指定的shell步调。该shell步调也就接受并列定向了主步调的输出输入。中央人步调从来比及shell步调中断才中断。 当shell步调中断时,中央人步调也中断,同声由于中央人步调是一个win32步调,那么它就会封闭相映的重定向了弹道。如许,你的步调不妨创造弹道仍旧封闭,便不妨跳出轮回。你的步调就不会挂起了。 底下是关系的中央人步调c代码的实行: #include <windows.h>#include <stdio.h>void main (int argc, char *argv[]){ bool bret = false; startupinfo si = {0}; process_information pi = {0}; // make child process use this app's standard files. si.cb = sizeof(si); si.dwflags = startf_usestdhandles; si.hstdinput = getstdhandle (std_input_handle); si.hstdoutput = getstdhandle (std_output_handle); si.hstderror = getstdhandle (std_error_handle); bret = createprocess (null, argv[1], null, null, true, 0, null, null, &si, &pi ); if (bret) { waitforsingleobject (pi.hprocess, infinite); closehandle (pi.hprocess); closehandle (pi.hthread); }} 把该步调编写翻译为conspawn.exe并放在体例不妨挪用到的路途目次中。 而后把作品发端提到的代码中的createprocessa语句改为: ret = createprocessa(0&, "conspawn """ & scmdline & """", sa, sa, true, normal_priority_class, 0&, 0&, start, proc) 好,如许一来,咱们这个因变量不妨同声很好的扶助windowsnt和windows95/98了。 

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.