程序間通訊的方式
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...