进程间通信之消息通信
最近做的一个交通行业的监控指挥平台。监控平台是用MFC开发,GIS平台是用.net开发。
现在要GIS上的设备选择播放,转移到MFC中播放。其实很简单,只需要把选择的设备ID好传给MFC即可。
有几处需要注意:.Net中并没有直接发送消息的库,需要借用C的发送消息库User32.dll,如下
public class ImportFromDLL
{
public const int WM_COPYDATA = 0x004A;
public const int WM_RECV_MESSAGE = 0x046A;
//启用非托管代码
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public int dwData; // not used
public int cbData; // 长度
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
[DllImport("User32.dll")]
public static extern int SendMessage(
IntPtr hWnd,
int Msg,
IntPtr wParam,
ref COPYDATASTRUCT pcd
);
//public static extern int SendMessage(
// IntPtr hWnd,
// int Msg,
// int param1,
// string param2
// );
[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("Kernel32.dll", EntryPoint = "GetConsoleWindow")]
public static extern IntPtr GetConsoleWindow();
[DllImport("User32.dll", EntryPoint = "PostMessage")]
public static extern int PostMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
}
2、C库发送和接受消息,ImportFromDLL.SendMessage(hwndRecvWindow, ImportFromDLL.WM_COPYDATA, hwndSendWindow, ref copydata);
需要 :
a、 有句柄,发送函数中 第一个参数接受句柄,和接收函数中的句柄一致。
b、消息类型参数 一致,第二个参数 public const int WM_COPYDATA = 0x004A;
C、发送的数据是地址(可以是一个结构体数据地址)
d、MFC在窗体可直接创建消息时间 ON_MESSAGE(WM_DDD_GETMESSAGELIST,&CDevTree::OnDDDGetMessagelist)
该窗体就是句柄(也可以创建一个窗体当做句柄),第一个消息类型参数,结构体数据。
这样就是实现了简单的进程间消息通信。