博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
进程间通信 - 剪贴板
阅读量:5043 次
发布时间:2019-06-12

本文共 2778 字,大约阅读时间需要 9 分钟。

剪贴板定义

剪贴板是由操作系统维护的一块内存区域,这块内存区域不属于任何单独的进程,但是每一个进程又都可以访问这块内存区域,而实质上当在一个进程中复制数据时,就是将数据放到该内存区域中,而当在另一个进程中粘贴数据时,则是从该块内存区域中取出数据。

相关API

剪贴板的打开 – OpenClipboard

BOOL  OpenClipboard(HWND  hWndNewOwner );

hWndNewOwner 指向一个与之关联的窗口句柄,即代表是这个窗口打开剪贴板,如果这个参数设置为 NULL 的话,则以当前的任务或者说是进程来打开剪贴板。如果打开剪贴板成功,则该函数返回非 值,如果其他程序已经打开了剪贴板,那么当前这个程序就无法再打开剪贴板了,所以会致使打开剪贴板失败,从而该函数返回 值。所以如果某个程序已经打开了剪贴板,那么其他应用程序将不能修改剪贴板,直到打开了剪贴板的这个程序调用了 CloseClipboard 函数,并且只有在调用了 EmptyClipboard 函数之后,打开剪贴板的当前窗口才能拥有剪贴板。

                             

剪贴板的清空 - EmptyClipboard

BOOL EmptyClipboard(void);

                              

剪贴板的关闭 - CloseClipboard

BOOL CloseClipboard(void);

                           

数据发送到剪贴板 - SetClipboardData

 HANDLE  SetClipboardData(UINT uFormat,  HANDLE hMem );

第一个参数 uFormat 用来指定要放到剪贴板上的数据的格式,比如常见的有 CF_BITMAP CF_TEXT ,CF_DIB 等等(其他格式可以参考 MSDN)。

第二个参数 hMem 用来指定具有指定格式的数据的句柄,该参数可以是 NULL ,如果该参数为 NULL 则表明直到有程序对剪贴板中的数据进行请求时,该程序(也就是拥有剪贴板所有权的进程)才会将数据复制到剪贴板中,也就是提供指定剪贴板格式的数据,上面提及的就是延迟提交技术

              

剪贴板中数据格式判断 – IsClipboardFormatAvaliable

 BOOL  IsClipboardFormatAvailable( UINT format );

 该函数用来判断剪贴板上的数据格式是否为 format 指定的格式。

             

剪贴板中数据接收 - GetClipboardData

 HANDLE  GetClipboardData( UINT uFormat );

该函数根据 uFormat 指定的格式,返回一个以指定格式存在于剪贴板中的剪贴板对象的句柄。

                         

全局内存分配 – HGLOBAL

剪贴板中的内存从何而来

我们以前在程序中分配内存的时候,都是使用的标准 运行库中的 malloc 或者是 C++ 中的 new 关键字,而使用 malloc 或者 new 有一个问题,那就是,用这个两个东西来分配的内存空间都是在当前进程的私有地址空间上分配内存,很明显,不能使用 malloc 和 new 关键字来分配内存给剪贴板。我们应该要使用另外一个特殊一点的函数来分配内存给剪贴板,要在全局地址空间上分配内存,这样这个函数所分配的内存才能够被所有的进程所共享,这样,剪贴板中的数据就可以被其他的进程所访问了。

GlobalAlloc 函数

GlobalAlloc 函数是从堆上分配指定数目的字节,与其他的内存管理函数相比,全局内存函数的运行速度会稍微慢一些,但是全局函数支持动态数据交换,同时,其分配的内存也不为任何一个进程所私有,而是由操作系统来管理这块内存,所以用在给剪贴板分配内存空间是很适合的。那么这个对象必须是利用 GMEM_MOVEABLE 标识调用 GlobalAlloc 函数为其分配内存的。

HGLOBAL  WINAPI  GlobalAlloc( UINT  uFlags,   SIZE_T  dwBytes );

第一个参数 uFlags 用来指定分配内存的方式。其取值如下列表所示;第二个参数 dwBytes 用来指定分配的字节数。

 

描述 

GHND 

即 GMEM_MOVEABLE 和 GMEM_ZEROINIT 的组合。

GMEM_FIXED 

分配一块固定内存,返回值是一个指针。

GMEM_MOVEABLE 

分配一块可移动内存。

GMEM_ZEROINIT 

初始化内存的内容为 0

GPTR 

即 GMEM_FIXED 和 GMEM_ZEROINIT 的组合。

GlobalReAlloc 函数

 HGLOBAL  WINAPI  GlobalReAlloc(HGLOBAL hMem,  SIZE_T dwBytes,  UINT uFlags);

该函数为再分配函数,即在原有的数据对象 hMem 上,为其扩大内存空间。

第一个参数 hMem 代表由 GlobalAlloc 函数返回的数据对象句柄。

第二个参数 dwBytes 指定需要重新分配的内存的大小。

第三个参数 uFlags 指定分配的方式(可以参考 GlobalAlloc 函数)。

GlobalSize 函数

 SIZE_T  WINAPI  GlobalSize( HGLOBAL  hMem );

该函数用来返回内存块的大小。

第一个参数 hMem 代表由 GlobalAlloc 函数返回的数据对象句柄。

GlobalLock 函数

 LPVOID  WINAPI  GlobalLock( HGLOBAL  hMem );

该函数的作用是对全局内存对象加锁,然后返回该对象内存块第一个字节的指针。

第一个参数 hMem 代表由 GlobalAlloc 函数返回的数据对象句柄。

GlobalUnLock 函数

BOOL  WINAPI  GlobalUnlock( HGLOBAL  hMem );

通过上面的 GlobalLock 函数可以获得这块全局内存的访问权,加锁的意思就是你已经在使用这块全局内存了,别的程序就不能再使用这块全局内存了,而如果你一直不解锁,那也不是个事啊,别的程序将会一直都使用不了这块全局内存,那还叫全局内存干吗啊?所以这个函数就是用来对全局内存对象解锁。

第一个参数 hMem 代表由 GlobalAlloc 函数返回的数据对象句柄。

GlobalFree 函数

HGLOBAL  WINAPI  GlobalFree( HGLOBAL  hMem );

该函数释放全局内存块。

第一个参数 hMem 代表由 GlobalAlloc 函数返回的数据对象句柄。

转载于:https://www.cnblogs.com/zxcode/archive/2011/03/03/1970268.html

你可能感兴趣的文章