浅谈进程间的消息传递
From: http://blog.csdn.net/handsomewang527/article/details/1676259
随着我们开发的应用的日益复杂,像以往那样将所有功能坐在一个exe文件中情况越来越少,更多时候是整个应用由若干模块、甚至若干单独的exe文件组成,这就涉及到了模块或进程间的通讯交互问题,本文主要谈谈在进程间的信息传递方法,作为进一步探讨进程间通讯方案的参考。
1.使用用户自定义消息在进程间传递消息。
经过一定时间的Win32开发,大家对Windows Mobile平台下的消息映射机制应该都比较清楚了,除了系统已经为我们设定的如WM_CREATE、WM_PAINT这类消息外,还有一种特殊的WM_USER消息用于用户自定义消息。
定义格式如下:
#define WM_IAMHANDSOME WM_USER+1
然后同样的对于WM_IAMHANDSOME同样的将它映射到相应的处理函数上去。
当需要使用激发该消息时,采用SendMessage函数发送一个WM_IAMHANDSOME即可。下面谈谈在进程间如何进行用户自定义消息的传递。
例,假设两个程序,一个叫zoujielun,一个叫feiyuqing,两个程序进行一项操作,唱一首名叫《千里之外》的歌。
其中即需要一个程序“唱”完后通知另一个程序接着“唱”。
1)在两个程序中都定义#define WM_YOUTURN WM_USER+10
2)在feiyuqing进程中加入对应WM_YOUTURN的映射:
const MSG_MAP_MAIN_S g_mainMsg[] =
{
//……
{WM_YOUTURN,OnYouturn},
//……
};
3)在zoujielun中向feiyuqing发送WM_YOUTURN的消息,代码如下:
Sing(_T(“屋檐如悬崖风铃如沧海我等燕归来……”));
HWND findWindows=NULL;
findWindows= FindWindow(_T(“feiyuqing”), _T(“feiyuqing"));
SendMessage(findWindows,WM_YOUTURN,0,0);
这样,即把消息发送给了feiyuqing进程。
4)在feiyuqing中,对应的OnYouTurn做出相应处理即可。
LRESULT OnYouTurn(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
Sing(_T(“我送你离开千里之外 ……”));
return 0;
}
这样即实现了进程间通过自定义消息传递来进行通讯,但是这样的缺点是不能同时传递数据。假设feiyuqing因为年纪大了,如果突然“失忆”了,不记得歌词,需要zoujielun不但告诉他该唱了,还要告诉他该唱什么,这时就需要利用系统一个强大的消息WM_COPYDATA。
2.使用WM_COPYDATA消息跨进程传递数据
在SDK中,该消息对应的参数为:
WM_COPYDATA wParam = (WPARAM)(HWND) hwnd;
lParam = (LPARAM)(PCOPYDATASTRUCT) pcds;
关键在于第二个参数,即一个COPYDATASTRUCT结构的指针。
该数据结构的结构如下:
typedef struct tagCOPYDATASTRUCT {
DWORD dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT;
第一个数据成员可以传递一个DWORD类型,如果只是要在进程间传一个DWORD类型的数据,这里可以直接用这个成员传递。
关键在第二、三个数据成员,第三个lpData即为欲传递的数据的指针,第二个cbData即为传递的数据大小,以byte为单位。
下面举例,还是zoujielun和feiyuqing程序间的通讯。
1)在feiyuqing进程中加入对应WM_COPYDATA的映射:
const MSG_MAP_MAIN_S g_mainMsg[] =
{
//……
{WM_COPYDATA,OnYouturn},
//……
};
2)在zoujielun中向feiyuqing发送WM_YOUTURN的消息,代码如下:
Sing(_T(“屋檐如悬崖风铃如沧海我等燕归来……”));
HWND findWindows=NULL;
findWindows= FindWindow(_T(“feiyuqing"), _T(“feiyuqing"));
TCHAR *sContent = new TCHAR[256];
wsprintf(sContent,_T(“我送你离开千里之外……"));
COPYDATASTRUCT copyData;
copyData.cbData = _msize(sContent);
copyData.lpData = sContent;
SendMessage(findWindows,WM_COPYDATA,0,(LPARAM)©Data); // 不能使用PostMessage,因为这是个非阻塞的函数,对方会收不到发来的消息的。
3)在feiyuqing中,对应的OnOnYouTurn做出相应处理即可。
LRESULT OnYouTurn(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
TCHAR *sContent = NULL;
sContent =(TCHAR*)((COPYDATASTRUCT*)lParam)->lpData;
Sing(sContent);
return 0;
}
即收到该消息后从相应参数取出数据进行处理。
学累了吧,快来看看我的非技术博客:猫思猫想
浅谈进程间的消息传递相关推荐
- 【Linux系统编程】浅谈进程地址空间与虚拟存储空间
早期的内存分配机制 在早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址.当计算机同时运行多个程序时,必须保证这些 ...
- 浅谈进程地址空间与虚拟存储空间
早期的内存分配机制 在早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址.当计算机同时运行多个程序时,必须保证这些 ...
- 浅谈主机间网络通信实际过程
网络通信神马的,听起来不过尔尔,唠起来也是催眠的话题.不过没关系. 网络还没有你认为的那么枯燥.话说阿拉喜欢的,你要说他没意思阿拉真的--会证明他的魅力给你看的哦. 嗨嗨,第一个词--抓包.兴许各位倒 ...
- 进程间的通信方式:简介
1.概述 IPC就是进程间通信(interprocess communication)的简称.传统上该术语描述的是运行在某个操作系统之上的不同进程间的消息传递(message passing)的方式. ...
- Windows进程间各种通信方式浅谈(转)
转自 https://blog.csdn.net/microzone/article/details/7044266 权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原 ...
- linux 进程间广播,Linux系统编程之进程间通信之浅谈信号
我们接着谈Linux学习过程中一个重要的话题--信号. 一.信号的概念: 信号是一种软件中断,它提供了一种处理异步事件的方法,也是进程间唯一的异步通信方式. 二.信号的来源: 1.硬件方式: 当用户按 ...
- 获得进程id_浅谈python中的多线程和多进程(二)
原创:hxj7 本文继续分享一个关于python多线程和多进程区别的例子 前文<浅谈python中的多线程和多进程>中我们分享过一个例子,就是分别利用python中的多线程和多进程来解决高 ...
- java 字符串转list_浅谈java 字符串,字符数组,list间的转化
1.关于java.lang.string.split xxx.split()方法可以将一个字符串分割为子字符串,然后将结果作为字符串数组返回. 2.字符串转字符数组 String str =" ...
- 浅谈股市、美元汇率与原油价和黄金价格间的关系
浅谈股市.美元汇率与原油价和黄金价格间的关系 影响股市.汇市.油价 和黄金价格的因素众多.但是在一般情况下,它们之间存在此消彼长的互动关系. 一.股市与原油价格 如果股市下跌,一般认为是经济形势不好的 ...
最新文章
- 8 月--菜鸟吐槽日志
- Unity3d 去掉exe版本的边框
- Windows server 1709(不含UI)模板部署
- Cocoa Touch 层
- [react] 在react中什么是合成事件?有什么用?
- pythonopencv测距_python opencv单目测距 小孔成像原理
- python 字符串转换
- 凭什么程序员工资那么高?
- sql server 性能_SQL Server预读机制; 概念和性能提升
- 微信点餐外卖源码小程序开发
- java fileupload 文件类型_FileUpload怎么获取文件的类型
- 计算机的专业课听不懂怎么办,为什么大学计算机课难以听懂?
- identifier “ “ is undefined 错误
- Pascal词法分析器用java实现
- 【转】解决win10系统每次重启桌面图标排列混乱的问题!亲测有效!!
- Debian10自签CA证书
- Linux安装第三方Microsoft OneDrive —— abraunegg / onedrive
- Cypress代理铁电存储器FM25V10-GTR中文资料
- 轻量化中文版linux,MX Linux:一款专注于简洁性的中等体量发行版 | Linux 中国
- Python语音基础操作--6.3ADPCM编码
热门文章
- 数据湖 data lake_在Data Lake中高效更新TB级数据的模式
- 8 一点就消失_消失的莉莉安(26)
- 可视化 nlp_使用nlp可视化尤利西斯
- leetcode 767. 重构字符串(贪心算法)
- leetcode684. 冗余连接(并查集)
- leetcode127. 单词接龙(bfs)
- sql注入语句示例大全_SQL Order By语句:示例语法
- 构建持续交付_如何使交付成为您的重点将如何帮助您构建高质量的应用程序
- 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?...
- React学习笔记(持续更新)