在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

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

如何在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了。 

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

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 手机在线看福利| av网站在线观看不卡| 黄色片视频在线免费观看| 亚洲乱码日产精品bd在线观看| 成人免费毛片播放| 少妇高清精品毛片在线视频| 丰满爆乳一区二区三区| 成年人午夜免费视频| 少妇人妻无码专区视频| 亚洲人成无码网站久久99热国产| 欧美在线a视频| 色爽爽爽爽爽爽爽爽| 99精品视频国产| 国内精品国产三级国产99| 中文字幕免费高| 屁屁影院ccyy国产第一页| 国产精品视频一二三四区| 国产亚洲精品久久久久久久| 男人的天堂狠狠干| 亚洲精品中文字幕无码蜜桃| 精品久久久久av| 国产无色aaa| 国产精品av免费观看| 欧美性大战久久久久xxx| 欧美特级aaa| 日本阿v视频在线观看| 久久综合九色综合88i| 久草福利视频在线| 午夜在线视频免费观看| 美女扒开大腿让男人桶| 国产精品拍拍拍| 青春草在线视频免费观看| 久久久天堂国产精品| 国产91对白刺激露脸在线观看| 中文字幕第21页| 黄色片免费网址| 波多野结衣家庭教师视频 | 美女喷白浆视频| 黄频视频在线观看| 99re在线视频免费观看| 亚洲三级在线观看视频| 日韩av三级在线| 亚洲理论中文字幕| 国产精品无码一区二区在线| 日本高清一区二区视频| 日本精品免费在线观看| 黄色网在线视频| 爱爱爱爱免费视频| 狠狠爱免费视频| 青青草精品视频在线| 日本精品一区在线| 午夜两性免费视频| 亚洲乱码中文字幕久久孕妇黑人| 中文字幕免费高| 日韩在线不卡一区| 中文字幕在线观看第三页| 人妻互换免费中文字幕| www.成年人| 99热一区二区| www.日本xxxx| 91淫黄看大片| 99草草国产熟女视频在线| 久在线观看视频| 国产一区二区在线视频播放| xxx中文字幕| 第一区免费在线观看| 99色精品视频| 久久久久久久久久久久久久国产| 日韩国产一级片| av女优在线播放| 自拍日韩亚洲一区在线| 国产精品三级一区二区| www.成年人视频| 加勒比成人在线| 日韩免费视频播放| 久久综合久久色| 成人亚洲视频在线观看| 亚欧在线免费观看| av中文字幕网址| 公共露出暴露狂另类av| 爱爱爱视频网站| 成人免费性视频| www黄色av| 国内自拍第二页| 激情图片qvod| 久久视频这里有精品| 男女午夜激情视频| 亚洲欧美视频二区| 大桥未久一区二区| 国产午夜福利100集发布| 国产激情在线观看视频| 久热精品在线播放| 欧美日韩中文字幕在线播放| 婷婷无套内射影院| 污版视频在线观看| 欧美日韩视频免费| 黄色av免费在线播放| 天堂av免费看| 国产精品人人妻人人爽人人牛| 国产亚洲视频一区| 免费看日本毛片| 手机av在线网| 337p粉嫩大胆噜噜噜鲁| 日本黄色播放器| 欧美韩国日本在线| 国产又粗又猛又爽又黄的网站| 日韩avxxx| 4444亚洲人成无码网在线观看| 亚洲人成无码www久久久| 妞干网这里只有精品| 激情综合网俺也去| 国产九九九九九| 五月天色婷婷综合| 小泽玛利亚视频在线观看| 800av在线免费观看| 午夜久久福利视频| 18禁男女爽爽爽午夜网站免费| 99re99热| 91日韩精品视频| chinese少妇国语对白| 久久久久免费看黄a片app| 欧美午夜精品理论片| 国产福利一区视频| 欧美 日本 亚洲| 成人午夜免费在线视频| 久久久国产精华液999999 | 国产黄色片免费在线观看| 99精品999| 亚洲午夜激情影院| 日韩一级理论片| 黄色片在线免费| 亚洲成人av免费看| 亚洲黄色av网址| 美女网站视频黄色| 五月婷婷六月丁香激情| 欧美三级理论片| 一女二男3p波多野结衣| 中文字幕av专区| 天天操天天爽天天射| 一区二区三区视频在线观看免费| 男人天堂成人在线| 中文字幕久久av| 黄频视频在线观看| 免费cad大片在线观看| 妞干网视频在线观看| 免费拍拍拍网站| 男人天堂网视频| 嫩草视频免费在线观看| 三年中国中文在线观看免费播放| 五月激情婷婷在线| 欧美日韩dvd| 国产超级av在线| 中文字幕av不卡在线| 永久av免费在线观看| 精品一区二区三区无码视频| 黄色免费视频大全| 人人爽人人爽av| 久久国产精品网| 欧美精品一区二区三区免费播放| 北条麻妃视频在线| 激情图片qvod| 天堂社区在线视频| 午夜久久久久久久久久久| 欧美不卡在线播放| 国产色视频在线播放| 欧美日韩不卡在线视频| 国产wwwxx| 精品无码国模私拍视频| 最近中文字幕一区二区| 国产成人免费高清视频| 97在线播放视频| 四虎4hu永久免费入口| a在线视频观看| 特级黄色录像片| 香港日本韩国三级网站| 少妇高潮毛片色欲ava片| 在线观看国产福利| 无码人妻精品一区二区三区在线| 日韩成人av免费| 亚洲爆乳无码专区| www婷婷av久久久影片| 成年人在线观看视频免费| 国内少妇毛片视频| 小说区视频区图片区| 麻豆av免费在线| 国产一区二区在线视频播放| 激情五月五月婷婷| 欧美成人手机在线视频| youjizzxxxx18| 激情视频综合网| 日本熟妇人妻xxxxx| 午夜免费福利小电影| 成人污网站在线观看| 青娱乐精品在线| 久久久久久久久久毛片| 中文字幕永久有效| 亚洲xxxx2d动漫1| 奇米影音第四色| 国产理论在线播放| 久久久久久久久久久久91|