不知你是否用過這樣的程式,他們本身並沒有解壓縮的功能,而是調用DOS程式PKZIP完成ZIP包的解壓縮。但是在程式運行時又沒有DOS控制台的視窗出現而且一切本應該在DOS下顯示的資訊都出現在了那個安裝程式的一個文字框裡。這種設計既美觀又可以防止少數眼疾手快的使用者提前關了你的DOS視窗。
現在就來討論一下,如何用匿名管道技術實現這個功能。
管道技術由來已久,相信不少人對DOS命令裡的管道技術最為熟悉。當我們type一個檔案的時候如果想讓他分頁現實可以輸入
C:\>type autoexec.bat|more
這裡“|”就是管道操作符。他以type輸出的資訊為讀取端,以more的輸入端為寫入端建立的管道。
Windows中使用較多的管道也是匿名管道,它通過API函數CreatePipe建立。
BOOL CreatePipe(
PHANDLE hReadPipe, // 指向讀端控制代碼的指標
PHANDLE hWritePipe, // 指向寫端控制代碼的指標
LPSECURITY_ATTRIBUTES lpPipeAttributes, // 指向安全屬性結構的指標
DWORD nSize // 管道的容量
);
上面幾個參數中要注意hReadPipe,hWritePipe是指向控制代碼的指標,而不是控制代碼(我第一次用的時候就搞錯了)。nSize一般指定為0,以便讓系統自己決定管道的容量。現在來看安全屬性結構,SECURITY_ATTRIBUTES。
typedef struct _SECURITY_ATTRIBUTES { // sa
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES;
nLength是結構體的大小,自然是用sizeof取得了。lpSecurityDescriptor是安全性描述元(一個C-Style的字串)。bInheritHandle他指出了安全描述的對象能否被新建立的進程繼承。先不要管他們的具體意義,使用的時候自然就知道了。