Кто ответственен за помещение пустого разделителя при обработке TB_GETBUTTONTEXT?

В документации для TB_GETBUTTONTEXT говорится, что обработчик должен возвратить количество символов и дополнительно (если lParam не является пустым), копируют строку в предоставленный буфер.

Протест состоит в том, что длина не включает оконечный знак. Я вижу следующую проблему. Скажите, что обработчик хранит предварительно вычисленную строку (таким образом, ее длина не изменяется). Сначала вызывающая сторона отправляет сообщение с lParam установленный в NULL - для нахождения количества символов - и обработчик возвращает количество символов без завершающегося пустого указателя. Затем вызывающая сторона выделяет память и отправляет сообщение снова - на этот раз, передавая буферный адрес как lParam.

Обработчик должен скопировать завершающийся пустой указатель? Я имею в виду если в первый раз возвращенный обработчик N и вызывающая сторона выделила место для N символы и обработчик добавляют завершающийся пустой указатель затем, переполнение буфера происходит. Но если вызывающая сторона действительно ожидала, что строка будет пустым завершенным и выделенным местом для N+1 символы и обработчик не добавляют пустой разделитель, обработчик будет иметь строку, которая не завершается пустым указателем, и снова переполнение буфера может произойти (если вызывающая сторона не достаточно осторожна).

Таким образом, что должен сделать обработчик? Это должно скопировать пустой разделитель или нет?

1
задан sharptooth 10 August 2010 в 08:35
поделиться

1 ответ

MFC использует разумный подход в своей реализации CMFCToolBar :: OnGetButtonText (), предполагая, что вызывающий знает, что он должен выделить N + 1, и использует lstrcpy () для копирования текста.

2
ответ дан 2 September 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: