中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用VB.NET的shell程序

發布時間:2021-11-03 14:23:32 來源:億速云 閱讀:479 作者:小新 欄目:編程語言

這篇文章主要介紹如何使用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程序”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桃园市| 沿河| 白玉县| 长武县| 石门县| 和龙市| 泗阳县| 临夏市| 新乡市| 阿图什市| 峡江县| 黔江区| 龙井市| 咸宁市| 阳高县| 栖霞市| 中牟县| 云安县| 卢氏县| 永兴县| 宜兰县| 玛多县| 楚雄市| 永川市| 江阴市| 肇东市| 五家渠市| 平利县| 靖西县| 栖霞市| 宽城| 屯昌县| 乡宁县| 垫江县| 苏州市| 嘉义市| 句容市| 临高县| 洪洞县| 洪湖市| 桂东县|