wchar_t curt[] = L"";
// тип CurText — wstring
int i;
for (i = 0; i < CurText.size(); i++) // преобразую wstring к wchar_t. Возможно нужно по другому
{
curt[i] = CurText[i];
}
Разместил на стеке массив из 1 элемента (ровно столько элементов содержится в строке L"": там концевой ноль, и всё)
D>for (i = 0; i < CurText.size(); i++) // преобразую wstring к wchar_t. Возможно нужно по другому
D>{
D> curt[i] = CurText[i];
D>}
В первый элемент (там, где был ноль) положил первую букву, во второй элемент... стоп, а где же находится второй элемент, если массив одноэлементный?
Правильно, остальные элементы находятся поверх предыдущих переменных, поверх заголовка кадра, поверх адреса возврата, поверх аргументов функции, поверх переменных вызывающей стороны....
Тадам!!! Стек у нас убит, 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);
.....
Перекуём баги на фичи!
Re: wchar_t, wstring и буфер обмена: Stack around the variable 'curt' was corru
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, 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>>}
К>
К>В первый элемент (там, где был ноль) положил первую букву, во второй элемент... стоп, а где же находится второй элемент, если массив одноэлементный? К>Правильно, остальные элементы находятся поверх предыдущих переменных, поверх заголовка кадра, поверх адреса возврата, поверх аргументов функции, поверх переменных вызывающей стороны....
К>
К>Тадам!!! Стек у нас убит, 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);
К>.....
К>
Спасибо, заработало!
Щас будем извлекать из буфера
Re[3]: wchar_t, wstring и буфер обмена: Stack around the variable 'curt' was co
Здравствуйте, derasa, Вы писали:
D>Спасибо, заработало!
D>Щас будем извлекать из буфера
Только еще GlobalFree добавь. А вообще:
Note The global functions have greater overhead and provide fewer features than other memory management functions. New applications should use the heap functions unless documentation states that a global function should be used. For more information, see Global and Local Functions.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[2]: wchar_t, wstring и буфер обмена: Stack around the variable 'curt' was co
Здравствуйте, Ops, Вы писали:
Ops>Здравствуйте, derasa, Вы писали:
D>>Спасибо, заработало!
D>>Щас будем извлекать из буфера
Ops>Только еще GlobalFree добавь. А вообще: Ops>
Ops>Note The global functions have greater overhead and provide fewer features than other memory management functions. New applications should use the heap functions unless documentation states that a global function should be used. For more information, see Global and Local Functions.
Если я вас правильно понял — то я использую устаревшие функции? Можете поделиться примером использования новых функций в контексте моей задачи?
Re[5]: wchar_t, wstring и буфер обмена: Stack around the variable 'curt' was co
Здравствуйте, derasa, Вы писали:
D>Если я вас правильно понял — то я использую устаревшие функции? Можете поделиться примером использования новых функций в контексте моей задачи?
Похоже, я наврал, по обоим пунктом, извини. Оказывается, там API уже 100 лет не обновлялось.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[4]: wchar_t, wstring и буфер обмена: Stack around the variable 'curt' was co
Здравствуйте, Ops, Вы писали:
Ops>Только еще GlobalFree добавь. А вообще:
Нет, не надо там GlobalFree. Этот блок памяти переходит в собственность clipboard, его не надо удалять.
If SetClipboardData succeeds, the system owns the object identified by the hMem parameter. The application may not write to or free the data once ownership has been transferred to the system, but it can lock and read from the data until the CloseClipboard function is called.
With best regards
Pavel Dvorkin
Re[5]: wchar_t, wstring и буфер обмена: Stack around the variable 'curt' was co
Здравствуйте, derasa, Вы писали:
D>С копированием из буфера тоже проблемы. Строка с иероглифами получается. Пример взял из инета, поменял на lptstr. Что неправильно?
D>if((buf = (HGLOBAL) GetClipboardData(CF_TEXT)) != NULL) D>{ D> lptstr = (LPTSTR)GlobalLock(buf); D>}
Например то, что проект у Вас юникодный, соответственно LPTSTR это WCHAR*, а просите формат CF_TEXT, который возвращает в кодировке ANSI.
Re[4]: wchar_t, wstring и буфер обмена: Stack around the variable 'curt' was co
Здравствуйте, pugv, Вы писали:
P>Здравствуйте, derasa, Вы писали:
D>>С копированием из буфера тоже проблемы. Строка с иероглифами получается. Пример взял из инета, поменял на lptstr. Что неправильно?
D>>if((buf = (HGLOBAL) GetClipboardData(CF_TEXT)) != NULL) D>>{ D>> lptstr = (LPTSTR)GlobalLock(buf); D>>}
P>Например то, что проект у Вас юникодный, соответственно LPTSTR это WCHAR*, а просите формат CF_TEXT, который возвращает в кодировке ANSI.
А как в таком случае быть? Как из АНСИ преобразовать в wstring?
Re[5]: wchar_t, wstring и буфер обмена: Stack around the variable 'curt' was co
Здравствуйте, pugv, Вы писали:
P>Здравствуйте, derasa, Вы писали:
D>>А как в таком случае быть? Как из АНСИ преобразовать в wstring?
P>Можно сразу попросить CF_UNICODETEXT. А преобразовать — это см. в сторону MultiByteToWideChar.