王耀輝
(中國石油東方地球物理公司,河北涿州 072751)
管道技術由來已久,其實質就是一部分共享的內存,以便進程間用來相互通信。不少人應該對DOS命令里的管道技術有所了解。當我們用type命令顯示一個文件的時候,如果想讓它分頁顯示,可以輸入C:\>type data.txt|more,這里“|”就是管道操作符,它的作用是將左邊命令的輸出作為右邊命令的輸入,就像通過一根管道將兩個命令連接在一起。如果直接輸入C:\>type data.txt,就沒有分頁的效果了。Windows中的管道分匿名管道和命名管道兩種[1-3],匿名管道只可以在本地計算機進程間通信使用,而命名管道可以用于網絡間的通信。文中所用到的是匿名管道,它通過API函數CreatePipe創建。
DOS的標準輸入、輸出通常是在標準設備鍵盤和顯示器上進行的,重定向顧名思義就是由用戶重新指定輸入和輸出設備。例如,要顯示C盤根目錄的內容,可以輸入C:\>DIR命令,然后回車,就會在顯示器上顯示出C盤下面的目錄情況,但是如果輸入C:\>DIR>1.txt,屏幕上就不會顯示C盤下面的目錄情況,而是將結果發送到了1.txt這個文本文件,這就是重定向。
應用Windows管道技術及DOS命令重定向技術,實現了重磁可視化處理系統的集成工作,降低了系統集成的難度。
DOS中提供了一項非常強大的功能,這就是輸入、輸出轉向命令,詳細使用方法可以參考有關資料[4-5]。常用的有下面3個輸入、輸出重定向操作符。
1)“>”將命令輸出寫入到文件或設備中,而不是寫在命令提示符窗口中。
2)“>>”將命令輸出添加到文件末尾而不刪除文件中的信息。
3)“<”從文件而不是鍵盤上獲取命令所需的輸入。
在VB中通過調用Windows API函數CreatePipe來創建管道,在使用該函數之前,首先要對其進行聲明,具體如下:

其中,phReadPipe,phWritePipe分別為管道的讀端和寫端句柄;lpPipeAttributes為一個描述管道安全屬性的結構體;nSize為管道的容量。安全屬性結構在VB中的定義如下:


了解了這些之后,就可以開始創建管道了,具體代碼如下:

創建管道之后,還需要創建與之連接的DOS進程,這樣才能發揮管道的作用。創建DOS進程具體有以下3個步驟。
2.2.1 函數聲明與變量定義
通過API CreateProcess函數來創建DOS進程,該函數在VB中的聲明可以參考有關資料,在此不再贅述。
CreateProcess函數參數較多,但多數采用其默認值即可,具體參數設置可以參考相關資料,在此不一一羅列。其中,lpStartupInfo為啟動信息結構體變量,在這里非常重要,它設定的是所要創建的DOS進程的窗口風格,其VB中的定義如下:

啟動信息結構體的參數也比較多,但大多數可以采用默認值,需要設置的是cb,dwFlags,wShowWindow,hStdInput,hStdOutput,hStdError等參數。
2.2.2 啟動參數設置
在創建DOS進程之前,需要對前面定義的結構體中的變量進行賦值,主要代碼如下:


通過上面的參數設置,將DOS程序的標準輸出與標準錯誤句柄連接到了所創建的管道的一端,當DOS程序一旦有標準輸出,就會被截獲到所創建的管道中去,用API ReadFile函數可以從管道中讀取出這些數據,進而顯示到主程序的TEXT控件中去。
2.2.3 創建進程
前面將DOS的標準輸出顯示到了主程序的一個文本控件中去,但是一般的DOS程序還需要輸入一些參數,利用管道的讀端句柄及API WriteFile函數也可以實現對DOS程序的輸入工作,但文中用到的不是這種方法,在此也不做介紹,具體請參考相關資料。
文中所用方法正是前面所提到的DOS命令的重定向技術,以運行一個重磁滑動平均濾波程序為例說明如下:
首先設置CreateProcess函數的lpCommandLine參數,該參數代表要啟動的DOS應用程序名稱,其格式如下:

上面的“<”即為重定向操作符,由前文介紹可知,其作用是讓DOS程序從文件而不是鍵盤上獲取命令所需的輸入。
設置好了Command參數,就可以創建進程了,代碼如下:

程序運行界面如圖1所示。

圖1 程序運行界面
程序運行時,通過主程序界面對DOS子程序傳遞參數,在DOS子程序運行結束之后,將子程序運行結果信息通過管道傳遞到主程序的文本控件之中,相比“黑屏”的DOS程序,其交互性能更佳。
以前單位的重磁力處理程序基本上都是在DOS下運行,計算速度還可以,但操作極為不便、交互性能差。因此,在VB6.0中文企業版[6]編程環境下,文中利用管道技術與DOS命令重定向技術重新整理了這些程序,把這些分散的程序集成到一起,編制了友好的交互式的可視化軟件系統,程序設計框圖如圖2所示。
新集成的軟件系統包含地形改正、坐標轉換、空間域濾波、頻率域濾波等許多常用模塊,與DOS程序相比,該系統擁有友好的可視化界面和豐富的功能,滿足了重磁處理工作的日常需求,程序主界面如圖3所示。
應用Windows管道技術以及DOS命令重定向技術,結合VB面向對象編程技術[7],為DOS命令行程序的可視化提供了一條簡單、快捷的解決方案。該方法不僅充分利用了已有的程序資源,而且降低了系統集成的難度[8],在原有程序功能的基礎上,還擴展了許多實用的新功能。集成后的軟件可以運行于Windows XP,Win7等操作系統,界面簡潔,使用簡單,只要具有一定計算機知識和重磁資料處理經驗的人員,稍微熟悉一下即可熟練應用。

圖2 集成系統設計框圖

圖3 重磁處理系統界面
[1] 霍艷忠,鄭永春,杜旭,等.Delphi中Windows管道技術的實現與應用[J].佳木斯大學學報:自然科學版,2008,26(3):345-347.
[2] 周超,虞慧群.Windows命名管道技術的分析與實現[J].電腦與信息技術,2007,15(6):18-20.
[3] 付大愚.利用管道技術實現分布式系統[J].沈陽師范大學學報:自然科學版,2004,22(3):216-219.
[4] 王春梅,張翠軒.非常網管DOS命令技術詳解[M].北京:人民郵電出版社,2007.
[5] 焦舒玉.淺談DOS操作系統的重定向輸入及輸出命令[J].西北民族學院學報:自然科學版,2000,21(2):24-27.
[6] 熊燕,謝芳蓬,張鵬.基于VB6.0的網絡計劃優化計算機模型設計[J].長春工業大學學報:自然科學版,2011,32(2):162-167.
[7] 郭加樹,劉展,李旺.基于Windows管道技術的系統集成方法[J].計算機工程,2006,32(13):55-57.
[8] 蔣斌.Visual Basic 6.0程序設計[M].北京:電子工業出版社,2001.