[原创]利用WM_COPYDATA实现进程间通信
进程间通信的方法有多种,其中,对于少量数据可以用WM_COPYDATA方便的实现通信(如果对于大量数据的话,由于SendMessage是阻塞的,只有接收方响应了消息,SendMessage才能返回,否则则一直阻塞,所以,对于大量数据来说,用SendMessage就容易造成窗口假死) 。
本例子分别用WM_COPYDATA 实现了两种数据类型的发送,一种为Cstring,另外一种为自定义的结构体Student:
//**********************************************************
#pragma pack(1)
struct Student {
char ID[10];
TCHAR Name[20];
UINT Age;
UINT Grade;
char Room[5];
char Tel[12];
};
#pragma pack()
//**********************************************************
因为需要在接收方的OnCopyData()函数中区分发送的两种不同类型数据。所以就定义了以下两个常量:
#define STRING 1
#define STUDENT 2
发送方:
void CSendDataDlg::OnBtSend() //实现CString类型数据的发送
{
UpdateData(TRUE);
if (m_szData.IsEmpty()) {
m_szData = _T("Hello");
UpdateData(FALSE);
}
// m_szData += '\0';
HWND hWndRcv = ::FindWindow(NULL,"Receiver");
if (hWndRcv == NULL) {
AfxMessageBox(_T("找不到接收窗口,发送不成功"));
return ;
}
COPYDATASTRUCT cpd;
cpd.dwData = STRING; //标志为CString类型
cpd.cbData = m_szData.GetLength() + 1;
//GetLength()只是取得实际字符的长度,没有包括'\0'.
cpd.lpData = (void*)m_szData.GetBuffer(cpd.cbData);
::SendMessage(hWndRcv,WM_COPYDATA,(WPARAM)this->m_hWnd,(LPARAM)&cpd);
m_szData.ReleaseBuffer();
AfxMessageBox(_T("发送成功"));
}
void CSendDataDlg::OnBtStu() //实现Student类型数据的发送
{
UpdateData();
m_szID += '\0';
m_szName += '\0';
m_szRoom += '\0';
m_szTel += '\0';
m_pStu = new Student();
strcpy(m_pStu->ID,m_szID.GetBuffer(m_szID.GetLength()));
_tcscpy(m_pStu->Name,m_szName.GetBuffer(m_szName.GetLength()));
strcpy(m_pStu->Room,m_szRoom.GetBuffer(m_szRoom.GetLength()));
strcpy(m_pStu->Tel,m_szTel.GetBuffer(m_szTel.GetLength()));
m_szID.ReleaseBuffer();m_szName.ReleaseBuffer();
m_szRoom.ReleaseBuffer();m_szTel.ReleaseBuffer();
m_pStu->Age = m_nAge;
m_pStu->Grade = m_nGrade;
HWND hWndRcv = ::FindWindow(NULL,"Receiver");
if (hWndRcv == NULL) {
AfxMessageBox(_T("找不到接收窗口,发送不成功"));
return ;
}
COPYDATASTRUCT cpd;
cpd.dwData = STUDENT; // 标志为Student类型
cpd.cbData = sizeof(Student);
cpd.lpData = (PVOID)m_pStu;
::SendMessage(hWndRcv,WM_COPYDATA,(WPARAM)this->m_hWnd,(LPARAM)&cpd);
delete m_pStu;
AfxMessageBox(_T("发送成功"));
}
接收方:
在OnInitDialog方法中:
//***************************************************************
//初始化ListCtrl控件
LVCOLUMN column;
column.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH;
column.cx = 80;
column.iSubItem = 0;
column.pszText = _T("ID");
m_ListCtl.InsertColumn(0,&column);
column.cx = 80;
column.pszText = _T("Name");
column.iSubItem = 1;
m_ListCtl.InsertColumn(1,&column);
column.cx = 55;
column.pszText = _T("Age");
column.iSubItem = 2;
m_ListCtl.InsertColumn(2,&column);
column.cx = 55;
column.pszText = _T("Grade");
column.iSubItem = 3;
m_ListCtl.InsertColumn(3,&column);
column.cx = 55;
column.pszText = _T("Room");
column.iSubItem = 4;
m_ListCtl.InsertColumn(4,&column);
column.cx = 80;
column.pszText = _T("Tel");
column.iSubItem = 5;
m_ListCtl.InsertColumn(5,&column);
BOOL CReceiverDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
switch (pCopyDataStruct->dwData) { // 接收到的是CString类型
case STRING:
m_szData += (LPCSTR)(pCopyDataStruct->lpData);
UpdateData(FALSE);
break;
case STUDENT: // 接收到的是Student类型
CString id,name,room,tel;
UINT age,grade;
CString str;
Student* pStu = (Student*)(pCopyDataStruct->lpData);
id = pStu->ID;
name = pStu->Name;
room = pStu->Room;
tel = pStu->Tel;
age = pStu->Age;
grade = pStu->Grade;
LVITEM item;
// 把接收到的数据显示到ListCtrl控件上
item.mask = LVIF_TEXT;
int n = m_ListCtl.GetItemCount();
item.iItem = n;
item.iSubItem = 0;
item.pszText = id.GetBuffer(id.GetLength());
id.ReleaseBuffer();
m_ListCtl.InsertItem(&item);
m_ListCtl.SetItemText(n,1,name);
str.Format("%d",age);
m_ListCtl.SetItemText(n,2,str);
str.Format("%d",grade);
m_ListCtl.SetItemText(n,3,str);
m_ListCtl.SetItemText(n,4,room);
m_ListCtl.SetItemText(n,5,tel);
UpdateData(FALSE);
//delete pStu;
break;
}
// return CDialog::OnCopyData(pWnd, pCopyDataStruct);
return TRUE;
}
[原创]利用WM_COPYDATA实现进程间通信相关推荐
- [原创]利用橡皮条技术画图
[原创]利用橡皮条技术画图 在进行有绘制图形功能的软件开发中都会面临橡皮条技术,所谓橡皮条技术就是在绘制过程中出现鼠标移动的记录,当鼠标松开时绘制完整的图形.下面给出一个简单的橡皮条技术的应用,该应用 ...
- 利用管道实现进程间通信
管道通信 匿名管道 创建匿名管道 int pipe(int pipefd[2]); pipefd[0] : 表示读管道 pipefd[1] : 表示写管道 返回 0表示成功,非零表示创建失败. 代码事 ...
- [原创]利用Powerdesinger同步数据库的方法说明
本文主要介绍我在工作过程中如果利用PowerDesinger同步数据库设计PDM和物理数据库保持同步.PowerDesinger以下简称PD.我们经常在数据库生成后,在后续的开发中发现数据设计有遗漏, ...
- [原创] 利用busybox, extlinux 在工控机CompactFlash(CF卡)上构建Linux系统(上)
上篇:CF卡分区, extlinux的安装 中篇:构建根文件系统 下篇:2.6内核剪裁及Busybox编译配置及其分析 硬件平台:研华3355 软件:busybox-1.13.3, extlinux ...
- Linux学习之系统编程篇:利用 shm 进行进程间通信
一.写进程 shm_w.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include ...
- Linux学习之系统编程篇:利用管道进行进程间通信
这里我们先补充一个小知识: 父子进程使用 pipe 进行通信时fork 和 pipe 先后的顺序是先 pipe,后 fork,因为父进程先创建管道,再 fork 创建子进程,这样才能是父子进程共享一块 ...
- matlab绘制烟花,[原创]利用MATLAB燃放烟花(礼花)
function firework % 烟花烟花满天飞 % CopyRight:xiezhh(谢中华) % 2011.6.25 OldHandle = findobj( 'Type', 'figure ...
- android 360加固 例子,[原创]利用VirtualApp实现360加固的soHook简单例子
简单demo,为抛砖引玉吧! 360的加固我们先写一个最简单的so,带导出函数. 这已经足够简单了,界面上打印这个值. 运行起来就这样. 简单的简直过分. 好了,现在我们让360加固一下. 拿下来自己 ...
- [原创]利用DropDownlist来控制Textbox输入数字的精度
function check() { var dot=document.all("dll_Precision_Type").value; ...
最新文章
- virsh 常用操作
- 人脸识别争议再起 实际应用利弊几何?
- 【深度学习的数学】接“2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b
- 【NLP】关于Transformer的常见问题及解答
- 关于颜色值透明度的设置
- 前端学习(667):运算符优先级
- 地灾应急暨地灾危险性评估培训班学习笔记
- 知乎热议:杨辉团队公开否认抄袭,网友:避重就轻仍谎称「首创」
- Debian8 Linux上安装SSH服务器并配置sshd_config文件启用root ssh登录
- android主题资源,使用 Theme Editor 设计应用主题背景
- android view 屏幕外,安卓如何让View往屏幕外隐藏?
- webserver/CGI
- 计算机等级考试网络工程师题库,计算机等级考试4级网络工程师习题库要点
- 使用LIS2DH12三轴加速度传感器检测震动与倾斜角度
- 王牌竞速安装后显示服务器维护,王牌竞速怎么修车 王牌竞速怎么维修车 王牌竞速的车怎么维护...
- MP4转gif得力工具
- java模拟病人就诊过程_模拟医院挂号系统
- 2、Prism的使用一
- Git 从入坑到放不下
- IBM磁盘阵列及文件系统的管理
热门文章
- Ubuntu下安装vim以及常用命令
- ES6 类继承 和 super的使用
- FFmpeg(六) 播放视频之GLSurfaceView显示RGB数据
- 如何在缺乏商业项目经验的前提下成功通过面试,兼说我如何甄别非商业项目经验...
- 【DP】【单调队列】【NOI2005】瑰丽华尔兹
- 话里话外:谁才是流程的主人
- php+fpm+apache
- [转]MFC子线程更改图像数据后更新主窗口图像显示方法
- ubuntu 10.04的git安装和使用
- 基于PHP以及JQUERY AJAX的计算器实例