Re: wchar_t, wstring и буфер обмена: Stack around the variable 'curt' was corru
От: Кодт Россия  
Дата: 10.07.13 13:55
Оценка: 2 (1)
Здравствуйте, derasa, Вы писали:
D>wchar_t curt[] = L"";

Разместил на стеке массив из 1 элемента (ровно столько элементов содержится в строке L"": там концевой ноль, и всё)

D>for (i = 0; i < CurText.size(); i++) // преобразую wstring к wchar_t. Возможно нужно по другому
D>{
D>     curt[i] = CurText[i];
D>}

В первый элемент (там, где был ноль) положил первую букву, во второй элемент... стоп, а где же находится второй элемент, если массив одноэлементный?
Правильно, остальные элементы находятся поверх предыдущих переменных, поверх заголовка кадра, поверх адреса возврата, поверх аргументов функции, поверх переменных вызывающей стороны....

D>curt[i] = '\0';
D>OpenClipboard(0);
D>EmptyClipboard();
D>HGLOBAL hStrMem = GlobalAlloc(GMEM_MOVEABLE, sizeof(curt));

Выделили память под одноэлементную строку.
D>void* pStrMem = GlobalLock(hStrMem);
D>memcpy(pStrMem, curt, sizeof(curt));

спасибо, что скопировали одноэлементную строку, а не CurrText.size() элементов — а то ещё бы и кучу убили, в придачу к уже убитому стеку
D>GlobalUnlock(pStrMem);
D>SetClipboardData(CF_UNICODETEXT, hStrMem);
D>CloseClipboard();
D>return 0;

Тадам!!! Стек у нас убит, return не знает, ни куда возвращаться, ни как...

А ведь всё делается гораздо проще
wchar_t const* curt = CurText.c_str();
// внезапно, sizeof(curt) = sizeof(void*) = 4 или 8, в зависимости от платформы. Не наступи на эти грабли ниже.
size_t num_bytes = (CurText.size()+1)*sizeof(wchar_t);
.....
GlobalAlloc(...num_bytes);
.....
memcpy(...num_bytes);
.....
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.