进程间通信的方法有多种,其中,对于少量数据可以用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实现进程间通信相关推荐

  1. [原创]利用橡皮条技术画图

    [原创]利用橡皮条技术画图 在进行有绘制图形功能的软件开发中都会面临橡皮条技术,所谓橡皮条技术就是在绘制过程中出现鼠标移动的记录,当鼠标松开时绘制完整的图形.下面给出一个简单的橡皮条技术的应用,该应用 ...

  2. 利用管道实现进程间通信

    管道通信 匿名管道 创建匿名管道 int pipe(int pipefd[2]); pipefd[0] : 表示读管道 pipefd[1] : 表示写管道 返回 0表示成功,非零表示创建失败. 代码事 ...

  3. [原创]利用Powerdesinger同步数据库的方法说明

    本文主要介绍我在工作过程中如果利用PowerDesinger同步数据库设计PDM和物理数据库保持同步.PowerDesinger以下简称PD.我们经常在数据库生成后,在后续的开发中发现数据设计有遗漏, ...

  4. [原创] 利用busybox, extlinux 在工控机CompactFlash(CF卡)上构建Linux系统(上)

    上篇:CF卡分区, extlinux的安装 中篇:构建根文件系统 下篇:2.6内核剪裁及Busybox编译配置及其分析 硬件平台:研华3355 软件:busybox-1.13.3, extlinux ...

  5. Linux学习之系统编程篇:利用 shm 进行进程间通信

    一.写进程 shm_w.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include ...

  6. Linux学习之系统编程篇:利用管道进行进程间通信

    这里我们先补充一个小知识: 父子进程使用 pipe 进行通信时fork 和 pipe 先后的顺序是先 pipe,后 fork,因为父进程先创建管道,再 fork 创建子进程,这样才能是父子进程共享一块 ...

  7. matlab绘制烟花,[原创]利用MATLAB燃放烟花(礼花)

    function firework % 烟花烟花满天飞 % CopyRight:xiezhh(谢中华) % 2011.6.25 OldHandle = findobj( 'Type', 'figure ...

  8. android 360加固 例子,[原创]利用VirtualApp实现360加固的soHook简单例子

    简单demo,为抛砖引玉吧! 360的加固我们先写一个最简单的so,带导出函数. 这已经足够简单了,界面上打印这个值. 运行起来就这样. 简单的简直过分. 好了,现在我们让360加固一下. 拿下来自己 ...

  9. [原创]利用DropDownlist来控制Textbox输入数字的精度

     function check()          {           var dot=document.all("dll_Precision_Type").value;   ...

最新文章

  1. virsh 常用操作
  2. 人脸识别争议再起 实际应用利弊几何?
  3. 【深度学习的数学】接“2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b
  4. 【NLP】关于Transformer的常见问题及解答
  5. 关于颜色值透明度的设置
  6. 前端学习(667):运算符优先级
  7. 地灾应急暨地灾危险性评估培训班学习笔记
  8. 知乎热议:杨辉团队公开否认抄袭,网友:避重就轻仍谎称「首创」
  9. Debian8 Linux上安装SSH服务器并配置sshd_config文件启用root ssh登录
  10. android主题资源,使用 Theme Editor 设计应用主题背景
  11. android view 屏幕外,安卓如何让View往屏幕外隐藏?
  12. webserver/CGI
  13. 计算机等级考试网络工程师题库,计算机等级考试4级网络工程师习题库要点
  14. 使用LIS2DH12三轴加速度传感器检测震动与倾斜角度
  15. 王牌竞速安装后显示服务器维护,王牌竞速怎么修车 王牌竞速怎么维修车 王牌竞速的车怎么维护...
  16. MP4转gif得力工具
  17. java模拟病人就诊过程_模拟医院挂号系统
  18. 2、Prism的使用一
  19. Git 从入坑到放不下
  20. IBM磁盘阵列及文件系统的管理

热门文章

  1. Ubuntu下安装vim以及常用命令
  2. ES6 类继承 和 super的使用
  3. FFmpeg(六) 播放视频之GLSurfaceView显示RGB数据
  4. 如何在缺乏商业项目经验的前提下成功通过面试,兼说我如何甄别非商业项目经验...
  5. 【DP】【单调队列】【NOI2005】瑰丽华尔兹
  6. 话里话外:谁才是流程的主人
  7. php+fpm+apache
  8. [转]MFC子线程更改图像数据后更新主窗口图像显示方法
  9. ubuntu 10.04的git安装和使用
  10. 基于PHP以及JQUERY AJAX的计算器实例