国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

如何在VB中截獲shell程序的輸出

如何在VB中截獲shell程序的輸出

更新時間:2022-05-04 文章作者:未知 信息來源:網絡 閱讀次數:

在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的不同實現。
在win95中,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了。 

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        国产一区二区福利| 成人v精品蜜桃久久一区| 日韩电影在线一区二区三区| 欧美日韩一级大片网址| 无吗不卡中文字幕| 日韩一卡二卡三卡四卡| 九九九精品视频| 中文字幕中文乱码欧美一区二区| 色婷婷精品久久二区二区蜜臂av| 亚洲一区二区三区激情| 日韩一区二区三区精品视频| 不卡视频在线观看| 日韩 欧美一区二区三区| 欧美激情在线一区二区三区| 91官网在线免费观看| 麻豆成人久久精品二区三区红| 国产日韩欧美在线一区| 欧美视频中文一区二区三区在线观看 | 国产乱子伦视频一区二区三区| 国产精品卡一卡二| 欧美一区二视频| 91影院在线免费观看| 国产综合色在线| 日韩影院免费视频| 亚洲精品videosex极品| 国产农村妇女毛片精品久久麻豆| 精品视频在线看| av午夜精品一区二区三区| 老司机一区二区| 五月天网站亚洲| 亚洲欧美日韩电影| 中日韩免费视频中文字幕| 精品国内片67194| 欧美年轻男男videosbes| 福利视频网站一区二区三区| 蜜臀91精品一区二区三区| 樱花草国产18久久久久| 日本一区二区三级电影在线观看 | 粉嫩绯色av一区二区在线观看 | 美腿丝袜亚洲一区| 一区二区三区免费网站| 国产精品美女久久福利网站| 日韩精品一区二区三区swag| 精品视频在线免费| 欧美亚洲一区二区在线观看| caoporm超碰国产精品| 国产成人免费视频网站| 日本欧美一区二区| 日韩va欧美va亚洲va久久| 亚洲国产一区二区a毛片| 一区二区免费在线播放| 中文字幕制服丝袜一区二区三区 | 久久国产精品区| 免费成人你懂的| 蜜臀久久99精品久久久久久9 | 狠狠色丁香婷婷综合久久片| 亚洲成人精品一区| 亚洲高清免费观看高清完整版在线观看| 亚洲欧美在线视频| 夜夜揉揉日日人人青青一国产精品| 亚洲人精品午夜| 性做久久久久久久久| 日本怡春院一区二区| 日韩国产欧美三级| 另类成人小视频在线| 国产精品18久久久久久久久| 国产成都精品91一区二区三| 成人在线视频一区| 一本色道a无线码一区v| 欧美高清视频一二三区| 欧美成人猛片aaaaaaa| 国产亚洲一区二区三区| 亚洲女性喷水在线观看一区| 亚洲国产视频一区二区| 久久99精品国产麻豆婷婷洗澡| 国产真实乱偷精品视频免| 成人av先锋影音| 欧美性xxxxxxxx| 欧美精品一区男女天堂| 国产精品热久久久久夜色精品三区| 国产精品久久网站| 日韩 欧美一区二区三区| 国产福利91精品一区| 欧美亚洲日本国产| 日韩精品一区二区三区三区免费 | 91影院在线免费观看| 欧美日韩精品电影| 久久精品在线观看| 亚洲一区二区三区四区不卡| 国产一区不卡在线| 色综合咪咪久久| 精品粉嫩超白一线天av| 亚洲精品国产a久久久久久| 久久精品久久精品| 欧美又粗又大又爽| 久久精品日产第一区二区三区高清版| 亚洲男人的天堂网| 国产在线视频不卡二| 欧美色精品在线视频| 国产亚洲综合av| 亚洲aⅴ怡春院| 97精品国产97久久久久久久久久久久 | 精品国产一二三区| 亚洲小说春色综合另类电影| 国产凹凸在线观看一区二区| 欧美日本不卡视频| 一区二区视频在线| 国产寡妇亲子伦一区二区| 在线综合+亚洲+欧美中文字幕| 综合在线观看色| 懂色av中文一区二区三区| 91精品国产一区二区三区| 亚洲最大成人综合| 91首页免费视频| 中文字幕欧美三区| 国产成人免费网站| 2欧美一区二区三区在线观看视频| 一区二区三区资源| 91国在线观看| 亚洲色大成网站www久久九九| 激情综合色综合久久| 欧美一级高清片| 偷偷要91色婷婷| 在线观看成人免费视频| 亚洲欧美日韩系列| 91色.com| 亚洲综合精品久久| 91国模大尺度私拍在线视频| 1区2区3区国产精品| 91丨porny丨最新| 一区二区三区影院| 91在线一区二区三区| 亚洲男人的天堂一区二区| 色先锋aa成人| 婷婷六月综合网| 日韩欧美黄色影院| 国内精品视频一区二区三区八戒| 亚洲精品在线免费播放| 国产精品99久久久久久久女警 | 日韩av不卡在线观看| 这里是久久伊人| 理论片日本一区| 久久只精品国产| 成人爽a毛片一区二区免费| 国产精品国产三级国产有无不卡 | 国产一区二区视频在线| 国产日韩欧美麻豆| 91污片在线观看| 午夜精品久久久久久久| 欧美一区二区成人6969| 国产呦精品一区二区三区网站| 国产色婷婷亚洲99精品小说| 91视视频在线观看入口直接观看www | 精品国产91乱码一区二区三区| 国产毛片精品一区| 日韩理论在线观看| 欧美精品久久久久久久多人混战 | 日韩中文字幕一区二区三区| 精品国产一区久久| 99久久777色| 日日嗨av一区二区三区四区| 久久老女人爱爱| 91久久精品网| 精品综合免费视频观看| 中文字幕一区在线观看| 欧美一区二区视频在线观看2020| 高清不卡一二三区| 免费在线观看一区二区三区| 国产精品午夜在线观看| 欧美一区二区观看视频| 99精品视频在线免费观看| 蜜臀av性久久久久蜜臀aⅴ| 国产精品久久久久久久久免费相片 | 国内国产精品久久| 一区二区三区国产豹纹内裤在线| 欧美成人三级电影在线| 色综合av在线| 激情都市一区二区| 亚洲v日本v欧美v久久精品| 国产欧美日韩精品在线| 69堂成人精品免费视频| 日本韩国精品一区二区在线观看| 免费一级片91| 夜夜嗨av一区二区三区四季av | 欧美成人艳星乳罩| 在线观看亚洲a| voyeur盗摄精品| 国产剧情在线观看一区二区| 日韩黄色免费网站| 一区二区三区精品在线| 日韩一区在线免费观看| 久久人人97超碰com| 欧美一区二区三区免费| 6080日韩午夜伦伦午夜伦| 欧美综合视频在线观看| 成人app在线| 成人av午夜电影| 成人永久看片免费视频天堂| 国产麻豆成人传媒免费观看| 久久机这里只有精品|