剪贴板通信实例

本人节选自《21天学通VC++》一书

为了更好地理解以上讲述的函数,下面给出一个实例来详细地介绍如何使用剪贴板来实现进程间的通信。
【范例17-3】剪贴板实现进程通信。
  新建一个MFC的基于对话框的应用程序。单击【File】|【New】菜单项,打开新建对话框。选择建立【MFC AppWizard[exe]】工程,为工程命名为“进程通信”。在AppWizard的第一步中选择【Dialog based】。其他步骤按照默认设置,单击【Finish】按钮完成创建。
  设计对话框。将对话框上的原有控件全部删除。添加两个文本框,一个让用户输入数据,ID号为IDC_EDIT_SEND;另一个是复制数据后用来显示数据的,ID号为IDC_EDIT_RECV。再添加两个按钮控件,一个名为“复制”,ID号为IDC_BTN_COPY;另一个名为“粘贴”,ID号设为IDC_BTN_PASTE。对话框设计结果。
  添加消息响应函数。双击对话框上的两个按钮,分别将两个按钮的OnBtnCopy和OnBtnPaste函数添加到类CMyDlg中。
提示:添加消息响应函数在MFC ClassWizard工具中,选中对应的按钮控件后,添加其COMMAND消息函数即可。
示例代码17-3
01    void CMyDlg::OnBtnCopy()                            //复制按钮
02    {
03        // TODO: Add your control notification handler code here
04        CString str;
05        //定义字符型变量用来保存用户输入的数据
06        GetDlgItemText(IDC_EDIT_SEND,str);
07        HGLOBAL hClip;
08        //定义一个HGLOBAL句柄变量用来指向分配的内存块
09        if (OpenClipboard())
10        {
11            EmptyClipboard();                            //将剪贴板内容清空
12            hClip=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);
13            //在堆上分配可移动的内存块,程序返回一个内存句柄
14            char * buff;                                 //定义指向字符型的指针变量
15            buff=(char*)GlobalLock(hClip);
16            //对分配的内存块进行加锁,将内存块句柄转化成一个指针,并将相应的引用计数器加1
17            strcpy(buff,str);
18            //将用户输入的数据复制到指针变量中,实际上就是复制到分配的内存块中
19            GlobalUnlock(hClip);
20            //数据写入完毕,进行解锁操作,并将引用计数器数字减1
21            SetClipboardData(CF_TEXT,hClip);
22            //将存放有数据的内存块放入剪贴板的资源管理中
23            CloseClipboard();
24            //关闭剪贴板,释放剪贴板资源的占用权
25            MessageBox("已将数据存入剪贴板");
26        }
27    }
28    void CMyDlg::OnBtnPaste()                            //粘贴按钮
29    {
30        // TODO: Add your control notification handler code here
31        CString str;
32        //字符型变量保存由剪贴板复制下来的数据
33        HANDLE hClip;
34        //定义HANDLE句柄型变量用来指向GetClipboardData函数返回的句柄
35        if (OpenClipboard())
36        {
37            hClip=GetClipboardData(CF_TEXT);
38            //从剪贴板中取出一个内存的句柄
39            char* buff;
40            //定义字符型指针变量用来保存内存块中的数据
41            buff=(char*)GlobalLock(hClip);
42            //对内存块进行加锁,将内存句柄值转化为一个指针,并将内存块的引用计数器加一,内存                //中的数据也返回到指针型变量中
43            str=buff;
44            //将数据保存到字符型变量中
45            GlobalUnlock(hClip);
46            //将内存块的引用计数器减一
47            CloseClipboard();
48            //关闭剪贴板,释放剪贴板资源的占用权
49            SetDlgItemText(IDC_EDIT_RECV,str);
50        }
51    }
【运行结果】在Visual C++ 6.0中编译后无错误,使用快捷键【Ctrl+F5】运行该工程。在左边的编辑框中输入字符串“21天学会Visual C++”。单击【复制】按钮,该字符串就存放到剪贴板中了。
说明:上述代码中用到了剪贴板的操作函数,此外,还应用到了字符串赋值函数strcpy(),用于将输入字符串复制到内存中。
在上图中单击【复制】按钮后,单击【粘贴】按钮。将存储在剪贴板中的字符串取出并显示在右边的编辑框中,如图17-18所示。
 
图17-18  【粘贴】按钮运行结果
【代码解析】从以上代码中可以看出,不管是把内存块放到剪贴板资源管理中,还是从剪贴板中取出内存块,都要经过加锁和解锁的过程。这是为了方便句柄型变量和字符型指针变量的转换,实现数据的写入和读取。上述代码中,【复制】按钮和【粘贴】按钮的执行流程如图17-19和图17-20所示。
至此,一个通过剪贴板实现进程通信的实例就完成了。事实上,本例中实现的功能不用剪贴板也一样能够很简单的完成。此处只是为了演示剪贴板的用法。

vc++之剪贴板通信实例相关推荐

  1. 笔记2:VC++ socket通信实例

    VC++ socket通信实例 网络中进程之间如何通信   首要解决的问题是如何唯一标识一个进程,在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们 ...

  2. c语言管道通信实例,C语言辅导:VC命名管道通信的实现

    无论是SQL Server的用户,还是PB的用户,作为C/S结构开发环境,他们在网络通信的实现上,都有一种共同的方法--命名管道.由于当前操作系统的不惟一性,各个系统都有其独自的通信协议,导致了不同系 ...

  3. 用VC开发串口通信dll控件

    VC串口通信技术网<VC串口上位机编程方法简介>介绍了串口编程的常见方法,其中就有使用串口dll控件的方法,dll是一种动态链接库,使用起来非常方便. 本文利用VC编程工具,对Window ...

  4. android socket通信如何抓取,安卓Socket通信实例(客户端、服务端)

    安卓Socket通信实例 本文摘自:https://whatsblog.icu/index.php/Android/17.html 1.Socket通信必须知道的地方 1.首先,Socket通信采用T ...

  5. [python学习] 专题七.网络编程之套接字Socket、TCP和UDP通信实例

    很早以前研究过C#和C++的网络通信,参考我的文章:                  C#网络编程之Tcp实现客户端和服务器聊天                 C#网络编程之套接字编程基础知识   ...

  6. Android串口通信实例分析【附源码】

    Android 串口通信实例分析,用的时开源的android-serialport-api 这个是用android ndk实现的串口通信,我把他做了一个简化,适合于一般的程序的串口通信移植,欢迎拍砖- ...

  7. java socket发送定长报文_一个基于TCP协议的Socket通信实例

    原标题:一个基于TCP协议的Socket通信实例 1. 前言 一般接口对接多以http/https或webservice的方式,socket方式的对接比较少并且会有一些难度.正好前段时间完成了一个so ...

  8. Java 网络实例三(获取URL响应头的日期信息、获取URL响应头信息、解析URL、ServerSocket和Socket通信实例)

    获取 URL响应头的日期信息 以下实例演示了如何使用 HttpURLConnection 的 httpCon.getDate() 方法来获取 URL响应头的日期信息: import java.net. ...

  9. qt android 网络编程实例,QT网络编程Tcp下C/S架构的即时通信实例

    先写一个客户端,实现简单的,能加入聊天,以及加入服务器的界面. #ifndef TCPCLIENT_H #define TCPCLIENT_H #include #include #include # ...

  10. Java Socket 通信实例 - 转载

    基于Tcp协议的简单Socket通信实例(JAVA) 好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络 ...

最新文章

  1. Think Pad T410键盘溅水有惊无险
  2. 深度学习未来十大趋势
  3. 服务器高并发时请求报错_基于redis的分布式锁防止高并发重复请求
  4. java channelexec_java-使用SSH exec通道调用Shell脚本,但忽略对其他Shell脚本的调用
  5. Oracle 10g数据库基础之基本查询语句-中-函数
  6. MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(二)
  7. dynamic和匿名对象
  8. 常用的数据交换格式有哪些_高程数据格式介绍
  9. 团队作业-第二周-测试计划
  10. 前端学习(542):node得环境搭建
  11. 2013汇总计算 广联达gcl_广联达图形算量GCL2013整体操作流程图文教程详解
  12. 一、Linux基础知识
  13. 二进制差分码规则_二进制 你不知道的事
  14. 拓端tecdat|R语言使用HAR-RV预测实际波动率Realized Volatility案例
  15. 数学建模学习:灰色关联分析
  16. C语言学习——if语句
  17. 01_配置yum源-银河麒麟V10(Kylin Linux Advanced Server V10 (Tercel))操作系统
  18. Linux文件夹的介绍
  19. Bitmap createBitmap()裁剪图片
  20. 英语文本处理工具库——spaCy

热门文章

  1. 20155337 《网络对抗》 Exp2 后门原理与实践
  2. iBATIS使用$和#的一些理解
  3. 分享小记:指数族分布
  4. # 20162312 2017-2018 《程序设计与数据结构》第7周学习总结
  5. MongoDB笔记(一):MongoDB介绍及Windows下安装
  6. 软件测试(分类,方法,工具)
  7. vue 内存溢出问题解决
  8. Codeforces 758F Geometrical Progression
  9. mac下的mysql报错:ERROR 1045(28000)和ERROR 2002 (HY000)的解决办法
  10. js 对url进行编码和解码的三种方式