中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 系统
关于进程间互发信息
作者:未知 时间:2005-07-20 14:20 出处:VC知识库 责编:chinaitpower
              摘要:关于进程间互发信息

关于进程间互发信息

作者:赖锋

  想一想,在平时的处理程序的时候,我们都是在一个进程中进行处理,所以,在处理字符串的时候,我们都不用考虑太多的问题,处理什么样的数据和数据的发送都会在同一个进程中进行。
  但是,假如要你负责一个程序要在两个不同的进程中交换数据,你会怎么办,你要想怎样做,一般的做法是这样,自定义一个消息,然后你就把这个数据放在这个消息附带的参数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_MAP
END_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();

加入映射宏:

BEGIN_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);
}

这样就可以实现了不同进程间两个字符串之间的互发!

结束语:

这只是一些简单的方法,对这些感兴趣的或需要源代码的朋友,可以跟我联系。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有