王耀輝
(中國石油東方地球物理公司,河北涿州 072751)
管道技術(shù)由來已久,其實質(zhì)就是一部分共享的內(nèi)存,以便進程間用來相互通信。不少人應(yīng)該對DOS命令里的管道技術(shù)有所了解。當我們用type命令顯示一個文件的時候,如果想讓它分頁顯示,可以輸入C:\>type data.txt|more,這里“|”就是管道操作符,它的作用是將左邊命令的輸出作為右邊命令的輸入,就像通過一根管道將兩個命令連接在一起。如果直接輸入C:\>type data.txt,就沒有分頁的效果了。Windows中的管道分匿名管道和命名管道兩種[1-3],匿名管道只可以在本地計算機進程間通信使用,而命名管道可以用于網(wǎng)絡(luò)間的通信。文中所用到的是匿名管道,它通過API函數(shù)CreatePipe創(chuàng)建。
DOS的標準輸入、輸出通常是在標準設(shè)備鍵盤和顯示器上進行的,重定向顧名思義就是由用戶重新指定輸入和輸出設(shè)備。例如,要顯示C盤根目錄的內(nèi)容,可以輸入C:\>DIR命令,然后回車,就會在顯示器上顯示出C盤下面的目錄情況,但是如果輸入C:\>DIR>1.txt,屏幕上就不會顯示C盤下面的目錄情況,而是將結(jié)果發(fā)送到了1.txt這個文本文件,這就是重定向。
應(yīng)用Windows管道技術(shù)及DOS命令重定向技術(shù),實現(xiàn)了重磁可視化處理系統(tǒng)的集成工作,降低了系統(tǒng)集成的難度。
DOS中提供了一項非常強大的功能,這就是輸入、輸出轉(zhuǎn)向命令,詳細使用方法可以參考有關(guān)資料[4-5]。常用的有下面3個輸入、輸出重定向操作符。
1)“>”將命令輸出寫入到文件或設(shè)備中,而不是寫在命令提示符窗口中。
2)“>>”將命令輸出添加到文件末尾而不刪除文件中的信息。
3)“<”從文件而不是鍵盤上獲取命令所需的輸入。
在VB中通過調(diào)用Windows API函數(shù)CreatePipe來創(chuàng)建管道,在使用該函數(shù)之前,首先要對其進行聲明,具體如下:
其中,phReadPipe,phWritePipe分別為管道的讀端和寫端句柄;lpPipeAttributes為一個描述管道安全屬性的結(jié)構(gòu)體;nSize為管道的容量。安全屬性結(jié)構(gòu)在VB中的定義如下:
了解了這些之后,就可以開始創(chuàng)建管道了,具體代碼如下:
創(chuàng)建管道之后,還需要創(chuàng)建與之連接的DOS進程,這樣才能發(fā)揮管道的作用。創(chuàng)建DOS進程具體有以下3個步驟。
2.2.1 函數(shù)聲明與變量定義
通過API CreateProcess函數(shù)來創(chuàng)建DOS進程,該函數(shù)在VB中的聲明可以參考有關(guān)資料,在此不再贅述。
CreateProcess函數(shù)參數(shù)較多,但多數(shù)采用其默認值即可,具體參數(shù)設(shè)置可以參考相關(guān)資料,在此不一一羅列。其中,lpStartupInfo為啟動信息結(jié)構(gòu)體變量,在這里非常重要,它設(shè)定的是所要創(chuàng)建的DOS進程的窗口風格,其VB中的定義如下:
啟動信息結(jié)構(gòu)體的參數(shù)也比較多,但大多數(shù)可以采用默認值,需要設(shè)置的是cb,dwFlags,wShowWindow,hStdInput,hStdOutput,hStdError等參數(shù)。
2.2.2 啟動參數(shù)設(shè)置
在創(chuàng)建DOS進程之前,需要對前面定義的結(jié)構(gòu)體中的變量進行賦值,主要代碼如下:
通過上面的參數(shù)設(shè)置,將DOS程序的標準輸出與標準錯誤句柄連接到了所創(chuàng)建的管道的一端,當DOS程序一旦有標準輸出,就會被截獲到所創(chuàng)建的管道中去,用API ReadFile函數(shù)可以從管道中讀取出這些數(shù)據(jù),進而顯示到主程序的TEXT控件中去。
2.2.3 創(chuàng)建進程
前面將DOS的標準輸出顯示到了主程序的一個文本控件中去,但是一般的DOS程序還需要輸入一些參數(shù),利用管道的讀端句柄及API WriteFile函數(shù)也可以實現(xiàn)對DOS程序的輸入工作,但文中用到的不是這種方法,在此也不做介紹,具體請參考相關(guān)資料。
文中所用方法正是前面所提到的DOS命令的重定向技術(shù),以運行一個重磁滑動平均濾波程序為例說明如下:
首先設(shè)置CreateProcess函數(shù)的lpCommandLine參數(shù),該參數(shù)代表要啟動的DOS應(yīng)用程序名稱,其格式如下:
上面的“<”即為重定向操作符,由前文介紹可知,其作用是讓DOS程序從文件而不是鍵盤上獲取命令所需的輸入。
設(shè)置好了Command參數(shù),就可以創(chuàng)建進程了,代碼如下:
程序運行界面如圖1所示。
圖1 程序運行界面
程序運行時,通過主程序界面對DOS子程序傳遞參數(shù),在DOS子程序運行結(jié)束之后,將子程序運行結(jié)果信息通過管道傳遞到主程序的文本控件之中,相比“黑屏”的DOS程序,其交互性能更佳。
以前單位的重磁力處理程序基本上都是在DOS下運行,計算速度還可以,但操作極為不便、交互性能差。因此,在VB6.0中文企業(yè)版[6]編程環(huán)境下,文中利用管道技術(shù)與DOS命令重定向技術(shù)重新整理了這些程序,把這些分散的程序集成到一起,編制了友好的交互式的可視化軟件系統(tǒng),程序設(shè)計框圖如圖2所示。
新集成的軟件系統(tǒng)包含地形改正、坐標轉(zhuǎn)換、空間域濾波、頻率域濾波等許多常用模塊,與DOS程序相比,該系統(tǒng)擁有友好的可視化界面和豐富的功能,滿足了重磁處理工作的日常需求,程序主界面如圖3所示。
應(yīng)用Windows管道技術(shù)以及DOS命令重定向技術(shù),結(jié)合VB面向?qū)ο缶幊碳夹g(shù)[7],為DOS命令行程序的可視化提供了一條簡單、快捷的解決方案。該方法不僅充分利用了已有的程序資源,而且降低了系統(tǒng)集成的難度[8],在原有程序功能的基礎(chǔ)上,還擴展了許多實用的新功能。集成后的軟件可以運行于Windows XP,Win7等操作系統(tǒng),界面簡潔,使用簡單,只要具有一定計算機知識和重磁資料處理經(jīng)驗的人員,稍微熟悉一下即可熟練應(yīng)用。
圖2 集成系統(tǒng)設(shè)計框圖
圖3 重磁處理系統(tǒng)界面
[1] 霍艷忠,鄭永春,杜旭,等.Delphi中Windows管道技術(shù)的實現(xiàn)與應(yīng)用[J].佳木斯大學學報:自然科學版,2008,26(3):345-347.
[2] 周超,虞慧群.Windows命名管道技術(shù)的分析與實現(xiàn)[J].電腦與信息技術(shù),2007,15(6):18-20.
[3] 付大愚.利用管道技術(shù)實現(xiàn)分布式系統(tǒng)[J].沈陽師范大學學報:自然科學版,2004,22(3):216-219.
[4] 王春梅,張翠軒.非常網(wǎng)管DOS命令技術(shù)詳解[M].北京:人民郵電出版社,2007.
[5] 焦舒玉.淺談DOS操作系統(tǒng)的重定向輸入及輸出命令[J].西北民族學院學報:自然科學版,2000,21(2):24-27.
[6] 熊燕,謝芳蓬,張鵬.基于VB6.0的網(wǎng)絡(luò)計劃優(yōu)化計算機模型設(shè)計[J].長春工業(yè)大學學報:自然科學版,2011,32(2):162-167.
[7] 郭加樹,劉展,李旺.基于Windows管道技術(shù)的系統(tǒng)集成方法[J].計算機工程,2006,32(13):55-57.
[8] 蔣斌.Visual Basic 6.0程序設(shè)計[M].北京:電子工業(yè)出版社,2001.