Повреждение кучи во время SetClipboardData () - PullRequest
3 голосов
/ 15 сентября 2010

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

Может ли любой гуру помочь определить ошибку?

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

Диалог ошибок:

Блок кучи в 04A781C0, измененный в 04A78282, за прошлым запрошенным размером ba Windows вызвал точку останова в V4.exe.

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

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

В окне вывода может быть больше диагностикиИнформация.Программа '[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 ]

5 голосов
/ 15 сентября 2010
_tcscpy_s(pchData, size, LPCTSTR(szText)); 

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

0 голосов
/ 15 сентября 2010

Звоните GlobalUnlock(hClipboardData); до звонка SetClipboardData(CF_UNICODETEXT, hClipboardData);

0 голосов
/ 15 сентября 2010

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

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

Так как вы передаете NULL на OpenClipboard, SetClipboardData терпит неудачу.

...