偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

快速使用VB.NET shell程序

開發(fā) 后端
這里就啟動VB.NET shell程序,并將其輸出截獲做出了詳細(xì)的代碼分析,執(zhí)行并返回一個命令行程序(shell程序)的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出'通常命令行程序的所有輸出都直接送到屏幕上。

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

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

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

  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)錯誤輸出的管道  
  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)錯誤輸出重定向到同一個管道中去。  
  14. start.hStdOutput=hWritePipestart.hStdError=hWritePipestart.wShowWindow=SW_HIDE'隱含shell程序窗口'啟動shell程序,sCmdLine指明執(zhí)行的路徑  
  15. ret=CreateProcessA(0&,sCmdline,sa,sa,  
  16. True,NORMAL_PRIORITY_CLASS,_0&,0&,start,proc)  
  17. Ifret=0ThenMsgBox"無法建立新進(jìn)程,錯誤碼:  
  18. "&Err.LastDllErrorExitFunctionEndIf'本例中不必向shell程序送信息,因此可以先關(guān)閉  
  19. hWritePipeCloseHandlehWritePipe'循環(huán)讀取shell程序的輸出,每次讀取256個字節(jié)。  
  20. Doret=ReadFile(hReadPipe,sBuffer,256,lngBytesRead,0&)  
  21. sOutputsOutput=sOutput&Left$(sBuffer,lngBytesRead)LoopWhileret<>0'如果ret=0代表沒有更多的信息需要讀取了'釋放相關(guān)資源  
  22. CloseHandleproc.hProcessCloseHandleproc.hThreadCloseHandlehReadPipeExecuteApp=sOutput'輸出結(jié)果EndFunction 

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

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

再把VB.NET shell程序的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出都定向到我們預(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ù)直到無數(shù)據(jù)可讀為止。

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

然后,釋放不用的資源。

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

  1. MsgBoxExecuteApp("c:\windows\command\mem.exe) 
責(zé)任編輯:田樹 來源: 博客
相關(guān)推薦

2009-10-21 09:40:23

VB.NET搜索

2009-10-28 15:01:59

VB.NET SHEL

2009-11-02 17:54:44

VB.NET數(shù)組

2009-11-02 15:49:23

VB.NET顯示系統(tǒng)信

2009-10-09 16:11:33

VB.NET語法

2009-11-02 12:35:10

VB.NET追加文件

2009-10-28 13:23:52

VB.NET可選參數(shù)

2009-10-30 13:31:06

VB.NET名空間

2010-01-11 16:04:10

VB.NET使用wit

2009-10-14 17:08:44

VB.NET使用Fil

2009-11-10 16:55:05

VB.NET調(diào)用API

2009-10-09 16:00:34

VB6.0開發(fā)

2009-10-26 15:57:07

VB.NET使用Ora

2009-11-03 13:48:02

VB.NET枚舉

2010-01-18 10:13:08

VB.NET獲取CPU

2010-01-13 14:26:39

VB.NET開發(fā)

2009-10-10 15:43:51

2009-10-27 11:03:16

VB.NET文件夾操作

2009-10-12 16:39:59

OracleTransVB.NET使用

2009-10-16 11:38:47

VB.NET使用Ali
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號