#c #c #winapi #clipboard
#c #c #winapi #буфер обмена
Вопрос:
В моей функции копирования текста я делаю следующее:
// Allocate a global memory object for the text.
hglbCopy = GlobalAlloc(GMEM_MOVEABLE,
((text.length() 1) * sizeof(WCHAR)));
if (hglbCopy == NULL)
{
CloseClipboard();
return;
}
// Lock the handle and copy the text to the buffer.
lptstrCopy = (LPWSTR)GlobalLock(hglbCopy);
memcpy(lptstrCopy, text.c_str(),
(text.length() 1) * sizeof(WCHAR) );
lptstrCopy[(text.length() 1) * sizeof(WCHAR)] = (WCHAR) 0; // null character CRASHES HERE
GlobalUnlock(hglbCopy);
Когда я копирую большой фрагмент текста, он выходит из строя при назначении нулевого ограничителя. Что-то не так с моей математикой при расчете объема выделяемой памяти?
Спасибо
Ответ №1:
Вам не нужно назначать нулевой ограничитель самостоятельно.
Если вы хотите сделать это самостоятельно, сделайте это так:
((WCHAR*)lptstrCopy)[text.length()]=L'0';
Комментарии:
1. Другими словами,
lptstrCopy
является массивомWCHAR
и должен быть проиндексирован таким образом. Вы индексируете его как массивchar
.2. Вы все еще переполняете буфер на 1
WCHAR
. Избавьтесь от1
. На самом деле, вся строка вообще не нужна. Нулевой ограничитель был скопирован как часть memcpy.3. Этот ответ вводит в заблуждение, правильным является то, что пишет Рэймонд (и его комментарий, вероятно, должен быть ответом).