VC 學習(17) 程序間通訊

2021-09-06 04:05:46 字數 3022 閱讀 6121

有四種方法

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)

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

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

vc 程序間通訊

一直以來沒有寫過本地程式間的通訊 今天終於有需求了,上網大概看了下,方式還是比較多的,就說說兩種最簡單的吧,當然還有以後用到再說 1 試用自定義消信通訊 這種方式主要是傳遞整形或列舉型資料 可以使用 define wm user x,0x4002 使用wm copydata訊息通訊 介紹下 type...

Linux學習之旅(17) 程序間通訊

程序通訊是指程序之間的資訊交換。由於程序的互斥與同步,需要在程序間交換一定的資訊,所以被稱為程序通訊,但這只是低階的程序通訊。原因在於 1 效率低,每次只能從緩衝區中取得乙個訊息。2 通訊對使用者不透明。在程序之間要傳送大量的資料時,應當利用os提供的高階通訊工具,該工具最主要的特帶你的是 1 使用...

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

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