1. 概述
1.1 介绍
剪贴板(Clipped Board)实质是Win32 API中一组用来传输数据的函数和消息,为Windows应用程序之间进行数据共享提供了一个中介,Windows已建立的剪切(复制)-粘贴的机制为不同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制操作时,应用程序把选取的数据用一种或多种格式放在剪贴板上。然后任何其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择适合自己的格式。
这也就是剪贴板是由操作系统维护的一块内存区域,这块内存区域不属于任何单独的进程,但是每一个进程又都可以访问这块内存区域,而实质上当在一个进程中复制数据时,就是将数据放到该内存区域中,而当在另一个进程中粘贴数据时,则是从该块内存区域中取出数据。
剪贴板是一个非常松散的交换媒介,可以支持任何数据格式,每一格式由一无符号整数标识,对标准(预定义)剪贴板格式,该值是Win32 API定义的常量;对非标准格式可以使用Register Clipboard Format函数注册为新的剪贴板格式。利用剪贴板进行交换的数据只需在数据格式上一致或都可以转化为某种格式就行。但剪贴板只能在基于Windows的程序中使用,不能在网络上使用。
1.2 剪贴板操作API
要想在剪贴板中写入数据就需要在全局的内存空间中去分配空间,至于为甚不用常用的new、malloc函数原因是:
使用 malloc 或者 new 有一个问题,那就是,用这个两个东西来分配的内存空间都是在当前进程的私有地址空间上分配内存,也就是它们两个东东所分配的内存空间为进程私有地址空间所有,并不为所有进程所共享,而且任何进程之间都是不能访问对方的私有地址空间的,你把剪贴板中的内存分配到了你当前进程的私有地址空间上,而其他进程又不能访问你这个进程的私有地址空间,因而就不能访问到数据了。
至于进程访问这些内存空间的效率的话是new和malloc效率更高一些,这是因为
(1)malloc 或者 new 分配的内存,是在进程的私有地址空间,所以与进程隔得很近,程序要过去拿数据效率很高
(2)而 GlobalAlloc 函数分配的内存是在全局的内存空间中的,进程需要访问这些内存就需要经过内存映射之类的操作,因而和进程隔得很远,程序要过去拿数据效率就相对较低
1. 全局分配内存,使用GlobalAlloc()函数,它的函数原型为
HGLOBAL WINAPI GlobalAlloc(
_In_ UINT uFlags,
_In_ SIZE_T dwBytes
);
分配全局内存,这块内存的管理相对new和malloc函数得到的内存耗时,原因在前面已经做介绍。
参数 uFlags
用来指定分配内存的方式,它可取下面的一些参数
GHND
即 GMEM_M