搜狐首页 - 新闻 - 体育 - 娱乐 - 财经 - IT - 汽车 - 房产 - 女人 - 短信 - 彩信 - 校友录 - 邮件 - 搜索 - BBS - 搜狗 
搜狐首页 >> IT频道 >> 数码天下 >> 网狐教程-搜狐IT >> 程序开发-网狐教程-搜狐IT >> C语言

编程高手:VC 6.0下利用消息实现内部进程通讯

IT.SOHU.COM  2004-09-16 13:46  转自: 天极网
页面功能 【我来说两句】【我要“揪”错】【推荐】【字体: 】【打印】 【关闭

科博会惊艳发明看花眼(组图)
微软抛出更多长角代码
卓越向左走 当当向右走
IT评论:掘墓人Skype 探寻魔鬼海域龙三角(图)
男婴体内活寄生胎



 引言

  内部进程间通讯和数据交换有消息、共享内存、匿名(命名)管道、邮槽、Windows套接字等多种技术。其中利用消息机制实现IPC虽然同其他方法相比有交换的数据量小、携带的信息少等缺点,但由于其实现方便、应用灵活而广泛应用于无须大量、频繁数据交换的内部进程通讯系统之中,尤其是对于在上层主控软件与底层工作软件之间的命令与响应上更能充分显示其良好的性能。本文就通过编制一个主控软件和一个受其操作的底层工作软件来阐述如何用VC++6.0通过消息来实现内部进程通信

Windows消息机制

  Windows是一种面向对象的体系结构,Windows环境和应用程序都是通过消息来交互的。Windows应用程序开始执行后,Windows为该程序创建一个“消息队列(message queue)”,用以存放邮寄给该程序可能创建的各种不同窗口的消息。消息队列中消息的结构(MSG)为:

typedef struct tagMSG{
 HWND hwnd;
 UINT message;
 WPARAM wParam;
 LPARAM lParam;
 DWORD time;
 POINT pt;
}MSG;

  其中第一个成员变量是用以标识接收消息的窗口的窗口句柄;第二个参数便是消息标识号,如WM_PAINT;第三个和第四个参数的具体意义同message值有关,均为消息参数。前四个参数是非常重要和经常用到的,至于后两个参数则分别表示邮寄消息的时间和光标位置(屏幕坐标)。

  把消息传送到应用程序有两种方法:一种是由系统将消息“邮寄(post)”到应用程序的“消息队列”这是“进队消息”Win32 API有对应的函数:PostMessage(),此函数不等待该消息处理完就返回;而另一种则是由系统在直接调用窗口函数时将消息“发送(send)”给应用程序的窗口函数,属于“不进队消息”对应的函数是SendMessage()其必须等待该消息处理完后方可返回。消息是在消息循环中被处理的,下面这段代码就是一个典型的消息循环:

MSG msg; //定义消息名
while (GetMessage (&msg, NULL, 0, 0))
{
 TranslateMessage (&msg) ; //翻译消息
 DispatchMessage (&msg) ; //撤去消息
}
return msg.wParam ;

  消息循环以GetMessage调用开始,它从消息队列中取出一个消息。该函数的四个参数可以有控制地获取消息,第一个参数指定要接收消息的MSG结构的地址,第二个参数表示窗口句柄,一般将其设置为空,表示要获取该应用程序创建的所有窗口的消息;第三、四参数用于指定消息范围。后面三个参数被设置为默认值,用于接收发送到属于这个应用程序的任何一个窗口的所有消息。在接收到除WM_QUIT之外的任何一个消息后,GetMessage()返回TRUE;如果GetMessage收到一个WM_QUIT消息,则返回FALSE以退出消息循环,终止程序运行。因此,在接收到WM_QUIT之前,带有GetMessage()的消息循环可以一直循环下去。

  当除WM_QUIT的消息用GetMessage读入后,首先要经过函数TranslateMessage()对其进行解释,但对大多数消息来说并不起什么作用。这里起关键作用的是DispatchMessage()函数,把由GetMessage获取的Windows消息传送给在MSG结构中为窗口所指定的窗口过程。在消息处理函数处理完消息之后,代码又循环到开始去接收另一个消息,这样就完成了一个完整的消息循环。

  主控程序的实现

  本文将设计一个主控程序和一个底层工作程序,由主控程序通过消息来控制底层工作程序的工作状态。这里首先对主控程序的设计过程进行介绍:

  首先创建一个单文档工程,添加三个菜单“命令一”、“命令二”、“命令三”及与之对应的命令响应函数:

OnSendComm1()
{
 CString str="Receiver";
 CWnd *pWnd=CWnd::FindWindow(NULL,str);
 if(pWnd)
  pWnd->SendMessage(WM_COMM,0,0);
} 
OnSendComm2()
{
 CString str="Receiver";
 CWnd *pWnd=CWnd::FindWindow(NULL,str);
 if(pWnd)
  pWnd->SendMessage(WM_COMM,0,1);
}
OnSendComm3()
{
 CString str="Receiver";
 CWnd *pWnd=CWnd::FindWindow(NULL,str);
 if(pWnd)
  pWnd->SendMessage(WM_COMM,1,0);
}

  这里,WM_COMM是自定义消息,用于在主控程序和底层通信程序之间进行联系,为了能够使用该消息,必须首先添加预定义语句:

#define WM_COMM WM_USER + 100

  上述几个函数的结构没有什么区别,首先通过FindWindow()返回由str变量指定窗口标题的应用程序主窗口句柄并将其保存到pWnd。然后再通过该句柄调用SendMessage()函数并发送刚才定义的WM_COMM消息及其消息参数。如果函数被正确执行,底层程序将收到来发自主控程序的WM_COMM消息并可在消息响应函数中完成对消息参数的判断处理以及进一步的操作。

[1] [2下一页 
页面功能 【我来说两句】【我要“揪”错】【推荐】【字体: 】【打印】 【关闭




ChinaRen - 搜狐招聘 - 网站登录 - 帮助中心 - 设置首页 - 广告服务 - 联系方式 - 保护隐私权 - About SOHU - 公司介绍
Copyright © 2005 Sohu.com Inc. All rights reserved. 搜狐公司 版权所有

相关链接
  • 在MFC应用程序中动态嵌入Word文档(08/09 18:29)
  • Visual C++中对象的序列化与文件I/O研究(07/23 14:32)
  • 揭开第二代.NET面纱 Visual C# 2005抢先预览(07/22 10:21)
  • C++ Builder 初学问与答(二)(07/21 17:37)
  • Linux下扬声器发声的小程序(07/21 17:32)
  • VC中Windows系统预定义标准控件的创建和使用(07/20 16:03)
  • VC++中定制个性化的对话框窗口类(07/19 14:20)
  • COM高手总结的八个经验和教训(07/19 14:17)
  • 编程宝典:C语言初学者易踩十八颗“地雷”(07/16 16:23)

  •  ■ 我来说两句
    用  户:        匿名发出:
    请各位遵纪守法并注意语言文明。
     
    *经营许可证编号:京ICP00000008号
    *《互联网电子公告服务管理规定》
    *《全国人大常委会关于维护互联网安全的规定》
    短信内容:
    手 机
    自写包月5分钱/条 更多>>
    搜狐天气为你抢先报! 魔力占卜姻缘一线牵!
    金币不是赚的是抢的! 爱情玄机任由你游戏!
    猪八戒这样泡到紫霞! 帅哥一定要看的宝典!
    你受哪颗星星的庇护? 萨达姆最新关押照片!
    精彩彩信
    [和弦]欧若拉 一生有你
    沧海一声笑
    [音效]挪威的森林
    爆铃 MP3 G点图 动画
    [和弦]童话 你到底爱谁
    [原唱]一千年以后 断点
    [爆笑音效]赚钱拉 野花
    [串烧]张韶涵 潘玮柏
    精彩短信
    [和弦]小薇 好心分手
    [音效]当当当当 忘记


    搜狐商城
    ·家电|品牌风扇新品热销
    ·音乐|秦海璐幸福回味
    ·图书|《眼镜蛇事件》
    更多...