日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
快速使用VB.NETshell程序

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

創(chuàng)新互聯(lián)是專業(yè)的桃城網(wǎng)站建設(shè)公司,桃城接單;提供成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行桃城網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

#T#通常,系統(tǒng)啟動(dòng)Shell程序時(shí)缺省給定了3個(gè)I/O信道,標(biāo)準(zhǔn)輸入(stdin),標(biāo)準(zhǔn)輸出stdout,標(biāo)準(zhǔn)錯(cuò)誤輸出stderr。之所以這么區(qū)分是因?yàn)樵谠缙诘挠?jì)算機(jī)系統(tǒng)如PDP-11的一些限制。那時(shí)沒(méi)有GUI,將輸出分為stdout,stderr可以避免程序的調(diào)試信息和正常輸出的信息混雜在一起。通常,shell程序把它們的輸出寫(xiě)入標(biāo)準(zhǔn)輸出管道(stdout)、把出錯(cuò)信息寫(xiě)入標(biāo)準(zhǔn)錯(cuò)誤管道(stderr)。缺省情況下,系統(tǒng)將管道的輸出直接送到屏幕,這樣一來(lái)我們就能看到應(yīng)用程序運(yùn)行結(jié)果了。為了捕獲一個(gè)標(biāo)準(zhǔn)控制臺(tái)應(yīng)用程序的輸出,我們必須把standOutput和standError管道輸出重定向到我們自定義的管道。

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

 
 
  1. PrivateFunctionExecuteApp(sCmdlineAsString)
  2. AsStringDimprocAsPROCESS_INFORMATION,
  3. retAsLongDimstartAsSTARTUPINFO
  4. DimsaAsSECURITY_ATTRIBUTESDimhReadPipeAsLong'負(fù)責(zé)讀取的管道
  5. DimhWritePipeAsLong'負(fù)責(zé)Shell程序的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出的管道
  6. DimsOutputAsString'放返回的數(shù)據(jù)
  7. DimlngBytesReadAsLong,
  8. sBufferAsString*256sa.nLength=Len(sa)
  9. sa.bInheritHandle=Trueret=CreatePipe(hReadPipe,
  10. hWritePipe,sa,0)Ifret=0ThenMsgBox
  11. "CreatePipefailed.Error:"&Err.LastDllErrorExitFunction
  12. EndIfstart.cb=Len(start)
  13. start.dwFlags=STARTF_USESTDHANDLESOrSTARTF_USESHOWWINDOW'把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到同一個(gè)管道中去。
  14. start.hStdOutput=hWritePipestart.hStdError=hWritePipestart.wShowWindow=SW_HIDE'隱含shell程序窗口'啟動(dòng)shell程序,sCmdLine指明執(zhí)行的路徑
  15. ret=CreateProcessA(0&,sCmdline,sa,sa,
  16. True,NORMAL_PRIORITY_CLASS,_0&,0&,start,proc)
  17. Ifret=0ThenMsgBox"無(wú)法建立新進(jìn)程,錯(cuò)誤碼:
  18. "&Err.LastDllErrorExitFunctionEndIf'本例中不必向shell程序送信息,因此可以先關(guān)閉
  19. hWritePipeCloseHandlehWritePipe'循環(huán)讀取shell程序的輸出,每次讀取256個(gè)字節(jié)。
  20. Doret=ReadFile(hReadPipe,sBuffer,256,lngBytesRead,0&)
  21. sOutputsOutput=sOutput&Left$(sBuffer,lngBytesRead)LoopWhileret<>0'如果ret=0代表沒(méi)有更多的信息需要讀取了'釋放相關(guān)資源
  22. CloseHandleproc.hProcessCloseHandleproc.hThreadCloseHandlehReadPipeExecuteApp=sOutput'輸出結(jié)果EndFunction

我對(duì)這個(gè)程序進(jìn)行一些解釋。

 
 
  1. ret=CreatePipe(hReadPipe,hWritePipe,sa,0)

再把VB.NET shell程序的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出都定向到我們預(yù)先建好的管道中。
代碼如下:

 
 
  1. start.dwFlags=STARTF_USESTDHANDLESOrSTARTF_USESHOWWINDOW
  2. start.hStdOutput=hWritePipe
  3. start.hStdError=hWritePipe

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

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

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

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

然后,釋放不用的資源。

VB.NET shell程序用法很簡(jiǎn)單:比如:

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

當(dāng)前題目:快速使用VB.NETshell程序
網(wǎng)頁(yè)地址:http://www.dlmjj.cn/article/cooohpg.html