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

在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 
#include 
#include 
#include 
#include 
#include 

#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 declarations
public:     // 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 
#pragma hdrstop

#include "main.h"
#include 
//---------------------------------------------------------------------------
#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 
#include 
#include 
#include 
#include 
#include 

#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 declarations
public:     // 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 
#pragma hdrstop

#include "main.h"
#include 
//---------------------------------------------------------------------------
#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(...)
    {

    }
}

测试结果:
C++进程间通信---自定义消息_第1张图片

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

你可能感兴趣的:(C++,进程间通信)