Re[2]: wchar_t, wstring и буфер обмена: Stack around the variable 'curt' was co
От: derasa  
Дата: 10.07.13 14:27
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, 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...
Пока на собственное сообщение не было ответов, его можно удалить.