1. 程式人生 > >C++程序間通訊---自定義訊息

C++程序間通訊---自定義訊息

在windows中訊息分為兩種,即系統訊息和使用者自定義訊息,系統訊息定義從0到0x3ff,可以使用0x400到0x7fff定義自己的訊息。windows把0x400定義為WM_USER,如果想定義自己的一個訊息,可以在WM_USER上加上一個值。當然了,有另外一種方法,這裡就不講了,而是使用RegisterWindowsMessage()函式。要想用訊息實現程序間通訊,則需要在這兩個程式中定義或註冊相同的訊息,才能保證資料通訊順利進行。
  使用這種方式實現程序間通訊,但是傳送的資料只能是長整型的資料,不能是字串。所以這個就是這種方式的侷限。

我的測試原始碼:

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

相關推薦

C++程序通訊---定義訊息

在windows中訊息分為兩種,即系統訊息和使用者自定義訊息,系統訊息定義從0到0x3ff,可以使用0x400到0x7fff定義自己的訊息。windows把0x400定義為WM_USER,如果想定義自己的一個訊息,可以在WM_USER上加上一個值。當然了,有另外

[Visual Studio C++] [MFC] 新增使用者定義訊息訊息響應函式講解

一、前言           本文介紹 兩種方法 新增使用者自定義訊息及訊息響應函式。  第一種,使用者手動新增兩個檔案((.h)和 (.cpp))的內容。  第二種,利用 MFC 的整合功能,自動新增。(推薦

程序通訊方式總結——訊息佇列

        Linux/Unix系統IPC是各種程序間通訊方式的統稱,但是其中極少能在所有Linux/Unix系統實現中進行移植。隨著POSIX和Open Group(X/Open)標準化的推進

Linux程序通訊之POSIX訊息佇列

訊息佇列可認為是一個訊息連結串列,它允許程序之間以訊息的形式交換資料。有足夠寫許可權的程序或執行緒可往佇列中放置訊息,有足夠讀許可權的程序或執行緒可從佇列中取走訊息。每個訊息都是一個記錄,它由傳送者賦予一個優先順序。與管道不同,管道是位元組流模型,沒有訊息邊界。

程序程式設計之程序通訊-管道和訊息佇列

1.程序間通訊 Linux作為一種新興的作業系統,幾乎支援所有的Unix下常用的程序間通訊方法:管道、訊息佇列、共享記憶體、訊號量、套介面等等。 2.管道 管道是程序間通訊中最古老的方式,它包括無名管道(或者匿名管道)和有名管道兩種,前者用於父程序和

【Qt】Qt之程序通訊(Windows訊息)【轉】

簡述 通過上一節的瞭解,我們可以看出程序通訊的方式很多,今天分享下如何利用Windows訊息機制來進行不同程序間的通訊。 效果 傳送訊息 自定義型別與接收窗體 包含所需庫,定義傳送的自定義型別、接收訊息的窗體標題。自定義型別可以處理訊息過多情況下,對訊息的區分,如果不需要也可以去掉。

程序通訊——管道,訊息佇列,共享記憶體

程序間通訊的本質是讓兩個不相干的程序看到同一份資源。這個資源是由作業系統提供的一個檔案。程序間通訊的目的:1.資料傳輸:一個程序需要將它 的資料傳送給另一個程序。2.資源共享:多個程序之間共享同樣的資源。3.通知事件:一個程序需要向另一個(組)程序傳送訊息,通知它們發生了

c++程序通訊 為什麼不能用PostMessage傳遞指標資料

1.程序A呼叫CreateFileMapping建立一個記憶體對映檔案。 2.程序A呼叫MapViewOfFile獲取到對映到檔案的記憶體起始地址,呼叫memcpy往記憶體中拷貝資料。 3.程序B呼叫CreateFileMapping開啟程序A建立的記憶體對映檔案。 4.程

程序通訊(IPC)之訊息佇列

★IPC方法包括管道(PIPE)、訊息佇列(Message_Queue)、旗語、共用記憶體(ShareMemory)以及套接字(Socket)。進 程間通訊主要包括了管道、系統IPC(包括了訊息佇列、

Qt 之程序通訊(Windows 訊息

簡述 通過上一節的瞭解,我們可以看出程序通訊的方式很多,今天分享下如何利用Windows訊息機制來進行不同程序間的通訊。 | 效果 傳送訊息 自定義型別與接收窗體 包含所需庫,定義傳送的自定義型別、接收訊息的窗體標題。自定義型別可以處理

Linux---程序通訊IPC之訊息佇列

**程序間通訊(IPC):**是指在不同程序之間傳播或交換資訊。 **IPC的方式:**通常有管道(無名管道、命名管道)、訊息佇列、訊號量、共享儲存、Socket、Streams等(Socket和Streams支援不同主機上的兩個程序IPC) 程序間通訊的目

程序通訊---管道和訊息佇列

程序間通訊的目的:資料傳輸:一個程序需要將它的資料傳送給另一個程序資源共享:對個程序之間共享同樣的資源通知事件:一個程序需要向另一個或一組程序傳送訊息,通知它們發生了什麼事件程序控制:有些程序希望完全控制另一個程序的執行(如:Debug程序)程序間通訊的發展:管道:Syste

C++:程序通訊(部分轉載,個人整理)

/** * 主題:多執行緒和多程序技術 * */ Q1: C++程序間通訊的方式 管道(命名管道,匿名管道),socket,事件event,共享記憶體,訊息佇列 例項:命名管道例項 /** * 方案如下所示 * 管道服務端:CreateNa

ros 工作空間的覆蓋、c++程式設計介面實現通訊方式、定義訊息格式、分散式多機通訊

工作空間的覆蓋 同一個工作空間下,不允許出現同名的功能包,否則無法編譯。不同工作空間下,允許出現同名的功能包,但會出現工作空間覆蓋的現象。 ros工作空間的路徑記錄在ROS_PACKAGE_PATH環境變數中,可以通過env命令檢視計算機中的環境變數,再利用管道過濾出有關

c/c++ linux 程序通訊系列7,使用pthread mutex

linux 程序間通訊系列7,使用pthread mutex #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/shm.h> #include <pthr

c/c++ linux 程序通訊系列4,使用共享記憶體

linux 程序間通訊系列4,使用共享記憶體 1,建立共享記憶體,用到的函式shmget, shmat, shmdt 函式名 功能描述 shmget 建立共享記憶體,返回pic key

c/c++ linux 程序通訊系列3,使用socketpair,pipe

linux 程序間通訊系列3,使用socketpair,pipe 1,使用socketpair,實現程序間通訊,是雙向的。 2,使用pipe,實現程序間通訊 使用pipe關鍵點:fd[0]只能用於接收,fd[1]只能用於傳送,是單向的。 3,使用pipe,用標準輸入往裡寫。 疑問:在

c/c++ linux 程序通訊系列2,使用UNIX_SOCKET

linux 程序間通訊系列2,使用UNIX_SOCKET 1,使用stream,實現程序間通訊 2,使用DGRAM,實現程序間通訊 關鍵點:使用一個臨時的檔案,進行資訊的互傳。 s_un.sun_family = AF_UNIX; strcpy(s_un.sun_path, "

c/c++ linux 程序通訊系列1,使用signal,kill

linux 程序間通訊系列1,使用signal,kill 訊號基本概念:  軟中斷訊號(signal,又簡稱為訊號)用來通知程序發生了非同步事件。程序之間可以互相通過系統呼叫kill傳送軟中斷訊號。核心也可以因為內部事件而給程序傳送訊號,通知程序發生了某個事件。注意,訊號只是用來通知某程序發生了什

C#使用SendMessage實現程序通訊的方法

本文例項講述了C#使用SendMessage實現程序間通訊的方法。分享給大家供大家參考。具體分析如下: 為了深入理解訊息機制,先來做一個測試專案 在新建專案的Form1的程式碼中,加入方法: ?