程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> Windows管道技術簡述

Windows管道技術簡述

編輯:vc教程

不知你是否用過這樣的程序,他們本身並沒有解壓縮的功能,而是調用DOS程序PKZIP完成ZIP包的解壓縮。但是在程序運行時又沒有DOS控制台的窗口出現而且一切本應該在DOS下顯示的信息都出現在了那個安裝程序的一個文本框裡。這種設計既美觀又可以防止少數眼疾手快的用戶提前關了你的DOS窗口。

現在就來討論一下,如何用匿名管道技術實現這個功能。

管道技術由來已久,相信不少人對DOS命令裡的管道技術最為熟悉。當我們type一個文件的時候如果想讓他分頁現實可以輸入

C:\>type autoexec.bat|more

這裡“|”就是管道操作符。他以type輸出的信息為讀取端,以more的輸入端為寫入端建立的管道。

中使用較多的管道也是匿名管道,它通過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他指出了安全描述的對象能否被新創建的進程繼承。先不要管他們的具體意義,使用的時候自然就知道了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved