C++进程间通信---自定义消息

来源:互联网 发布:淘宝中秋节活动 编辑:程序博客网 时间:2024/06/05 22:43

在windows中消息分为两种,即系统消息和用户自定义消息,系统消息定义从0到0x3ff,可以使用0x400到0x7fff定义自己的消息。windows把0x400定义为WM_USER,如果想定义自己的一个消息,可以在WM_USER上加上一个值。当然了,有另外一种方法,这里就不讲了,而是使用RegisterWindowsMessage()函数。要想用消息实现进程间通信,则需要在这两个程序中定义或注册相同的消息,才能保证数据通信顺利进行。
  使用这种方式实现进程间通信,但是传送的数据只能是长整型的数据,不能是字符串。所以这个就是这种方式的局限。

———————–以上转自http://blog.csdn.net/vipygd/article/details/6780325

我的测试源码:

进程1代码:

//-------------------------main.h-----------------------------#ifndef mainH#define mainH//---------------------------------------------------------------------------#include <System.Classes.hpp>#include <Vcl.Controls.hpp>#include <Vcl.StdCtrls.hpp>#include <Vcl.Forms.hpp>#include <Vcl.Buttons.hpp>#include <Vcl.ExtCtrls.hpp>#define WM_PROCESS_RECV (WM_USER+100)   //自定义消息第一步:定义自己的消息//-------------------------------------------------------------------class TformMain : public TForm{__published:    // IDE-managed Components    TMemo *mmoMsgShow;    TGroupBox *GroupBox1;    TGroupBox *GroupBox2;    TLabeledEdit *ledtMsgSend;    TBitBtn *btnSend;    void __fastcall btnSendClick(TObject *Sender);private:    // User declarationspublic:     // User declarations    __fastcall TformMain(TComponent* Owner);protected:    //自定义消息第三步:定义自己消息的处理函数    //自定义消息第四步:实现处理函数    void __fastcall RecvMsg(Messages::TMessage &Message);//自定义消息第二步:将自己定义的消息加入消息映射表BEGIN_MESSAGE_MAP    MESSAGE_HANDLER(WM_PROCESS_RECV, TMessage, RecvMsg);END_MESSAGE_MAP(TForm);};//---------------------------------------------------------------------------extern PACKAGE TformMain *formMain;//---------------------------------------------------------------------------#endif
//-------------------------main.cpp---------------------------------#include <vcl.h>#pragma hdrstop#include "main.h"#include <stdio.h>//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TformMain *formMain;//---------------------------------------------------------------------------__fastcall TformMain::TformMain(TComponent* Owner)    : TForm(Owner){}//---------------------------------------------------------------------------void __fastcall TformMain::RecvMsg(Messages::TMessage &Message){    int iRecv = Message.LParam;    mmoMsgShow->Lines->Add(iRecv);}//---------------------------------------------------------------------------void __fastcall TformMain::btnSendClick(TObject *Sender){    int iSend = ledtMsgSend->Text.ToInt();    try    {        //进程间传递指针要出错的,因为他们有自己的4G进程空间,这里的指针在另一个进程中不是有效的,所以只能传递整数不能传递字符串        HWND hwnd=FindWindow(L"TformMain", L"进程间通信----自定义消息2");//前面是类名(可以为空),后面是窗体名字        SendMessage(hwnd,WM_PROCESS_RECV,0, iSend);    }catch(...)    {    }}

进程2代码(基本和进程1代码一样):

//--------------------------main.h---------------------------------#ifndef mainH#define mainH//-------------------------------------------------------------------#include <System.Classes.hpp>#include <Vcl.Controls.hpp>#include <Vcl.StdCtrls.hpp>#include <Vcl.Forms.hpp>#include <Vcl.Buttons.hpp>#include <Vcl.ExtCtrls.hpp>#define WM_PROCESS_RECV (WM_USER+100)//---------------------------------------------------------------------------class TformMain : public TForm{__published:    // IDE-managed Components    TMemo *mmoMsgShow;    TGroupBox *GroupBox1;    TGroupBox *GroupBox2;    TLabeledEdit *ledtMsgSend;    TBitBtn *btnSend;    void __fastcall btnSendClick(TObject *Sender);private:    // User declarationspublic:     // User declarations    __fastcall TformMain(TComponent* Owner);protected:    void __fastcall RecvMsg(Messages::TMessage &Message);BEGIN_MESSAGE_MAP    MESSAGE_HANDLER(WM_PROCESS_RECV, TMessage, RecvMsg);END_MESSAGE_MAP(TForm);};//---------------------------------------------------------------------------extern PACKAGE TformMain *formMain;//---------------------------------------------------------------------------#endif
//-------------------------------main.cpp----------------------------#include <vcl.h>#pragma hdrstop#include "main.h"#include <stdio.h>//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TformMain *formMain;//---------------------------------------------------------------------------__fastcall TformMain::TformMain(TComponent* Owner)    : TForm(Owner){}//---------------------------------------------------------------------------void __fastcall TformMain::RecvMsg(Messages::TMessage &Message){    int iRecv = Message.LParam;    mmoMsgShow->Lines->Add(iRecv);}//---------------------------------------------------------------------------void __fastcall TformMain::btnSendClick(TObject *Sender){    int iSend = ledtMsgSend->Text.ToInt();    try    {        //进程间传递指针要出错的,因为他们有自己的4G进程空间,这里的指针在另一个进程中不是有效的        HWND hwnd=FindWindow(L"TformMain", L"进程间通信----自定义消息1");//前面是类名,后面是窗体名字        SendMessage(hwnd,WM_PROCESS_RECV,0, iSend);    }catch(...)    {    }}

测试结果:
这里写图片描述

要注意的是:
进程间传递指针要出错的,因为他们有自己的4G进程空间,这里的指针在另一个进程中不是有效的,所以只能传递整数不能传递字符串,另外自定义消息这种进程间通信方式只能在同一台计算机上进行,无法跨网络和跨计算机进行。原因从代码中可以看到,HWND hwnd=FindWindow(L”TformMain”, L”进程间通信—-自定义消息1”);不可能找到另一台计算机上运行进程的名称。
在下一篇博客中将讲述用类似的方式,但是可以传递字符串。

0 0
原创粉丝点击