Здравствуйте, 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);
.....