程序間通訊交換資料 初級篇

2021-09-08 23:14:39 字數 2577 閱讀 1327

1:採用自定義資訊

發端:(1)updatedata();

(2)查詢物件控制代碼 cwnd *pwnd = cwnd::findwindow(null,_t("datarecv1"));

(3)自定義訊息wm_comm1:#define wm_comm1      wm_user+101,

(4) 傳送

uint umsg;

umsg = atoi(m_strmes);

pwnd->sendmessage(wm_comm1,null,(lparam)umsg);

收端:(1)定義相同的訊息#define wm_comm1      wm_user+101

(2)on_message(wm_comm1,onuserreceivemsg)

(3)afx_msg void onuserreceivemsg(wparam wparam,lparam lparam);

(4)void cdatarecv1dlg::onuserreceivemsg(wparam wparam,lparam lparam)

2:用註冊訊息進行通訊

和自定義訊息很類似

發端:(1):註冊訊息const uint wm_nregmsg=registerwindowmessage("reg_data");

(2)同自定義訊息

收端(1):註冊訊息const uint wm_nregmsg=registerwindowmessage("reg_data");

(2):on_registered_message(wm_nregmsg,onregreceivemsg)//(注意採用的巨集不一樣)

(3),(4)同:

3:  用wm_copydata訊息實現通訊

發端:(1):查詢物件視窗的控制代碼

(2):傳送copydatastruct結構體

copydatastruct cpd;

cpd.dwdata =0;

cpd.cbdata = m_copydata.getlength();

cpd.lpdata = (void*)m_copydata.getbuffer(cpd.cbdata);

pwnd->sendmessage(wm_copydata,null,(lparam)&cpd);

收端:(1)在message_map中新增on_wm_copydata()

(2)afx_msg中新增afx_msg bool oncopydata(cwnd* pwnd, copydatastruct* pcopydatastruct);

(3)訊息對映

bool cdatarecv1dlg::oncopydata(cwnd* pwnd, copydatastruct* pcopydatastruct)

4:使用記憶體位址通訊

發端:(1)查詢物件控制代碼

(2):獲得當前控制代碼的程序id:

dword pid;

getwindowthreadprocessid(pwnd->m_hwnd,(dword*)&pid);

(3):根據程序id開啟程序獲得程序控制代碼

handle hprocess = openprocess(process_all_access,false,pid);

(4):分配虛擬記憶體

lpvoid lpbaseaddress;

lpbaseaddress = virtualallocex(hprocess,0,buffer_size,mem_commit,page_readwrite);

char data[buffer_size];

strcpy(data,m_strsendaddress);

writeprocessmemory(hprocess,lpbaseaddress,data,buffer_size,null);

(6):註冊訊息

const uint wm_nmemmsg=registerwindowmessage("mem_data");

(7):傳送註冊訊息

pwnd->sendmessage(wm_nmemmsg,null,(lparam)lpbaseaddress);

sleep(100);

(8)釋放申請的虛擬記憶體

virtualfreeex(hprocess,lpbaseaddress,0,mem_release);

收端:(1):const uint wm_nmemmsg=registerwindowmessage("mem_data");

(2):on_registered_message(wm_nmemmsg,onregmemmsg)

(3):afx_msg void onregmemmsg(wparam wparam,lparam lparam);

(4):

void cdatarecv1dlg::onregmemmsg(wparam wparam,lparam lparam)

else

// 使用完後關閉剪貼簿.

closeclipboard();

// 更新資料.

updatedata(false);

程序篇 程序間通訊《訊息佇列》

訊息佇列就是訊息的鍊錶,存放在核心中並由訊息佇列識別符號表示。訊息佇列提供了乙個從乙個程序向另乙個程序傳送資料塊的方法,每乙個資料塊都可以被認為是有乙個型別,接收者接受的資料塊可以有不同的型別。但是和管道類似的是,它有乙個不足就是每個訊息的最大長度是有上限的 每個訊息佇列的總的位元組數 系統上訊息佇...

程序間通訊之管道篇

這裡我們談談程序間互動的機制,這裡不同於使用訊號來讓程序間傳送訊息。當從乙個程序連線資料流到另乙個程序時,我們使用術語管道 pipe 我們通常是把乙個程序的輸出通過管道連線 到另乙個程序的輸入。我們來看看底層的pipe 函式呼叫。通過這個函式在兩個程式間傳遞資料不需要啟動乙個shell來解釋請求的命...

基礎篇 十四 程序間通訊

在android中提供了四種跨程序通訊的方式。對應於android四大元件 activity content provider broadcastreciever 和service。一 activity被其他程序呼叫。在androidmanifest.xml檔案中註冊 activity時,設定act...