第17章 程序間通訊

2022-08-16 22:36:16 字數 3609 閱讀 9359

**: 

程序間通訊有6種方法

1.剪貼簿(只能在本機上的程序間通訊

a.建立個clipboard的對話方塊應用程式,加兩editbox和兩個button傳送接收。

b.具體**:

傳送端**:

if

(openclipboard())

接收端**:

if

(openclipboard())

}

2.匿名管道:只能在父子程序之間進行通訊(只能在本機上的程序間通訊

a.先建乙個parent的單文件應用程式,增加「建立管道」「讀取資料」「寫入資料」三個選單

b.增加成員變數handle型別的hread,hwrite,初始化變數,並在析構函式中釋放控制代碼

c.響應選單**:

void

cparentview::onpipecreate() 選單「建立管道」**

startupinfo sui;

process_information pi;

zeromemory(&sui,sizeof

(startupinfo));將資料清0!

sui.cb=sizeof

(startupinfo);

sui.dwflags=startf_usestdhandles;

sui.hstdinput=hread;

sui.hstdoutput=hwrite;

sui.hstderror=getstdhandle(std_error_handle);

if(!createprocess("

..\\child\\debug\\child.exe

",null,null,null,

true,

0,null,null,&sui,&pi))建立子程序

else

}

選單「讀取資料」**

void

cparentview::onpiperead()

messagebox(buf);}

void

cparentview::onpipewrite() 選單「寫入資料」**

}

d.再建乙個child的單文件,在view中增加兩個成員hread和hwrite.在oninitialupdate()中得到控制代碼的值。

void

cchildview::oninitialupdate()

e.加選單「讀取資料」「寫入資料」其**如下:

void

cchildview::onpiperead()

messagebox(buf);}

void

cchildview::onpipewrite()

}

3.命名管道:還可以跨網路通訊,伺服器只能在win2000和nt下執行!而客戶端可以在95下執行。關鍵函式createnamedpipe

a.先建乙個namedpipesrv單文件應用程式,加選單「建立管道」「讀取資料」「寫入資料」

b.在view中增加handle變數hpipe,注意在析構函式中釋放它!

c.響應選單,建立命名管道

void

cnamedpipesrvview::onpipecreate()

handle hevent;

hevent=createevent(null,true,false,null);

if(!hevent)

zeromemory(&ovlap,sizeof

ovlap.hevent=hevent;

if(!connectnamedpipe(hpipe,&ovlap))

}if(wait_failed==waitforsingleobject(hevent,infinite))

closehandle(hevent);

}

void

cnamedpipesrvview::onpiperead()

messagebox(buf);}

void

cnamedpipesrvview::onpipewrite()

}

d.再建乙個namedpipeclt單文件工程,加選單「連線管道」「讀取資料」「寫入資料」,當然別忘記成員變數hpipe的定義和初始化

e.響應選單**

void

cnamedpipecltview::onpipeconnect() 連線管道

hpipe=createfile("

\\\\.\\pipe\\mypipe

",generic_read |generic_write, 0

,null,open_existing,file_attribute_normal,null);

if(invalid_handle_value==hpipe)}

void

cnamedpipecltview::onpiperead() 讀取資料

messagebox(buf);}

void

cnamedpipecltview::onpipewrite() 寫入資料

}

4.郵槽,可以跨網路通訊,使用時應將訊息長度限制在424位元組以下,關鍵函式createmailslot()

a.先建乙個mailslotsrv工程,加選單「接收資料」

b.訊息響應**:

選單「接收資料」的**

void

cmailslotsrvview::onmailslotrecv()

char buf[100

];dword dwread;

if(!readfile(hmailslot,buf,100,&dwread,null))

messagebox(buf);

closehandle(hmailslot);

}

c.加工程mailslotclt,加選單「傳送資料」

d.加訊息響應,新增**,客戶端也比較簡單。

void

cmailslotcltview::onmailslotsend() 選單「傳送資料」的**

char buf="

";dword dwwrite;

if(!writefile(hmailslot,buf,strlen(buf)+1,&dwwrite,null))

closehandle(hmailslot);

}

5. 共享記憶體(只能在本機上的程序間通訊

6、socket通訊,可以跨網路通訊

7、以上6種方法各有優缺點:剪貼簿比較簡單。郵槽是基於廣播的,可以一對多傳送。但只能乙個傳送,乙個接收,要想同時傳送接收,須寫兩次**。

匿名管道、剪貼簿和共享記憶體只能在本機上的程序間通訊

命名管道、郵槽和socket通訊可以進行跨網路通訊。

孫鑫VC 第17章程序間的通訊

第17章 程序間的通訊 1.當乙個程序啟動後,作業系統為其分配4gb的私有位址空間。位於同乙個程序中的多個執行緒共享同乙個位址空間,因此執行緒之間的通訊非常簡單 2.四種程序間通訊方式 剪下板,匿名管道,命名管道,郵槽 3.如果某個程式已經開啟了剪貼簿,則其他應用程式將不能修改剪下板,直到前者呼叫了...

第七章 程序間通訊

第七章 程序間通訊 1 程序間通訊簡介 多個程序之間相互通訊 交換資訊的方法 方法 1 本地程序通訊 共享記憶體 訊號量 管道 命名管道 訊息佇列 2 遠端通訊 套介面 全雙工管道 2 共享記憶體和訊號量 1 共享記憶體 通過兩個或多個程序共享同一塊記憶體區域實現程序間通訊 最底層的通訊機制,最快速...

第 3 章 程序

程序是現代分時作業系統的工作單元。程序是資源分配的基本單位。執行緒是程式執行的最小單位。程序是執行的程式,這是一種非正式的說法。程序不只是程式 也稱文字段 程序還包括資料 程式計數器的值和處理器暫存器的內容等 程序堆疊 包括臨時資料,如函式引數 返回位址和區域性變數 和資料段 包括全域性變數 和堆。...