如何使用VB.NET的shell程序

這篇文章主要介紹如何使用VB.NET的shell程序,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比烈山網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式烈山網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋烈山地區(qū)。費用合理售后完善,十余年實體公司更值得信賴。

VB.NET經(jīng)過長時間的發(fā)展,很多用戶都很了解VB.NET了,這里我發(fā)表一下個人理解,和大家討論討論。在Windows環(huán)境下的所謂shell程序就是dos命令行程序,比如VC的CL.exe命令行編譯器,JDK的javac編譯器,啟動java程序用的java.exe都是標準的shell程序。截獲一個shell程序的輸出是很有用的,比如說您可以自己編寫一個IDE(集成開發(fā)環(huán)境),當用戶發(fā)出編譯指令時候,你可以在后臺啟動shell調用編譯器并截獲它們的輸出,對這些輸出信息進行分析后在更為友好的用戶界面上顯示出來。為了方便起見,我們用VB作為本文的演示語言。

通常,系統(tǒng)啟動Shell程序時缺省給定了3個I/O信道,標準輸入(stdin),標準輸出stdout,標準錯誤輸出stderr。之所以這么區(qū)分是因為在早期的計算機系統(tǒng)如PDP-11的一些限制。那時沒有GUI,將輸出分為stdout,stderr可以避免程序的調試信息和正常輸出的信息混雜在一起。通常,shell程序把它們的輸出寫入標準輸出管道(stdout)、把出錯信息寫入標準錯誤管道(stderr)。缺省情況下,系統(tǒng)將管道的輸出直接送到屏幕,這樣一來我們就能看到應用程序運行結果了。為了捕獲一個標準控制臺應用程序的輸出,我們必須把standOutput和standError管道輸出重定向到我們自定義的管道。

下面的代碼可以啟動一個VB.NET shell程序,并將其輸出截獲。執(zhí)行并返回一個命令行程序(shell程序)的標準輸出和標準錯誤輸出'通常命令行程序的所有輸出都直接送到屏幕上

PrivateFunctionExecuteApp(sCmdlineAsString)  AsStringDimprocAsPROCESS_INFORMATION,  retAsLongDimstartAsSTARTUPINFO  DimsaAsSECURITY_ATTRIBUTESDimhReadPipeAsLong'負責讀取的管道  DimhWritePipeAsLong'負責Shell程序的標準輸出和標準錯誤輸出的管道  DimsOutputAsString'放返回的數(shù)據(jù)  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指明執(zhí)行的路徑  ret=CreateProcessA(0&,sCmdline,sa,sa,  True,NORMAL_PRIORITY_CLASS,_0&,0&,start,proc)  Ifret=0ThenMsgBox"無法建立新進程,錯誤碼:  "&Err.LastDllErrorExitFunctionEndIf'本例中不必向shell程序送信息,因此可以先關閉  hWritePipeCloseHandlehWritePipe'循環(huán)讀取shell程序的輸出,每次讀取256個字節(jié)。  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

好,現(xiàn)在可以調用建立新進程的函數(shù)了:

ret=CreateProcessA(0&,sCmdline,sa,sa,True,NORMAL_PRIORITY_CLASS,0&,0&,start,proc)


然后,循環(huán)讀管道里的數(shù)據(jù)直到無數(shù)據(jù)可讀為止。

Do  ret=ReadFile(hReadPipe,sBuffer,256,lngBytesRead,0&)'每次讀256字節(jié)  sOutputsOutput=sOutput&Left$(sBuffer,lngBytesRead)'送入一個字符串中  LoopWhileret<>0'若ret=0表明沒有數(shù)據(jù)等待讀取。

然后,釋放不用的資源。

VB.NET shell程序用法很簡單:比如:

MsgBoxExecuteApp("c:\windows\command\mem.exe)

以上是“如何使用VB.NET的shell程序”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

當前文章:如何使用VB.NET的shell程序
文章轉載:http://muchs.cn/article28/jcpgjp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、手機網(wǎng)站建設網(wǎng)站改版、網(wǎng)站內鏈、域名注冊、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設