【问题标题】:Heap corruption during SetClipboardData()SetClipboardData() 期间的堆损坏
【发布时间】:2011-04-12 13:23:46
【问题描述】:

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

有哪位大师能帮忙找出错误吗?

提前致谢。

错误对话框:

04A781C0 处的堆块已修改为 04A78282 过去请求的 ba 大小 Windows 触发了一个断点 V4.exe。

这可能是由于 堆,表示 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  

【问题讨论】:

    标签: c++ heap-memory clipboard heap-corruption


    【解决方案1】:

    以下是MSDNSetClipboardData 的引用:

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

    由于您将 NULL 传递给 OpenClipboardSetClipboardData 失败。

    【讨论】:

      【解决方案2】:
      _tcscpy_s(pchData, 大小, LPCTSTR(szText));

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

      【讨论】:

      【解决方案3】:

      在拨打SetClipboardData(CF_UNICODETEXT, hClipboardData);之前先拨打GlobalUnlock(hClipboardData);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多