进程之间通讯的几种方法:
在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