浅谈进程间的消息传递

From: http://blog.csdn.net/handsomewang527/article/details/1676259

    随着我们开发的应用的日益复杂,像以往那样将所有功能坐在一个exe文件中情况越来越少,更多时候是整个应用由若干模块、甚至若干单独的exe文件组成,这就涉及到了模块或进程间的通讯交互问题,本文主要谈谈在进程间的信息传递方法,作为进一步探讨进程间通讯方案的参考。

1.使用用户自定义消息在进程间传递消息。

       经过一定时间的Win32开发,大家对Windows Mobile平台下的消息映射机制应该都比较清楚了,除了系统已经为我们设定的如WM_CREATEWM_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为单位。

下面举例,还是zoujielunfeiyuqing程序间的通讯。

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)&copyData);  // 不能使用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;

}

即收到该消息后从相应参数取出数据进行处理。

学累了吧,快来看看我的非技术博客:猫思猫想


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派移植SX1278 LoRa通信--使用wiringPiSPI移植SPI通信接口

一、SPI接口 树莓派3B上的SPI接口如下所示,有两组SPI,分别由CE0和CE1来进行选择。 首先查看树莓派的SPI是否启用,在/dev查看是否有spidev0.0和spidev0.1 如果不存在spi设备号,需要在raspi-config中启用,在命令行输入&…

能说明你的Javascript技术很烂的五个原因

Javascript在互联网上名声很臭,但你又很难再找到一个像它这样如此动态、如此被广泛使用、如此根植于我们的生活中的另外一种语言。它的低学习门槛让很多人都称它为学前脚本语言,它另外一个让人嘲笑的东西是动态语言的概念是偏偏使用了高标准的静态数据类…

[react] 除了实例的属性可以获取Context外哪些地方还能直接获取Context呢?

[react] 除了实例的属性可以获取Context外哪些地方还能直接获取Context呢&#xff1f; Context React.createContext<Context.Provider value{contextValue}> child </Context.Provider>使用 组件式: <Context.Consumer>{contextValue > ...}</Conte…

饥荒专用服务器全图显示代码,饥荒开全图代码

用记事本打开游戏目录\data\DLC0001\scripts\prefabs\player_common.lua文件&#xff0c;在inst:AddComponent("resurrectable")下一行插inst:AddComponent("resurrectable")下一行插入以下内容&#xff1a;  TheInput:AddKeyUpHandler(KEY_1&#xff0c…

树莓派移植SX1278 LoRa通信--使用wiringPi 移植GPIO中断

一、SX1278 数字接口状态映射 从官方文档可知sx1278的数字接口状态映射明细&#xff0c;移植的代码中主要用查询的方式来判断在连续模式下是否接收和发送完成&#xff0c;因此只需要用到DIO0。如果要用到CAD&#xff0c;则需要DIO1管脚。 发送时&#xff1a;DioMapping1寄存器…

linux系统中如何查看日志 (常用命令2)

cat tail -f 日 志 文 件 说 明 /var/log/message 系统启动后的信息和错误日志&#xff0c;是Red Hat Linux中最常用的日志之一 /var/log/secure 与安全相关的日志信息 /var/log/maillog 与邮件相关的日志信息 /var/log/cron 与定时任务相关的日志信息 /var/log/spooler 与…

VMware View 与 Citrix Xendesktop 管理大比拼

一篇写得非常不错的博文&#xff0c;从管理角度来对比虚拟桌面产品的差异&#xff0c;而这一点往往被代理商和用户忽略&#xff0c;值得花时间看看。 大部分用户决定使用桌面虚拟化的最大原因是简化管理。我深刻的记得2006年在X福记用户那推补丁管理软件时&#xff0c;结…

[react] childContextTypes是什么?它有什么用?

[react] childContextTypes是什么&#xff1f;它有什么用&#xff1f; childContextTypes用来定义context数据类型&#xff0c;该api从16.3开始已被废弃 使用方式 class MessageList extends React.Component {getChildContext() {return {color: "purple"};}rend…

readdirectorychangesw 链接错误 undeclared identifier 解决方法

From: http://aaronaddis.blog.163.com/blog/static/1270893292010431101042517/ 今天在编程中遇到了文件监控的东西&#xff0c;在使用readdirectorychangesw 函数是老是报未定义的错误&#xff0c;看了MSDN&#xff0c;包含了windows.h和Winbase.h 两个头文件&#xff0c;但…

matlab 画箱线图boxplot简单用法

代码示例&#xff1a; data1rand(5,1);%列向量 data2rand(5,1);%列向量 data3rand(5,1);%列向量 data[data1,data2,data3]; boxplot(data,Labels,{data1,data2,data3}); 更多请参考&#xff1a; matlab官网文档&#xff1a;https://www.mathworks.com/help/stats/boxplot.htm…

“FormCRUD.csProj.FormMain.Name”隐藏了继承的成员“System.Windows.Forms.Control.Name”。如果是有意隐藏,请使用关键字 new。...

“FormCRUD.csProj.FormMain.Name”隐藏了继承的成员“System.Windows.Forms.Control.Name”。如果是有意隐藏&#xff0c;请使用关键字 new。 一旦运行就显示&#xff1a;“FormCRUD.csProj.FormMain.Name”隐藏了继承的成员“System.Windows.Forms.Control.Name”。如果是有意…

[react] 为什么React并不推荐我们优先考虑使用Context?

[react] 为什么React并不推荐我们优先考虑使用Context&#xff1f; 1、Context目前还处于实验阶段&#xff0c;可能会在后面的发行版本中有很大的变化&#xff0c;事实上这种情况已经发生了&#xff0c;所以为了避免给今后升级带来大的影响和麻烦&#xff0c;不建议在app中使用…

思科数据中心Nexus 3000

思科数据中心新战略 将推Nexus 3000等产品 ZDNET网络频道&#xff1a;2011-03-07&#xff1a;网界网 本文关键词&#xff1a;思科 数据中心 思科计划很快推出一款为频繁的金融交易设计的数据中心交换机&#xff0c;或者还可能推出类似于瞻博网络最近发表的QFabric的一种交换机结…

VC++文件监控(一) ReadDirectoryChangesW

From: http://www.cnblogs.com/doublesnke/archive/2011/08/16/2141374.html VC实施文件监控&#xff1a;实例和详解 相关帮助: http://hi.baidu.com/jiahaosoft/blog/item/b441d1218eebece0d6cae274.html 我这里只介绍采用ReadDirectoryChangesW对文件目录实施监控 关键代码…

深度学习--Matlab使用LSTM长短期记忆网络对负荷进行分类

一、概述 关于LSTM同系列的前一篇文章写的是利用LSTM网络对电力负荷进行预测【LSTM预测】&#xff0c;其本质是sequence-to-sequence problems&#xff0c;序列到序列的预测应用。这里做一下sequence-to-label classification problems&#xff0c;序列到标签的分类应用【LSTM…

VC跨进程数据(结构体)传递-WM_COPYDATA

两个测试程序&#xff0c;都是MFC基于对话框的应用程序&#xff0c;一个是发送者&#xff0c;一个是接收者。 两个程序都使用同一个结构体&#xff1a; typedef struct {char imsi[20];char options[512]; }_tagResult;发送者&#xff1a;按钮点击事件&#xff1a; void CCa…

[react] 什么渲染劫持?

[react] 什么渲染劫持&#xff1f; 首先&#xff0c;什么是渲染劫持&#xff1a;渲染劫持的概念是控制组件从另一个组件输出的能力&#xff0c;当然这个概念一般和react中的高阶组件&#xff08;HOC&#xff09;放在一起解释比较有明了。 高阶组件可以在render函数中做非常多…

咨询的真相8:咨询业的“前世今生”

第四节 咨询业的奶酪究竟有多大 2001年&#xff0c;又是从美国&#xff0c;传来了一本风靡全球的畅销书&#xff0c;讲的是四个老鼠和一块奶酪的故事。从此&#xff0c;奶酪就成了众人争抢之物的代名词。美国人的创新精神不得不佩服&#xff0c;忒俗的一个道理经他们仅从形式上…

matlab LSTM序列分类的官方示例

matlab版本是2018b及其以上。 %% %加载序列数据 %数据描述&#xff1a;总共270组训练样本共分为9类&#xff0c;每组训练样本的训练样个数不等&#xff0c;每个训练训练样本由12个特征向量组成&#xff0c; [XTrain,YTrain] japaneseVowelsTrainData; %数据可视化 figure plo…

【MySQL】Java对SQL时间类型的操作(获得当前、昨天、前年。。时间)

Java获得当前时间1 java.util.Date date new java.util.Date(); 2 Timestamp time new Timestamp(date.getTime()); Java获得昨天的时间1 Calendar cal Calendar.getInstance(); 2 cal.add(Calendar.DATE, -1); 3 String a new SimpleDateFormat( "yyyy-MM-dd ")…