当一个提供数据的进程创建了剪贴板数据之后,直到其他进程获取剪贴板数据之前,这些数据都要占据内存空间。如果在剪贴板上放置的数据过大,就会浪费内存空间,降低对资源的利用率。为了避免这种浪费,就可以采取延迟提交技术,也就是由数据提供进程先提供一个指定格式的空剪贴板数据快,即把SetClipboardData函数的hMem参数设置为NULL。当需要获取数据的进程想要从剪贴板上得到数据时,操作系统会向数据提供进程发送WM_RENDERFORMAT消息,而数据提供进程可以响应这个消息,并在此消息的响应函数中,再一次调用SetClipboardData函数,将实际的数据放到剪贴板上。当再次调用SetClipboardData函数时,就不再需要调用OpenClipboard函数,也不再需要调用EmptyClipboard函数。
也就是说,为了提高资源利用率,避免浪费内存空间,可以采取延迟提交技术。第一次调用SetClipboardData函数时,将其hMem参数设置为NULL,在剪贴板上以指定的剪贴板格式放置一个空剪贴板数据块。然后直到有其他进程需要数据或者自身进程需要终止运行时再次调用SetClipboardData函数,这时才真正提交数据。
PS:
SetClipboardData函数的原型声明如下:HANDLE SetClipboardData(UINT uFormat, HANDLE hMem); 实现以指定的剪贴板格式向剪贴板上放置数据。uFormat指定剪贴板格式,这个格式可以是已注册的格式,或者是任何一种标准的剪贴板格式(可自行查看MSDN中的相关信息)。hMem为具有指定格式的数据的句柄,可以为NULL,指示调用窗口直到有对剪贴板数据的请求时,才指定剪贴板格式的数据;如果窗口采用延迟提交技术,则该窗口必须处理WM_RENDERFORMAT和WM_RENDERALLFROMATS消息。
OpenClipboard函数的原型声明如下:BOOL OpenClipboard( ); 实现打开剪贴板的功能。
EmptyClipboard函数将清空剪贴板,并释放剪贴板中数据的句柄,然后将剪贴板的所有权分配给当前打开剪贴板的窗口。