Сбой функции буфера обмена Windows при назначении нулевого ограничителя

#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. Этот ответ вводит в заблуждение, правильным является то, что пишет Рэймонд (и его комментарий, вероятно, должен быть ответом).