- 浏览: 10481 次
最新评论
VC中使用自定义消息在进程间通讯
2011年06月14日
VC中使用自定义消息在进程间通讯
WINDOWS中进程间通讯的方式很多,如:消息机制,共享内存机制,SOCKET,COM,RPC等等,
需要时可以根据具体情况来选择使用的方式。
我在这本文中仅介绍进程间的自定义消息通讯机制。
1,WINDOWS中自定义消息的定义和使用; 在WNDOWS中消息分系统消息和自定义消息。
系统消息定义从0到0x3FF,使用0x400到0x7FFF定义自己的消息。
Windows把0x400定义为WM_USER。如果想定义自己的一个消息,可以在WM_USER上加上
一个值: #define WM_CONTROLPRINT WM_USER+1001
另一种自定义窗口消息的方法是用RegisterWindowsMessage()函数来注册这个消息。
与在WM_USER上加上某个数相比,它的好处是不必考虑所表示的消息标识符是否超出
工程的允许范围。如: const UINT WM_CONTROLPRINT=RegisterWindowMessage("reg_data");
在接收消息的程序中,需要对添加对应消息的响应处理函数,并将消息和消息处理函数关联,
要不它不知道消息发给谁:
//函数定义,在//AFX_MSG中
afx_msg LRESULT OnControlPrint(WPARAM wParam,LPARAM lParam);
//函数实现 LRESULT CSendDlg::OnControlPrint(WPARAM wParam,LPARAM lParam) { }
//关联映射,在BEGIN_MESSAGE_MAP中 ON_MESSAGE(WM_CONTROLPRINT,OnControlPrint)
//使用WM_USER+1001定义的消息 ON_REGISTERED_MESSAGE(WM_CONTROLPRINT,OnControlPri nt)
//使用RegisterWindowMessage定义的消息消 息如何传递呢?我们需要发送消息时,
可以使用PostMessage和SendMessage。这两个消息发送函数不一样的地方就是 SendMessage
发送完消息后会等待消息处理函数处理完成后返回,PostMessage则不等待。所以,可以说
PostMessage是不可靠 的,实际运用中可以根据具体情况来确定用那一个。
这两个函数的具体使用请查看MSDN。 如我向主窗体发送一个消息(
第一个参数是接收消息的窗体句柄,第二个参数是要发送的消息,
后边两个为随消息发送的参数信息):
::SendMessage(AfxGetApp()->GetMainWnd()->m_hWnd,WM_C ONTROLPRINT,NULL,0);
2,使用自定义消息在进程间通讯; 我们可以用VC60建立两个基于对话框的工程,
一个命名为Send,一个命名为Revice。 在Send对话框中添加一个名成为IDC_BUTTONSEND的按钮。
在SendDlg.h和ReviceDlg.g中都添加自定义消息。消息实现进程间通信,需要在
这两个程序中定义或注册相同的消息,才能保证数据通信顺利进行:
#define WM_CONTROLPRINT WM_USER+1001 在Send工程中添加IDC_BUTTONSEND
按钮的单击处理事件,并添加代码:
void CSendDlg::OnButtonsend() {
//获取窗口句柄 CWnd *pWnd=CWnd::FindWindow(NULL,_T("Revice"));
if(pWnd==NULL) { AfxMessageBox("接收程序没有运行!");
return ;
}
//发送消息 pWnd->SendMessage(WM_SENDYKDISABLE,NULL,0); }
在Revice工程中添加WM_CONTROLPRINT 的处理函数,关联映射,和上边描述的过程一样,
在处理函数中添加相应的处理代码。这里就不多说了!
------------------------------------------ 关于进程间互发信息
想一想,在平时的处理程序的时候,我们都是在一个进程中进行处理,所以,在处理字符串
的时候,我们都不用考虑太多的问题,处理什么样的数据和数据的发送都会在同一个
进程中进行。 但是,假如要你负责一个程序要在两个不同的进程中交换数据,
你会怎么办,你要想怎样做,一般的做法是这样,自定义一个消息,然后你就把这个数据
放在这个消息附带的参数WPARAM wParam 与 LPARAM lParam 中,不过这样只能限
于非字符串的传递,只能传递数字,或者你更聪明一点,把字符编码,然后在另一个
进程中解码,这样可以做成伪字符的数据传递。 不过,这样的方法都不错!
我在开始的时候,使用了字符地址作为消息参数进行传递,可是由于进程间都是独立的4GB
内存空间,当接到我的字符消息的时候,就程序就误以为是自已的进程空间的地址,所以
就把读取了这个地址,一般结果来看,不是乱码就是空字符串。 那么我们有什么方法可
以在消息中进行字符串的传递呢? 我们可以使用两个Windows的消息分别进行一个字符
串的两个进程间的传递, 一个消息是WM_SETTEXT。 一个消息是WM_COPYDATA。 以下我
来分析这两个消息怎么实现, 最简单的是使用WM_SETTEXT的消息了,这个方法只是使用
一个字符串的地址作为一个消息参数就可以实现了两个不同进程间的消息的互发了。
原因是因为这个消息会为这个字符串分配一个内存空间,在接收方就可以根据这个地址
把这个字符串读取保存了 CString str = _T( "Hello" );
HWND hWndReceived = FindWindow( "Receiver", NULL );
SendMessage( hWndReceived, WM_SETTEXT, 0, (LPARAM) str );
在接收方这样处理消息: 加入消息映射宏:
BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
//{{AFX_MSG_MAP(CMyWnd)...
ON_MESSAGE( WM_SETTEXT, OnSetTextMsg )
...//}}
AFX_MSG_MAPEND_MESSAGE_MAP()
... 加入消息映射函数:
afx_msg void OnSetTextMsg( WPARAM wParam, LPARAM lParam)
OnSetTextMsg( WPARAM wParam, LPARAM lParam )
{
char str[ 256 ];
wsprintf( str, "%s", (char*) lParam
); // 加入处理这个字符串的语句 .....}
使用WM_COPYDATA:CString str = _T( "Hello" );
HWND hWndReceived = FindWindow( "Receiver", NULL );
COPYDATASTRUCT cpd;
cpd.dwData = 0;
cpd.cbData = strDataToSend.GetLength();
cpd.lpData = (void*)str.GetBuffer(cpd.cbData);
SendMessage( hWndReceived, WM_COPYDATA, 0, (LPARAM) & cpd );
str.ReleaseBuffer();
加入映射宏: B
EGIN_MESSAGE_MAP(CMyWnd, CWnd)
//{{AFX_MSG_MAP(CMyWnd) ...
ON_WM_COPYDATA()
... //}}
AFX_MSG_MAP END_MESSAGE_MAP() ...
映射函数:
BOOL CMyWnd::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
CString strRecievedText = (LPCSTR) (pCopyDataStruct->lpData);
return CMyWnd::OnCopyData(pWnd, pCopyDataStruct);
}
这样就可以实现了不同进程间两个字符串之间的互发! 结束语: 这只是一些简单的方法,对这些感兴趣的或需要源代码的朋友,可以跟我联系。
发表评论
-
Jabberd2源代码分析:c2s与router SASL验证过程
2012-01-20 09:19 690Jabberd2源代码分析:c2s与router SASL验证 ... -
重叠IO 通信模型,函数记录。
2012-01-20 09:19 769重叠IO 通信模型,函数记录。 2010年12月07日 ... -
apache2 安装与配置
2012-01-20 09:19 900apache2 安装与配置 2010年11月09日 v0 ... -
Heritrix源码分析(二) 配置文件order.xml介绍
2012-01-20 09:19 733Heritrix源码分析(二) 配 ... -
2011,感恩年
2012-01-19 14:20 4922011,感恩年 2012年01月14 ... -
快乐并成长着的2011年
2012-01-19 14:19 507快乐并成长着的2011年 2 ... -
写给河南新精疯狂英语班同学们的一封信
2012-01-19 14:19 608写给河南新精疯狂英语班同学们的一封信 2012年01月05日 ... -
2011年度优秀员工获奖感想
2012-01-19 14:19 5602011年度优秀员工获奖感 ... -
晒晒孩子们的作文(一)
2012-01-19 14:19 547晒晒孩子们的作文(一) ... -
和老外对训练理念的交流,中英文,翻译好了
2012-01-17 04:09 792和老外对训练理念的交流,中英文,翻译好了 2011年08月2 ... -
为单位的
2012-01-17 04:09 302为单位的 2011年08月23日 这人写了一篇文章,已经 ... -
口袋英语5
2012-01-17 04:09 656口袋英语5 2011年06月26 ... -
jhhg
2012-01-16 02:57 634jhhg 2009年07月06日 > 24) &a ... -
最新qq空间软件,软件下载-----わ 。
2012-01-16 02:57 566最新qq空间软件,软件下载-----わ 。 2009年08月 ... -
FLEX
2012-01-16 02:57 467FLEX 2009年12月04日 ... -
QQ 空间软件制作大全
2012-01-16 02:57 356QQ 空间软件制作大全 2010年05月31日 ★★★★ ... -
as学习经验之谈
2012-01-16 02:57 422as学习经验之谈 2009年11 ...
相关推荐
在这个“VC+C# 实现的进程间通讯”项目中,开发者使用了两种常见的IPC方法:共享内存和消息传递。接下来,我们将详细讨论这两种方法以及如何在VC6.0和C#2010环境下实现它们。 共享内存是一种高效的IPC机制,因为它...
在VC++环境中,进程间通信(IPC,Inter-Process Communication)是实现多个独立运行的程序交换数据的关键技术。本文将详细解析十一种不同的VC++进程间通信方法。 1. **剪贴板(Clipboard)**:在早期的16位系统中,...
为了接收自定义消息,需要在消息映射表中声明这个消息,并在消息处理函数中进行处理。 例如,发送端可能发送一个消息携带数据,如字符串或整数,接收端接收到消息后,可以从消息参数中提取这些数据,然后显示或者...
05_ProcessMsg 用消息在进程间通讯。 06_MappingFile 用内存映射文件在进程间通讯。 07_ProcessList 枚举并得到系统中所有进程信息。 第10章(\ Chapter10) 示例描述:本章学习Windows线程的创建和管理...
在VC中,可以利用Windows API函数,如CreateFile、ReadFile和WriteFile等,配合命名管道或邮件槽实现进程间的通信。 3. **IE网络编程**:与Internet Explorer(IE)集成的网络编程通常涉及ActiveX控件和BHO...
"进程间通讯和数据.doc"涵盖了进程间通信(IPC)的概念和技术,包括管道、共享内存、消息队列等,这些是构建分布式或协作式应用的基础。 【显示与打印】 "用IPicture显示图片.doc"可能介绍了如何使用IPicture接口...
例如,飞鸽可能使用管道、消息队列或者共享内存来实现在不同进程间的数据交换。这需要开发者理解Windows下的各种IPC机制,并能合理选择和应用。 此外,飞鸽的用户界面(GUI)通常由Windows控件和消息机制构建。...
在IT领域,尤其是在软件开发中,C#是一种广泛使用的编程语言,尤其在Windows应用程序和.NET框架下。"C#多进程浏览器-仿Chrome浏览器"是一个项目,它旨在模仿Google Chrome浏览器的设计理念,利用C#来实现一个支持多...
在实现共享内存时,文档指出C++语言中使用了CreateFileMapping函数来创建共享内存区域,然后使用MapViewOfFile函数将这个区域映射到调用程序的地址空间。之后,进程可以像操作普通内存一样直接读写共享内存区域中的...
"VC Winsocket网络聊天程序"是利用Microsoft Visual C++(简称VC)编程环境,结合Winsocket库开发的一款实时通讯应用,主要适用于局域网或互联网上的用户间进行文本、文件等数据的交换。 一、Winsocket基础知识 1....
这可能涉及到进程间通信(IPC)技术,如共享内存、命名管道或Windows消息机制。 实现该功能的具体步骤可能包括: 1. **创建VC6项目**:建立一个MFC应用程序,选择适当的工程模板,如对话框应用程序。 2. **集成MSN ...
数据库通讯中的钩子技术是一种监控和拦截特定系统事件或用户操作的方法...通过熟练掌握上述知识点,开发者可以在数据库通讯中实现更高效、可控的数据监控和管理,同时在VB和VC环境下利用ADO技术轻松地进行数据库操作。
4. **Socket编程**:Socket是网络通信的基础,它提供了进程间通信的能力。在这个项目中,服务端可能通过监听特定端口等待客户端的连接,客户端则通过建立连接向服务端发送和接收消息。 5. **数据序列化与反序列化**...
在IT领域,局域网聊天工具通常用于在同一网络内的设备间实现即时通讯,不依赖于互联网,确保数据传输的安全性和速度。 描述中的“api”是指应用程序编程接口,它是一系列预先定义的函数或方法,开发者可以使用这些...
在IT行业中,"VC 工业组态程序开发"是一个重要的专题,主要涉及到使用Microsoft Visual C++(简称VC)作为开发工具,进行工业自动化系统的图形化界面设计与编程。组态程序开发通常是为了实现对工业设备和生产过程的...
具体而言,本方法在硬件通讯线路设计上,采用RS-485总线传输方式,以适应分布式异构系统中各子系统位置分散、通讯硬件相异的特性。而在软件设计层面,该方法具备以下几大优势: 1. **数据库读取与集成**:利用VC_...
此外,由于进程间通讯(IPC)的灵活性,可以设计各种自定义的调用方案,如命名管道、事件、套接字等。 对于C#调用VC++生成的非托管DLL,情况相对简单,因为非托管DLL可以直接被任何支持DLL导入的语言调用。但是,当...
12.2 进程间通讯 12.2.1 剪贴板通讯方式 12.2.2 邮槽通讯方式 12.2.3 管道通讯方式 12.2.3.1 命名管道通讯 12.2.3.2 匿名管道通讯 第14 章 ActiveX 技术 14.1 ActiveX 简介 14.2 ActiveX 控件和普通Windows ...
内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...