2010-09-15 6 views
3

Я не уверен, что является основной причиной получения такой ошибки (Heap Corruption) из приведенного ниже кода. Когда я просматриваю программу, значение TCHAR правильно распределяется и копируется в данные буфера обмена. Тем не менее, он падает, когда он переходит к SetClipboardData (...).Повреждение кучи во время SetClipboardData()

Может ли любой гуру найти ошибку?

Заранее спасибо.

Dialog Ошибки:

Heap блок в 04A781C0 модифицирован в 04A78282 прошлого запрошенного размера ба Windows, вызвал точку останова в V4.exe.

Это может быть связано с повреждением кучи , что указывает на ошибку в V4.exe или на любую из загруженных DLL-файлов.

Это может быть связано с сообщением пользователя нажатиями F12, а V4.exe - с фокусом.

Выходное окно может содержать более диагностическую информацию. Программа '[10840] V4.exe: родной' вышел с кодом 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(); 
    } 

List Box данные:

John Smith 1978 
Angelina 1975 
Brad Pitt 1950 

ответ

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

Для функции UNICODE wcscpy_s, параметр размера размера в словах, и вы передаете размер в байтах. Это может привести к повреждению памяти, поскольку wcscpy_s заполняет весь буфер 0xFD перед копированием, чтобы поймать такие ошибки. (спасибо sharptooth за точную информацию).

+1

+1, за исключением того, что в соответствии с http://msdn.microsoft.com/en-us/library/td1esda9(VS.80).aspx это не подушечка до конца, но заполняет весь буфер 0xFD перед копированием. – sharptooth

+0

Прохладный ... Он работает после того, как я заменил _tcscpy_s на memcpy. – wengseng

+0

Спасибо за помощь, Алекс. – wengseng

0

Ниже приводится цитата из MSDN для SetClipboardData:

Если приложение вызывает OpenClipboard с HWND s et to NULL, EmptyClipboard устанавливает для владельца буфера обмена значение NULL; этот вызывает сбой SetClipboardData.

Поскольку вы передаете NULL для OpenClipboard, SetClipboardData не удается.

0

Вызов GlobalUnlock(hClipboardData); перед вызовом SetClipboardData(CF_UNICODETEXT, hClipboardData);

Смежные вопросы