SetClipboardData()期间堆损坏

时间:2010-09-15 08:04:31

标签: c++ heap clipboard corruption

我不确定从下面的代码中获取此类错误(堆损坏)的根本原因是什么。当我单步执行程序时,TCHAR值被正确分配并复制到剪贴板数据。但是,当它继续进行SetClipboardData(...)时会崩溃。

任何大师都可以帮助发现错误吗?

提前致谢。

错误对话框:

  

堆积在04A781C0修改为   04A78282过去要求的ba大小   Windows触发了一个断点   V4.exe。

     

这可能是由于腐败造成的   heap,表示V4.exe中的错误   或者它加载的任何DLL。

     

这也可能是由于用户造成的   在V4.exe具有焦点时按F12。

     

输出窗口可能有更多   诊断信息。该程序   '[10840] V4.exe:Native'已退出   代码为0(0x0)。

代码:

    int nCount = m_ListBox.GetCount();
    CString szTemp, szText;
    for(int i=0; i<nCount; i++)
    {
        m_ListBox.GetText(i, szTemp);
        szText = szText + _T("\n") + szTemp;
    }
    if(OpenClipboard())
    {
        EmptyClipboard();
        HGLOBAL hClipboardData;
        size_t size = (szText.GetLength()+1) * sizeof(TCHAR);
        hClipboardData = GlobalAlloc(NULL, size);
        TCHAR* pchData = (TCHAR*)GlobalLock(hClipboardData);
        _tcscpy_s(pchData, size, LPCTSTR(szText));
#ifdef _UNICODE
        SetClipboardData(CF_UNICODETEXT, hClipboardData);  //--> crash here
#else
        SetClipboardData(CF_TEXT, hClipboardData);
#endif
        GlobalUnlock(hClipboardData);
        CloseClipboard();
    }

列表框数据:

John Smith  1978  
Angelina    1975  
Brad Pitt   1950  

3 个答案:

答案 0 :(得分:5)

_tcscpy_s(pchData, size, LPCTSTR(szText)); 

对于Unicode wcscpy_s函数,size参数是单词的大小,并以字节为单位传递大小。这可能会导致内存损坏,因为wcscpy_s在复制之前使用0xFD填充所有缓冲区,以便捕获此类错误。 (感谢sharptooth获取确切信息)。

答案 1 :(得分:0)

以下是SetClipboardData OpenClipboard的引用:

  

如果应用程序调用OpenClipboard   将hwnd设置为NULL,EmptyClipboard   将剪贴板所有者设置为NULL;这个   导致SetClipboardData失败。

由于您将NULL传递给SetClipboardData,{{1}}失败。

答案 2 :(得分:0)

在致电GlobalUnlock(hClipboardData);

之前致电SetClipboardData(CF_UNICODETEXT, hClipboardData);