VC++ 中WM_COPYDATA 怎么样应用来实现两个进程间的数据传输 VC++ 2010-03-22 16:05:19 阅读23 评论0 字号:大中小 本文着重讲述了如果用WM_COPYDATA 消息来实现两个进程之间传递数据. 进程之间通讯的几种方法: 在Windows 程序中,各个进程之间常常需要交换数据,进行数据通讯。常用的方法有 使用内存映射文件 通过共享内存 DLL 共享内存 使用SendMessage 向另一进程发送 WM_COPYDATA 消息 比起前两种的复杂实现来,WM_COPYDATA 消息无疑是一种经济实惠的一中方法. WM_COPYDATA 消息的主要目的是允许在进程间传递只读数据。Windows 在通过 WM_COPYDATA 消息传递期间,不提供继承同步方式。SDK 文档推荐用户使用SendMessage 函数,接受方在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据: 这个函数的原型及其要用到的结构如下: SendMessage(hwnd,WM_COPYDATA,w Param,lParam); 其中,WM_COPYDATA 对应的十六进制数为 0x004A w Param 设置为包含数据的窗口的句柄。lParam 指向一个COPYDATASTRUCT 的结构: typedef struct tagCOPYDATASTRUCT{ DWORD dw Data;//用户定义数据 DWORD cbData;//数据大小 PVOID lpData;//指向数据的指针 }COPYDATASTRUCT; 该结构用来定义用户数据。 具体过程如下: 首先,在发送方,用FindWindow 找到接受方的句柄,然后向接受方发送 WM_COPYDATA 消息. 接受方在DefWndProc 事件中,来处理这条消息.由于中文编码是两个字节,所以传递中文时候字节长度要搞清楚. 代码中有适量的解释,大家请自己看吧. 用WM_COPYDATA 的前提: 1,知道接收消息进程的句柄。 2,接收消息进程重载了WM_COPYDATA 消息映射,能对其做出反应(否则不是发送端自作多情了?) 看过前提,的出结论:在自己写的两个进程间用WM_COPYDATA 再好不过。 下面 CODE 几行就说明了一切。 获得句柄的方法,最简单的方法就是使用FindWindow,找窗口类,或者名,如果你觉得这样不把握,那就利用SetProp个窗口做个记号....(不说这些,跑踢儿了都) OK,开始写发送端代码: HWND hWnd = FindWindow(NULL,"MyApp"); if(hWnd!=NULL) { COPYDATASTRUCT cpd; /*给 COPYDATASTRUCT 结构赋值*/ cpd.dw Data = 0; cpd.cbData = strlen("字符串"); cpd.lpData = (void*)"字符串"; ::SendMessage(hWnd,WM_COPYDATANULL,(LPARAM)&cpd);//发送! /*完事儿了!!*/ } 接...