程序間通訊

2021-05-28 01:44:11 字數 4409 閱讀 1072

程序間通訊的方式

socket,剪下板方法,記憶體對映檔案, 郵槽方法, 命令管道, 匿名管道方法

一、socket的方法

對於不同機器上且資料量很的情況會有很大的幫助,但對於同一臺機器之間的不同程序之間的通訊就不方便了 (**量太多)a、對於傳送端:

cstring str;

getdlgitemtext(idc_edit1,str);

handle hglobal;

if(this->openclipboard())//獲取剪下板的資源所有權

b、對於客戶端

if(this->openclipboard())//獲取剪下板的資源所有權

1、 伺服器端**:

handle hmapfile;

if (hmapfile == null)

lpvoid pfile;

pfile= mapviewoffile(hmapfile,file_map_write|file_map_read,0,0,0);

if (pfile == null)

cstring str;

getdlgitemtext(idc_edit1,str);

strcpy((char*)pfile,str.getbuffer(str.getlength()));

//closehandle(hmapfile); //不能加,否則客戶端收不到,所以一般會將這個控制代碼作為乙個全域性變數

2、 客戶機端**:

handle hmap;

true,

"yuanmap");

lpvoid pvoid;

pvoid=::mapviewoffile(hmap,file_map_read,0,0,0);

cstring str=(char*)pvoid;

setdlgitemtext(idc_edit1,str);

unmapviewoffile(pvoid);

closehandle(hmap);1、 郵槽採用的是一種廣播機制。

2、 郵槽採用的是一種直接基於檔案系統開發而成,所以它不依賴於某種具體的網路協議。

3、 郵槽每次傳送的訊息長度不能長於422位元組。

4、 傳送端**如下:(客戶端)

handle hslot;

hslot=createfile("\\\\.\\mailslot\\myslot",generic_write,

file_share_read,null,open_existing,file_attribute_normal,

null);

if(!hslot)

char *pbuf="專業的程式語言培訓";

dword dwwrite;

writefile(hslot,pbuf,strlen(pbuf)+1,&dwwrite,null);

closehandle(hslot);

5、 接收端**如下:(伺服器端)

handle hmail;

hmail=createmailslot("\\\\.\\mailslot\\myslot",0,

mailslot_wait_forever,null);

if(invalid_handle_value==hmail)

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

zeromemory(&ovlap,sizeof(ovlap));

ovlap.hevent=hevent;

char buf[200];

dword dwread;

if(false==readfile(hmail,buf,200,&dwread,&ovlap))

} waitforsingleobject(hevent,infinite);

messagebox(buf);

resetevent(hevent);

closehandle(hmail);a、對於傳送端**如下:

handle handle;

handle=createnamedpipe("\\\\.\\pipe\\mypipe",

pipe_access_duplex,pipe_type_byte | pipe_readmode_byte,

1,0,0,1000,null);//建立乙個命名管道鏈結

connectnamedpipe(handle,null);//在命名管道例項上監聽客戶機鏈結請求

char buf[200]="";

dword dwwrite;

writefile(handle,buf,strlen(buf)+1,&dwwrite,null);//往管道裡寫資料

closehandle(handle);//關閉管道

b、對於接收端**如下:

handle hnamedpipe;

waitnamedpipe("\\\\.\\pipe\\mypipe",nmpwait_wait_forever);//等候乙個命名管道例項可供自己使用

hnamedpipe=createfile("\\\\.\\pipe\\mypipe",generic_read,file_share_read,

null,open_existing,file_attribute_normal,null);//建立與命名管道的鏈結

char buf[200];

dword dwread;

readfile(hnamedpipe,buf,200,&dwread,null);//從命名管道中讀取資料

messagebox(buf);

closehandle(hnamedpipe);//關閉與命名管道伺服器的鏈結父程序:

a、對於父程序中建立乙個管道**如下:

security_attributes sa;

sa.nlength=sizeof(sa);

sa.binherithandle=true;

sa.lpsecuritydescriptor=null;

if(false==createpipe(&hread,&hwrite,&sa,0))//建立乙個匿名的管道,得到乙個用於從管道讀取的控制代碼,乙個用於向管道寫資料用的控制代碼

startupinfo sui;

zeromemory(&sui,sizeof(sui));

sui.cb=sizeof(sui);

sui.dwflags=startf_usestdhandles;

sui.hstdinput=hread;

sui.hstdoutput=hwrite;

sui.hstderror=getstdhandle(std_error_handle);

process_information pi;

createprocess("..\\pipecli\\debug\\pipecli.exe",null,

null,null,true,create_default_error_mode,/*0*/

null,null,&sui,&pi);//建立乙個新的子程序,並將準備好的控制代碼資訊傳給子程序

closehandle(pi.hprocess);

closehandle(pi.hthread);

b、父程序中從管道讀取**如下:

char buf[200];

dword dwread;

readfile(hread,buf,200,&dwread,null);

messagebox(buf);

c、父程序中往管道寫入**如下:

char buf[200]="專業的程式語言培訓";

dword dwwrite;

writefile(hwrite,buf,strlen(buf)+1,&dwwrite,null);

子程序:

首先得到用於管道讀取與寫入用的控制代碼值(最好是放在檢視的初始化更新函式裡)

hread=getstdhandle(std_input_handle);

hwrite=getstdhandle(std_output_handle);

讀取部分**:

char buf[200];

dword dwread;

readfile(hread,buf,200,&dwread,null);

messagebox(buf);

寫入部分**:

char buf[200]="";

dword dwwrite;

writefile(hwrite,buf,strlen(buf)+1,&dwwrite,null); 

--------------------------------------------(完)

php程序間通訊 yoc PHP程序間通訊

php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...

程序間通訊

實現程序間資料共享除了常用的記憶體檔案對映外,對於一些非檔案的資料共享可以直接使用wm copydata。如果需要在程序a傳遞資料到程序b,簡單的實現如下 在程序a中 cstring strdatatosend t hello 需要傳遞的資料 hwnd hwndreceived 程序b的接收資料視窗...

程序間通訊

最近做專案遇到奇怪的問題,我在主線程中建立乙個工作執行緒。在工作執行緒中用sendmessage向主線程傳送訊息,通知主線程操作office 物件。getactiveobject時提示 hr 0x8001010d 因為應用程式正在傳送乙個輸入同步呼叫,所以無法執行傳出的呼叫。我把sendmessag...