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 <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 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 <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 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 <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”);不可能找到另一臺計算機上運行進程的名稱。
在下一篇博客中將講述用類似的方式,但是可以傳遞字符串。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章