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