以下是在两个按钮里实现的写和读剪贴板,如果去掉GlobalFree(hGlobal),则执行很正常。但是不去掉,先按一下“写”,再按一下“读”,文本框(m_e1)不能正常显示,但是无论“写”还是“读”,如果和其他程序,如记事本,配合能成功,就是我本身配合不行。如果不要GlobalFree(hGlobal),会内存泄漏吗?
void CMy1Dlg::OnButton1() 
{ if(!OpenClipboard()) return;
EmptyClipboard();

HGLOBAL hGlobal=GlobalAlloc(GMEM_ZEROINIT ,1000);
if (hGlobal == NULL) return;
LPSTR lpszData= (LPSTR)GlobalLock(hGlobal);
strcpy((char *)lpszData, "xxx");
GlobalUnlock(hGlobal);
SetClipboardData(CF_TEXT,hGlobal);
if (hGlobal == NULL) return;
CloseClipboard();
GlobalFree(hGlobal);
}void CMy1Dlg::OnButton2() 
{
if (!OpenClipboard()) return; HGLOBAL hGlobal = GetClipboardData(CF_TEXT);
if (hGlobal == NULL) return;

LPSTR lpszData = (LPSTR)GlobalLock(hGlobal);
unsigned long nBufSize = GlobalSize(hGlobal);
m_e1.SetWindowText(lpszData);
GlobalUnlock(hGlobal);
CloseClipboard();
}

解决方案 »

  1.   

    不能调用GlobalFree,是否泄漏,调试一下看看有没有泄漏报告就知道了。
      

  2.   

    for void CMy1Dlg::OnButton1() 
    调用SetClipboardData后, 系统拥有hGlobal对象, 系统可以读取数据, 但是前提是你不能释放或者解锁内存锁定. 
    还有一个就是如果hGlobal是一个内存对象, 该内存对象必须已经使用LocalAlloc 分配了内存.其它的你自己可以参考msdn..
      

  3.   

    改成new、delete试试,现在已经很少用GlobalAlloc了。
      

  4.   

    在SetClipboardData后不能用GlobalFree()!
      

  5.   

    那怎么用了GlobalFree(),在其他软件中仍能CRTL+v?在说内存怎么回收?
      

  6.   

    cnlcg(cnlcg) 说得对,GlobalAlloc是为了全局可用的内存。如果放到剪切板了,当然不能free,否则,剪切板就是空的了。
    那个内存泄漏不是错误,是剪贴板机制所决定的。你可试试,把剪贴板清空后,再退出程序,是看不到内存泄漏的报告的。
      

  7.   

    那怎么用了GlobalFree(),在其他软件中仍能CRTL+v?