windows剪贴板中用的那几个内存函数:GlobalAlloc
GlobalLock
GlobalUnlock
( GlobalFree )MSDN先是说这些函数过时了,推荐使用新的堆内存函数。但完了又说这些旧函数适用于剪贴板操作----那就继续用吧。《windows程序设计》上剪贴板列子也是用的这些函数。我看了下书上代码中没有发现GlobalFree的影子。书上说:
当呼叫SetClipboardData后,请不要再继续使用该内存块。它不再属于使用者程序,必须把句柄看成是无效的。如果需要继续存取数据,可以制作数据的副本,或从剪贴簿中读取它(如下节所述)。您也可以在SetClipboardData呼叫和CloseClipboard呼叫之间继续使用内存块,但是不要使用传递给SetClipboardData函数的整体句柄。事实上,此函数也传回一个整体句柄,必需锁定这些代码以存取内存。在呼叫CloseClipboard之前,应先为此句柄解锁。意思是GlobalAlloc分配的那块内存(及其中数据)传给剪贴板后就归剪贴板管了。由此是不是可以推论该内存块也由剪贴板释放了呢?(GlobalFree在 CloseClipboard之中?)
还有前面那段话中的"应先为此句柄解锁",是指我传给SetClipboardData的句柄呢,还是指该函数返回的句柄?
GlobalLock
GlobalUnlock
( GlobalFree )MSDN先是说这些函数过时了,推荐使用新的堆内存函数。但完了又说这些旧函数适用于剪贴板操作----那就继续用吧。《windows程序设计》上剪贴板列子也是用的这些函数。我看了下书上代码中没有发现GlobalFree的影子。书上说:
当呼叫SetClipboardData后,请不要再继续使用该内存块。它不再属于使用者程序,必须把句柄看成是无效的。如果需要继续存取数据,可以制作数据的副本,或从剪贴簿中读取它(如下节所述)。您也可以在SetClipboardData呼叫和CloseClipboard呼叫之间继续使用内存块,但是不要使用传递给SetClipboardData函数的整体句柄。事实上,此函数也传回一个整体句柄,必需锁定这些代码以存取内存。在呼叫CloseClipboard之前,应先为此句柄解锁。意思是GlobalAlloc分配的那块内存(及其中数据)传给剪贴板后就归剪贴板管了。由此是不是可以推论该内存块也由剪贴板释放了呢?(GlobalFree在 CloseClipboard之中?)
还有前面那段话中的"应先为此句柄解锁",是指我传给SetClipboardData的句柄呢,还是指该函数返回的句柄?
...
GlobalLock(hClipboardData); //加锁。
...写入数据。
GlobalUnlock(hClipboardData); //解锁。
...
SetClipboardData(CF_TEXT, hClipboardData);CloseClipboard();
另外说一下,WORD没有此问题。我想这画图程序里打开的JPEG图像有啥不一样呢?同样图像用其它程序打开后COPY到写字板就能保存。我还分析了下剪贴板中数据类型,发现它们也没啥区别。请高手指教!