wen*_*eng 3 c++ heap clipboard corruption
我不确定从下面的代码中获取此类错误(堆损坏)的根本原因是什么.当我单步执行程序时,TCHAR值被正确分配并复制到剪贴板数据.但是,当它继续进行SetClipboardData(...)时会崩溃.
任何大师都可以帮助发现错误吗?
提前致谢.
错误对话框:
堆积在04A781C0修改为04A78282过去请求的大小为Windows 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();
}
Run Code Online (Sandbox Code Playgroud)
列表框数据:
John Smith 1978
Angelina 1975
Brad Pitt 1950
Run Code Online (Sandbox Code Playgroud)
_tcscpy_s(pchData, size, LPCTSTR(szText));
对于Unicode wcscpy_s函数,size参数是单词的大小,并以字节为单位传递大小.这可能会导致内存损坏,因为wcscpy_s在复制之前使用0xFD填充所有缓冲区,以便捕获此类错误.(感谢sharptooth获取确切信息).