成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

網(wǎng)絡(luò)安全編程:通過消息實現(xiàn)進程間的通信

安全
通過消息實現(xiàn)進程間的通信在這里介紹兩種方法,一種是通過自定義消息進行進程間的通信,另一種是通過使用WM_COPYDATA消息進行進程間的通信。

 [[377775]]

在很多軟件中需要多個進程協(xié)同工作,而不是單一的進程進行工作。那么多進程的協(xié)同工作就涉及進程間的通信。在Windows下,進程間的通信有多種實現(xiàn)的方法,比如管道、郵槽、剪貼板、內(nèi)存共享……本文介紹通過消息實現(xiàn)進程間的通信。

通過消息進行進程間的通信,有一定的限制性。Windows下有窗口的應(yīng)用程序是基于消息驅(qū)動進行工作的,那么沒有窗口的程序就不是基于消息驅(qū)動來進行工作的。對于非窗口的應(yīng)用程序是無法通過消息進行進程間通信的。

通過消息實現(xiàn)進程間的通信在這里介紹兩種方法,一種是通過自定義消息進行進程間的通信,另一種是通過使用WM_COPYDATA消息進行進程間的通信。

01 通過自定義消息進行進程通信

消息分為兩種,一種是系統(tǒng)已經(jīng)定義的消息,另一種是用戶自定義的消息。系統(tǒng)已經(jīng)定義的消息是從0到0x3ff,用戶自定義的消息可以從0x400開始。系統(tǒng)中提供了一個宏WM_USER,在進行自定義消息時,在WM_USER的基礎(chǔ)上加一個值就可以了。下面來實現(xiàn)一個自定義消息完成進程間通信的程序例子。

1. 實現(xiàn)自定義消息的步驟

通過自定義消息進行進程間通信,只有帶有窗口的進程才能完成基于消息的進程間通信。既然是進程間通信,那么就需要至少編寫兩個程序,一個是接收消息的服務(wù)端,另一個是發(fā)送消息的客戶端,并且這兩個程序都需要有窗口。

先來介紹程序的功能,在發(fā)送消息的客戶端,通過自定義消息給接收消息的服務(wù)端發(fā)送兩個整型的數(shù)值。接收消息的服務(wù)端,將接收到的兩個數(shù)值進行簡單的加法運算。接收消息的服務(wù)端在VC下,使用MFC通過自定義消息來完成進程間的通信需要3個步驟,首先要定義一個消息,其次是添加自定義消息的消息映射,最后是添加消息映射對應(yīng)的消息處理函數(shù)。

首先在服務(wù)端和客戶端定義一個消息,具體如下:

  1. #define WM_UMSG WM_USER + 1 

然后是在接收消息的服務(wù)端添加消息映射,如下: 

  1. BEGIN_MESSAGE_MAP(CUserWMDlg, CDialog)  
  2.  //{{AFX_MSG_MAP(CUserWMDlg)  
  3.  ON_WM_SYSCOMMAND()  
  4.  ON_WM_PAINT()  
  5.  ON_WM_QUERYDRAGICON()  
  6.  ON_MESSAGE(WM_UMSG, RevcMsg)  
  7.  //}}AFX_MSG_MAP  
  8. END_MESSAGE_MAP() 

在這個消息映射中,ON_MESSAGE(WM_UMSG, RevcMsg)是自定義消息的消息映射。

最后在接收消息的服務(wù)端添加自定義消息的消息響應(yīng)函數(shù)。根據(jù)消息映射可以得知,消息響應(yīng)函數(shù)的函數(shù)名為RevcMsg(),定義如下: 

  1. VOID CUserWMDlg::RevcMsg(WPARAM wParam, LPARAM lParam)  
  2.  
  3.  // ….  

2. 完成自定義消息通信的代碼

來看兩個程序的窗口界面,如圖1和圖2所示。

圖1  自定義消息服務(wù)端(接收端)

圖2  自定義消息客戶端(發(fā)送端)

知道了兩個程序的作用以及窗口的界面,那么開始對它們分別進行編碼。首先來看自定義消息服務(wù)端的代碼,該部分的代碼比較簡單。消息響應(yīng)函數(shù)代碼如下: 

  1. VOID CUserWMDlg::RevcMsg(WPARAM wParam, LPARAM lParam)  
  2.  
  3.   int nNum1, nNum2, nSum;  
  4.   nNum1 = (int)wParam;  
  5.   nNum2 = (int)lParam;  
  6.   nSum = nNum1 + nNum2;  
  7.   CString str;  
  8.   str.Format("%d", nSum);  
  9.   SetDlgItemText(IDC_EDIT_REVCDATA, str);  

在消息響應(yīng)的函數(shù)中有兩個參數(shù),分別是WPARAM類型和LPARAM類型。這兩個參數(shù)可以接收兩個4字節(jié)的參數(shù)。這里代碼中接收了兩個整型數(shù)值,進行相加后顯示在了窗口上的編輯框中。

在發(fā)送消息端,也需要定義相同的消息類型。這里不再重復介紹,只要把響應(yīng)的定義復制粘貼即可。主要看發(fā)送消息的函數(shù),代碼如下: 

  1. void CUserWMCDlg::OnBtnSend()  
  2.  
  3.   // 在此處添加處理程序代碼  
  4.   int nNum1, nNum2;  
  5.   nNum1 = GetDlgItemInt(IDC_EDIT_SENDDATA, FALSE, FALSE);  
  6.   nNum2 = GetDlgItemInt(IDC_EDIT_SENDDATA2, FALSE, FALSE);  
  7.   HWND hWnd = ::FindWindow(NULL, "自定義消息服務(wù)端");  
  8.   ::SendMessage(hWnd, WM_UMSG, (WPARAM)nNum1, (LPARAM)nNum2); 
  9.  

通過SendMessage()函數(shù)完成了發(fā)送,同樣也非常簡單。在SendMessage()函數(shù)中,通過第3個參數(shù)和第4個參數(shù)將兩個整型值發(fā)送給了目標的窗口。

從自定義消息的例子中可以看出,自定義消息對于進程間的通信只能完成簡單的數(shù)值型的傳遞,對于類型復雜的數(shù)據(jù)的通信就無法完成了。那么,通過消息是否能完成字符串等數(shù)據(jù)的通信傳遞呢?答案是肯定的。接下來看使用WM_COPYDATA消息完成進程間通信的例子。 

02 通過WM_COPYDATA消息進行進程通信

自定義消息傳遞的數(shù)據(jù)類型過于簡單,而通過WM_COPYDATA消息進行進程間的通信會更加靈活。但是由于SendMessage()函數(shù)在發(fā)送消息時的阻塞機制,在使用WM_COPYDATA時傳遞的消息也不宜過多。

1. WM_COPYDATA消息介紹

應(yīng)用程序發(fā)送WM_COPYDATA消息可以將數(shù)據(jù)傳遞給其他應(yīng)用程序。WM_COPYDATA消息需要使用SendMessage()函數(shù)進行發(fā)送,而不能使用PostMessage()消息。通過SendMessage()函數(shù)發(fā)送WM_COPYDATA消息的形式如下: 

  1. SendMessage(  
  2.  (HWND) hWnd,  
  3.  WM_COPYDATA,  
  4.  (WPARAM) wParam,  
  5.  (LPARAM) lParam  
  6. ); 

第1個參數(shù)hWnd是接收消息的目標窗口句柄;第2個參數(shù)是消息的類型,也就是當前正在介紹的消息WM_COPYDATA;第3個參數(shù)是發(fā)送消息的窗口句柄;第4個參數(shù)是一個COPYDATASTRUCT結(jié)構(gòu)體的指針。

COPYDATASTRUCT結(jié)構(gòu)體的定義如下: 

  1. typedef struct tagCOPYDATASTRUCT {  
  2.  ULONG_PTR dwData;  
  3.  DWORD cbData;  
  4.  PVOID lpData;  
  5. } COPYDATASTRUCT, *PCOPYDATASTRUCT; 

其中,dwData是自定義的數(shù)據(jù),cbData用來指定lpData指向的數(shù)據(jù)的大小,lpData是指向數(shù)據(jù)的指針。

在程序中,發(fā)送WM_COPYDATA消息方仍然會通過調(diào)用FindWindow()函數(shù)來查找目標窗口的句柄,而接收消息方需要響應(yīng)對WM_COPYDATA消息的處理。WM_COPYDATA不是自定義消息,在編程時不必像自定義消息那樣需要自己定義消息和添加消息映射,這部分工作可以直接通過MFC輔助進行。

MFC添加WM_COPYDATA消息響應(yīng)的方法如下:

首先在要響應(yīng)WM_COPYDATA消息的窗口對應(yīng)的類上單擊鼠標右鍵,在彈出的快捷菜單中選擇“Add Windows Message Handler”,如圖3所示。選擇該菜單項后會出現(xiàn)如圖4所示的添加消息響應(yīng)函數(shù)對話框。

圖3  選擇“Add Windows Message Handler”

圖4  添加消息響應(yīng)函數(shù)對話框

在“New Windows messages/events:”列中找到WM_COPYDATA消息,然后雙擊將它添加到“Existing message/event handlers:”列中。最后單擊“Add Handler”按鈕,MFC就自動生成了WM_COPYDATA的消息映射及消息響應(yīng)函數(shù)。Windows其他常用的消息都可以通過該對話框輔助生成消息映射及消息響應(yīng)函數(shù)。

2. WM_COPYDATA程序界面及介紹

程序同樣分為客戶端程序和服務(wù)端程序。首先來看程序運行的效果,如圖5所示。

圖5  WM_COPYDATA的服務(wù)端與客戶端界面

WM_COPYDATA的服務(wù)端會接收WM_COPYDATA消息,在接收到WM_COPYDATA消息進行處理后同樣會發(fā)送一個WM_COPYDATA消息給客戶端進行消息反饋。WM_COPYDATA的客戶端會通過FindWindow()函數(shù)來查找WM_COPYDATA的服務(wù)端,并發(fā)送WM_COPYDATA消息,同樣也會接收服務(wù)端發(fā)來的WM_COPYDATA消息并進行處理。

3. WM_COPYDATA客戶端程序的實現(xiàn)

我們來完成程序的編碼工作,首先來看WM_COPYDATA客戶端。客戶端的界面中有3個控件,分別是一個按鈕控件、一個編輯框控件和一個列表框控件(為列表框控件定義一個控件變量:CListBox m_ListRec;)。

WM_COPYDATA客戶端的代碼如下: 

  1. void CCopyDataCDlg::OnBtnSend()  
  2.  
  3.   // 在此處添加處理程序代碼  
  4.   // 查找接收 WM_COPYDATA 消息的窗口句柄  
  5.   HWND hWnd = ::FindWindow(NULL, "COPYDATA 服務(wù)端");  
  6.   CString strText;  
  7.   GetDlgItemText(IDC_EDIT_SENDDATA, strText);  
  8.   // 設(shè)置 COPYDATASTRUCT 結(jié)構(gòu)體  
  9.   COPYDATASTRUCT cds;  
  10.   cds.dwData = 0
  11.   cds.cbData = strText.GetLength() + 1;  
  12.   cds.lpData = strText.GetBuffer(cds.cbData); 
  13.   // m_hWnd 是 CWnd 類中的一個成員函數(shù)  
  14.   // 表示該窗口的句柄  
  15.   ::SendMessage(hWnd, WM_COPYDATA, (WPARAM)m_hWnd, (LPARAM)&cds);  
  16.  
  17. BOOL CCopyDataCDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)  
  18.  
  19.   // 在此處添加處理程序代碼或者調(diào)用默認方法  
  20.   // 處理服務(wù)端發(fā)來的 WM_COPYDATA 消息  
  21.   CString strText;  
  22.   strText.Format("服務(wù)端在[%s]接收到該消息", pCopyDataStruct->lpData);  
  23.   m_ListRec.AddString(strText);  
  24.   return CDialog::OnCopyData(pWnd, pCopyDataStruct);  

4. WM_COPYDATA服務(wù)端程序的實現(xiàn)

WM_COPYDATA 服務(wù)端有兩個控件,分別是一個列表框控件和一個按鈕控件。為列表框控件定義一個控件變量:CListBox m_ListData。

WM_COPYDATA 服務(wù)端的代碼如下: 

  1. BOOL CCopyDataSDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)  
  2.  
  3.   // 在此處添加處理程序代碼或者調(diào)用默認方法  
  4.   CString strText;  
  5.   // 通過發(fā)送消息的窗口句柄獲得窗口對應(yīng)的進程號,即 PID  
  6.   DWORD dwPid = 0 
  7.   ::GetWindowThreadProcessId(pWnd->m_hWnd, &dwPid);  
  8.   // 格式化字符串并添加至列表框中  
  9.   strText.Format("PID=[%d]的進程發(fā)來的消息為:%s",  
  10.   dwPid, pCopyDataStruct->lpData);  
  11.   m_ListData.AddString(strText);  
  12.   // 獲取本地時間  
  13.   SYSTEMTIME st;  
  14.   GetLocalTime(&st);  
  15.   CString strTime;  
  16.   strTime.Format("%02d:%02d:%02d", st.wHour, st.wMinute, st.wSecond);  
  17.   // 將本地時間發(fā)送給客戶端程序  
  18.   COPYDATASTRUCT cds;  
  19.   cds.dwData = 0 
  20.   cds.cbData = strTime.GetLength() + 1;  
  21.   cds.lpData = strTime.GetBuffer(cds.cbData); 
  22.   // 注意 SendMessage()函數(shù)的第 3 個參數(shù)為 NULL  
  23.   ::SendMessage(pWnd->m_hWnd, WM_COPYDATA, NULL, (LPARAM)&cds);  
  24.   return CDialog::OnCopyData(pWnd, pCopyDataStruct);  
  25.  
  26. void CCopyDataSDlg::OnBtnDelall()  
  27.  
  28.   // 在此處添加處理程序代碼  
  29.   // 清空列表框內(nèi)容  
  30.   while ( m_ListData.GetCount() )  
  31.   {  
  32.     m_ListData.DeleteString(0);  
  33.   }  

在接收消息的服務(wù)端調(diào)用GetWindowThreadProcessId()通過發(fā)送消息的窗口得到了發(fā)送消息的進程PID號,并將接收消息的時間反饋給了發(fā)送消息的客戶端。

關(guān)于WM_COPYDATA的服務(wù)端和客戶端的代碼都有比較詳細的注釋,因此沒有過多解釋。這里需要強調(diào)一點,WM_COPYDATA消息需要兩個附加消息,也就是SendMessage()函數(shù)的wParam和lParam參數(shù)都需要使用。wParam參數(shù)表示發(fā)送消息的窗口句柄,但是該參數(shù)可以省略,還可以通過類型轉(zhuǎn)換傳遞其他數(shù)值型的數(shù)據(jù)。lParam參數(shù)是COPYDATASTRUCT結(jié)構(gòu)體指針類型,不可以省略,否則接收WM_COPYDATA消息的服務(wù)端會無法響應(yīng)。 

 

責任編輯:龐桂玉 來源: 計算機與網(wǎng)絡(luò)安全
相關(guān)推薦

2021-02-21 18:19:43

網(wǎng)絡(luò)安全網(wǎng)絡(luò)安全編程創(chuàng)建進程

2021-02-23 10:20:07

網(wǎng)絡(luò)安全進程代碼

2019-11-08 14:47:49

TCPIP網(wǎng)絡(luò)

2021-03-01 11:38:15

網(wǎng)絡(luò)安全進程代碼

2021-01-18 10:35:18

網(wǎng)絡(luò)安全Windows代碼

2021-06-24 08:37:34

網(wǎng)絡(luò)安全內(nèi)核代碼

2017-06-19 13:36:12

Linux進程消息隊列

2021-03-03 12:20:42

網(wǎng)絡(luò)安全DLL編程

2012-06-28 14:21:20

2020-11-04 07:17:42

Nodejs通信進程

2017-08-06 00:05:18

進程通信開發(fā)

2021-03-05 13:46:56

網(wǎng)絡(luò)安全遠程線程

2021-01-26 13:45:03

網(wǎng)絡(luò)安全Winsock編程

2013-03-28 13:14:45

AIDL進程間通信Android使用AI

2019-05-13 10:00:41

Linux進程間通信命令

2021-02-23 16:19:18

網(wǎng)絡(luò)安全智慧城市互聯(lián)網(wǎng)

2018-08-06 15:33:02

網(wǎng)絡(luò)安全CISO投資

2016-10-10 00:18:27

2011-05-13 13:24:02

2023-07-13 07:10:20

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 一级少妇女片 | 国产欧美视频一区二区 | 日韩不卡在线 | 一区二区三区免费在线观看 | 先锋资源亚洲 | 三级视频在线观看 | 成人免费一区二区 | 91久久伊人 | 亚洲精品视频免费观看 | 国产成人免费在线 | 国产日韩视频 | 久久国产婷婷国产香蕉 | 欧美激情久久久 | 国产毛片久久久 | 精品久久影院 | 久久久久精 | 成人性生交大片免费看r链接 | 天天干天天玩天天操 | 日韩欧美理论片 | 亚洲韩国精品 | 一二区电影 | 天天综合亚洲 | 成人国产精品入口免费视频 | 在线观看亚洲精品 | 亚洲精品久久久一区二区三区 | 高清久久久 | 国产精品爱久久久久久久 | 91精品国产色综合久久不卡蜜臀 | 精品一区二区三区视频在线观看 | 国产精品国产精品国产专区不卡 | 一区精品视频在线观看 | 亚洲一区二区三区四区在线观看 | 精品国产乱码久久久 | 国产精品久久久av | 免费在线一区二区 | 欧美成人h版在线观看 | 中文字幕一区二区三区精彩视频 | 91亚洲精| 久久久网 | 伊人伊成久久人综合网站 | 夜夜骚视频 |