资源描述:
《利用sendmessage实现c_进程间通信》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、进程之间通讯的几种方法:在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯。常用的方法有使用内存映射文件通过共享内存DLL共享内存使用SendMessage向另一进程发送WM_COPYDATA消息比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一中方法.(ZT)WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。Windows在通过WM_COPYDATA消息传递期间,不提供继承同步方式。SDK文档推荐用户使用SendMessage函数,接受方在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据:这个函数的原型及其要用到的结
2、构如下:SendMessage(hwnd,WM_COPYDATA,wParam,lParam);其中,WM_COPYDATA对应的十六进制数为0x004AwParam设置为包含数据的窗口的句柄。lParam指向一个COPYDATASTRUCT的结构:typedefstructtagCOPYDATASTRUCT{DWORDdwData;//用户定义数据DWORDcbData;//数据大小PVOIDlpData;//指向数据的指针}COPYDATASTRUCT;该结构用来定义用户数据。具体过程如下:首先,在发送方,用FindWindow找到接受方的句柄,然后向接受方发送WM_CO
3、PYDATA消息.接受方在DefWndProc事件中,来处理这条消息.由于中文编码是两个字节,所以传递中文时候字节长度要搞清楚.体代码如下://---------------------------------------------------//发送方:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.
4、Forms;usingSystem.Runtime.InteropServices;namespaceWindowsFormsApplication1{publicpartialclassForm1:Form{constintWM_COPYDATA=0x004A;publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){}[DllImport("User32.dll",EntryPoint="SendMessage")]privatestaticexternintSe
5、ndMessage(inthWnd,//handletodestinationwindowintMsg,//messageintwParam,//firstmessageparameterrefCOPYDATASTRUCTlParam//secondmessageparameter);[DllImport("User32.dll",EntryPoint="FindWindow")]privatestaticexternintFindWindow(stringlpClassName,stringlpWindowName);privatevoidbutton1_Click(obj
6、ectsender,EventArgse){intWINDOW_HANDLER=FindWindow(null,@"欲发送程序窗口的标题");if(WINDOW_HANDLER!=0){byte[]sarr=System.Text.Encoding.Default.GetBytes(this.textBox1.Text);intlen=sarr.Length;COPYDATASTRUCTcds;cds.dwData=(IntPtr)100;cds.lpData=this.textBox1.Text;cds.cbData=len+1;SendMessage(WINDOW_HAN
7、DLER,WM_COPYDATA,0,refcds);}}}publicstructCOPYDATASTRUCT{publicIntPtrdwData;publicintcbData;[MarshalAs(UnmanagedType.LPStr)]publicstringlpData;}}//---------------------------------------------------//接受方//-------------------------------------------------