windows剪贴板中用的那几个内存函数:GlobalAlloc
GlobalLock
GlobalUnlock
( GlobalFree )MSDN先是说这些函数过时了,推荐使用新的堆内存函数。但完了又说这些旧函数适用于剪贴板操作----那就继续用吧。《windows程序设计》上剪贴板列子也是用的这些函数。我看了下书上代码中没有发现GlobalFree的影子。书上说:
当呼叫SetClipboardData后,请不要再继续使用该内存块。它不再属于使用者程序,必须把句柄看成是无效的。如果需要继续存取数据,可以制作数据的副本,或从剪贴簿中读取它(如下节所述)。您也可以在SetClipboardData呼叫和CloseClipboard呼叫之间继续使用内存块,但是不要使用传递给SetClipboardData函数的整体句柄。事实上,此函数也传回一个整体句柄,必需锁定这些代码以存取内存。在呼叫CloseClipboard之前,应先为此句柄解锁。意思是GlobalAlloc分配的那块内存(及其中数据)传给剪贴板后就归剪贴板管了。由此是不是可以推论该内存块也由剪贴板释放了呢?(GlobalFree在 CloseClipboard之中?)
还有前面那段话中的"应先为此句柄解锁",是指我传给SetClipboardData的句柄呢,还是指该函数返回的句柄?

解决方案 »

  1.   

    是的,剪贴板的数据不需要用户释放,系统自己管理。后面一句,只要你语文及格,应该不难理解“此函数也传回一个整体句柄,必需锁定这些代码以存取内存”指的就是SetClipboardData返回的句柄,而且前面也说了“是不要使用传递给SetClipboardData函数的整体句柄”。
      

  2.   

    好像是当其它的程序调用EmptyClipboard时GlobalFree的。HGLOBAL hClipboardData = GlobalAlloc(...);
    ...
    GlobalLock(hClipboardData); //加锁。
    ...写入数据。
    GlobalUnlock(hClipboardData); //解锁。
    ...
    SetClipboardData(CF_TEXT, hClipboardData);CloseClipboard();
      

  3.   

    stivenjia :学生吧!别玩文字游戏实实在在的试验几次就明白了这位是业界老人吗?上面问题小儿科已。向你请教个有难度的可别让我再去试验啊:用windows画图程序(系统自带)打开的JPEG图片,COPY后可以放在写字板里,但是却不能保存。为什么说写字板呢,为了好让大家验证。其实我是在做我的RichEdit控件时发现的问题。
    另外说一下,WORD没有此问题。我想这画图程序里打开的JPEG图像有啥不一样呢?同样图像用其它程序打开后COPY到写字板就能保存。我还分析了下剪贴板中数据类型,发现它们也没啥区别。请高手指教!