进程间通信之消息通信
2015-07-28 14:33
274 查看
进程间通信之消息通信
最近做的一个交通行业的监控指挥平台。监控平台是用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)
该窗体就是句柄(也可以创建一个窗体当做句柄),第一个消息类型参数,结构体数据。
这样就是实现了简单的进程间消息通信。
最近做的一个交通行业的监控指挥平台。监控平台是用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)
该窗体就是句柄(也可以创建一个窗体当做句柄),第一个消息类型参数,结构体数据。
这样就是实现了简单的进程间消息通信。
相关文章推荐
- 64 位 win7 使用PLSQL Developer
- SQL 中varchar,nvarchar,char区别
- Java中Scanner的理解大总结
- NodeJs服务器管理
- java中静态代码块的用法 static用法详解
- 【Android应用开发技术:应用组件】:Activity基本原理
- 《侠客行》——李白
- 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)
- gclub บนมือถือ 24 ชั่วโมง
- Android MediaProvider 分析
- A Math game (DFS+剪枝)
- 高性能的敏感词过滤算法 可以忽略大小写、全半角、简繁体、特殊符号干扰 (一)
- Java(二)——开发环境搭建 安装JDK和配置环境变量
- 黑马程序员--类与对象
- mac下.gitconfig配置别名alias(刚刚)
- CvMat数据在屏幕上打印
- oracle 外部表 如何忽略第一行的标题
- 规范化的Python编程-迭代器和生成器
- CURL下载文件
- Factorization Machines 学习笔记(二)模型方程