剪貼簿,匿名管道,命名管道,郵槽學習筆記
原始碼在後面
程序間進行通訊的四種方式:
剪貼簿,匿名管道,命名管道,郵槽
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 匿名管道