- 浏览: 10025 次
最新评论
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 663Jabberd2源代码分析:c2s与router SASL验证 ... -
重叠IO 通信模型,函数记录。
2012-01-20 09:19 747重叠IO 通信模型,函数记录。 2010年12月07日 ... -
apache2 安装与配置
2012-01-20 09:19 808apache2 安装与配置 2010年11月09日 v0 ... -
Heritrix源码分析(二) 配置文件order.xml介绍
2012-01-20 09:19 713Heritrix源码分析(二) 配 ... -
2011,感恩年
2012-01-19 14:20 4782011,感恩年 2012年01月14 ... -
快乐并成长着的2011年
2012-01-19 14:19 484快乐并成长着的2011年 2 ... -
写给河南新精疯狂英语班同学们的一封信
2012-01-19 14:19 587写给河南新精疯狂英语班同学们的一封信 2012年01月05日 ... -
2011年度优秀员工获奖感想
2012-01-19 14:19 5402011年度优秀员工获奖感 ... -
晒晒孩子们的作文(一)
2012-01-19 14:19 527晒晒孩子们的作文(一) ... -
和老外对训练理念的交流,中英文,翻译好了
2012-01-17 04:09 765和老外对训练理念的交流,中英文,翻译好了 2011年08月2 ... -
为单位的
2012-01-17 04:09 288为单位的 2011年08月23日 这人写了一篇文章,已经 ... -
口袋英语5
2012-01-17 04:09 627口袋英语5 2011年06月26 ... -
jhhg
2012-01-16 02:57 610jhhg 2009年07月06日 > 24) &a ... -
最新qq空间软件,软件下载-----わ 。
2012-01-16 02:57 546最新qq空间软件,软件下载-----わ 。 2009年08月 ... -
FLEX
2012-01-16 02:57 456FLEX 2009年12月04日 ... -
QQ 空间软件制作大全
2012-01-16 02:57 328QQ 空间软件制作大全 2010年05月31日 ★★★★ ... -
as学习经验之谈
2012-01-16 02:57 408as学习经验之谈 2009年11 ...
相关推荐
阐述了VC中实现自定义消息,以及消息的封装、传递机制
VC/MFC发送自定义消息Demo,源码对应的博客链接为:http://blog.csdn.net/d704791892/article/details/22829133
在VC中实现不通窗体或者不通类之间的自定义消息的传递
VC 消息映射与处理\创建和使用自定义消息
VC中添加响应自定义的消息的代码步骤,简单四步搞定
在VC项目中使用自定义资源 的 Code
接收自定义进程消息 进程间消息 线程程间消息
VC6.0 C#2010 实现进程通讯,使用了共享内存(CreateFileMapping)和消息方式,Process1和Process2是VC6.0 Process3是C#程序。
VC 6.0通过消息机制实现进程间的通信,这个实例写了两个子程序,一个是发送消息端,一个是接收消息端,接收端主要是接收其他进程向该窗口发送的消息,发送消息端获取目的窗口对象,向窗口“MYRECEIVER”发送自定义...
VC 6.0 消息处理和自定义消息对话框用法,通过重载函数OnCmdMsg从而使不能够处理主框架命令的非模式对话框,具备了响应主框架命令的功能。二是说明自定义消息的用法。重载OnCmdMsg后,改变的窗口标题,自定义消息...
自定义消息,VC里面 自定义消息的实现,已经运行调式成功
自定义消息 更多内容见:vcshare.net和http://www.hedanwang.cn/bbs/
VC自定义消息进行线程间的通信,主线程中创建另一个线程时行数字累加或计算,把结果返回给主线程
详细介绍了MFC中怎样使用sendmessage自定义消息函数
一个对话框自定义消息,用来接收另一个对话框的消息。在vs2008下编译执行通过.
使用DDE动态数据交互方式实现进程间通讯,完整的代码工程,简单明了
本示例是模拟自定义消息。仅供学习与交流。
VC2010使用自定义树列表视图控件示例代码,自己写的,有待完善。
从零开始学VC系列教程五.消息机制与自定义消息.rar 一个系列感觉不错,简单易懂 特此推荐
mfc中自定义消息的实现,在vs2005环境下