Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, 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);
К>.....
К>
Спасибо, заработало!
Щас будем извлекать из буфера