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
- 自定义消息实现进程间的通信
- C++进程间通信---自定义消息
- linux C-(进程间通信 消息队列)
- MFC使用SendMessage()发送自定义消息实现进程间通信
- MFC使用SendMessage()发送自定义消息实现进程间通信
- MFC使用SendMessage()发送自定义消息实现进程间通信
- MFC使用SendMessage()发送自定义消息实现进程间通信
- MFC使用SendMessage发送自定义消息实现进程间通信
- MFC使用SendMessage()发送自定义消息实现进程间通信
- linux进程间的通信(C): 消息队列
- Linux C消息队列实现进程间通信
- 进程间消息队列通信
- 进程间通信:消息队列
- 进程间通信--消息队列
- 进程间通信-消息队列
- 进程间通信-消息队列
- 进程间通信----消息队列
- 进程间通信-消息队列
- 第三十七讲项目4.2——大奖赛计分多人版
- PHP面向对象编程 面向对象的基本实践
- MySQL与MariaDB概述 (一)
- scp命令的使用
- nodejs小记--socketID
- C++进程间通信---自定义消息
- HTML总结
- 腾讯云主机mysql初始密码更改解决方案
- web页面长按复制文本clipboard.js 使用教程
- Iterator模式
- PIL 安装与配置
- 深入探索并发编程之内存屏障:资源控制操作
- android静态安全检测_四大组件activity
- FastReport 打印和导出 Excel、Word 等