1. 程式人生 > >剪貼簿,匿名管道,命名管道,郵槽學習筆記

剪貼簿,匿名管道,命名管道,郵槽學習筆記

 

原始碼在後面

 

程序間進行通訊的四種方式:
剪貼簿,匿名管道,命名管道,郵槽

1).ClipBoar
OpenClipboard()               //開啟剪貼簿
CloseClipboard()             //開啟剪貼簿,必須將其關閉,否則其他應用程式將無法開啟
                                            //剪貼簿
EmpyClipboard()            //呼叫這個函式,將使得CWnd獲得剪貼簿的所有權
SetClipboardData()        //以一定格式在剪貼簿存放資料,其中第二個引數設定為NULL
                                           //將會延遲提交資料,以提高對資源的利用
GlobalLock()                   //將一個全域性記憶體物件控制代碼轉換成指標,並對其加鎖
GlobalUnlock()               //加鎖後的記憶體物件將無法移動和移除,需要呼叫該函式解鎖
GlobalAlloc()                  //分配指定位元組數的記憶體空間

GetClipboardData()   //獲取剪貼簿上的資料
IsClipboardFormatAvailable()  //檢測是否想要的資料

將資料放到剪貼簿上的步驟:
1.獲得資料
2.分配記憶體空間
3.獲得記憶體空間的指標
4.通過指標將資料複製到記憶體空間
5.開啟剪貼簿
6.將記憶體空間放到剪貼簿上
7.關閉剪貼簿

 


2).Pipe
CreatePipe()                //建立一個匿名管道,其中第三個引數不能為NULL,因為父
                                      //程序和子程序之間通訊需要用到從父程序繼承而來的控制代碼
CreateProcess()    //建立並啟動一個新的程序
     --AmL.tu_s    2011.07.29

 
對於STARTUPINFO sa結構體,當sa.nFlags = STARTF_USRSTDHANDLES 時,只有sa.hStdIput~sa.hStdError有用


GetStdHandle()    //可以獲取父程序的標準輸入、輸出和錯誤控制代碼
ZeroMemory()    //將一段記憶體設為0

匿名管道的使用:
1.由父程序先建立一個匿名管道,供之後與子程序進行通訊
2.由父程序啟動子程序,並將匿名管道的控制代碼傳給子程序的標準輸入、輸出控制代碼(相當於告訴子程序匿名管道的位置)
3.子程序通過GetStdHandle()獲得由父程序傳遞的匿名管道控制代碼,並通過這個控制代碼與父程序通訊,而父程序也通過這個匿名管道控制代碼與子程序通訊。

     --AmL.tu_s    2011.07.30 

3).NamePipe
CreateNamedPipe()   //建立命名管道
ConnectNamePipe()   //呼叫這個函式等待客戶端連線
服務端
1.建立命名管道
2.建立事件物件
3.定義一個OVERLAPPED結構體,用剛建立的事件物件作為值賦給第三個成員
4.等待客戶端連線
5.等待事件物件

WaitNamedPipe()    //等待可利用的命名管道
CreateFile()    //開啟命名管道,其返回值為一個控制代碼
客戶端
1.等待一個可利用的管道
2.開啟管道,進行通訊


4).Mailslot(程式碼簡單,但是所能傳送的資料量較少)
CreateMailslot()   //以指定名字建立郵槽,返回值為郵槽控制代碼

郵槽服務端只接收資料,客戶端只發送資料
服務端
1.建立郵槽
2.讀取資料

客戶端
1.開啟郵槽
2.傳送資料

 

 

原始碼下載

http://download.csdn.net/source/3485016    剪貼簿

http://download.csdn.net/source/3485038    郵槽

http://download.csdn.net/source/3485045    匿名管道