進程之間通訊的幾種方法:
在Windows程序中,各個進程之間常常需要交換數據,進行數據通訊。常用的方法有
1.使用內存映射文件
2.通過共享內存DLL共享內存
3.使用SendMessage向另一進程發送WM_COPYDATA消息
比起前兩種的復雜實現來,WM_COPYDATA消息無疑是一種經濟實惠的一中方法.
WM_COPYDATA消息的主要目的是允許在進程間傳遞只讀數據。Windows在通過WM_COPYDATA消息傳遞期間,不提供繼承同步方式。
這個函數的原型及其要用到的結構如下:
SendMessage(hwnd,WM_COPYDATA,wParam,lParam);
其中,WM_COPYDATA對應的十六進制數為0x004A
wParam設置為包含數據的窗口的句柄。lParam指向一個COPYDATASTRUCT的結構:
typedef struct tagCOPYDATASTRUCT{
DWORD dwData;//用戶定義數據
DWORD cbData;//數據大小
PVOID lpData;//指向數據的指針
}COPYDATASTRUCT;
該結構用來定義用戶數據。
具體的接受消息處理消息的過程如下:
#region 接收消息 const int WM_COPYDATA = 0x004A; [StructLayout(LayoutKind.Sequential)] public struct COPYDATASTRUCT {//結構體 public IntPtr dwData;//數據頭標志,傳遞到接收方 public int cbData;//數據,(字節) public IntPtr lpData;//數據指針傳遞給接收方應用程序 } //自動接收消息 mystr.lpData; protected override void DefWndProc(ref Message m) { try { switch (m.Msg) { //接收CopyData消息,讀取發送過來的數據 case WM_COPYDATA: COPYDATASTRUCT cds = new COPYDATASTRUCT(); Type mytype = cds.GetType(); cds = (COPYDATASTRUCT)m.GetLParam(mytype);//當前的消息 uint flag = (uint)(cds.dwData); byte[] bt = new byte[cds.cbData];//注意,將結構體的成員單個處理再使用 Marshal.Copy(cds.lpData, bt, 0, bt.Length);//復制消息 if (cds.cbData > 0) { string tmp = System.Text.Encoding.Default.GetString(bt);//消息字符串 if (!string.IsNullOrEmpty(tmp)) { int index = Convert.ToInt32(flag); if (index == flagKHD) { getMessage(tmp);//對消息進行篩選使用 } } } break; default: base.DefWndProc(ref m); break; } } catch (Exception ex) { XtraMessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } /// <summary> /// 接受到的消息 處理 /// </summary> /// <param name="FormMsg"></param> protected void getMessage(string FormMsg) { string[] arrayInfor = FormMsg.Split(',');//將消息用逗號隔開 //具體實用代碼 } #endregion