В документации для TB_GETBUTTONTEXT говорится, что обработчик должен возвратить количество символов и дополнительно (если lParam
не является пустым), копируют строку в предоставленный буфер.
Протест состоит в том, что длина не включает оконечный знак. Я вижу следующую проблему. Скажите, что обработчик хранит предварительно вычисленную строку (таким образом, ее длина не изменяется). Сначала вызывающая сторона отправляет сообщение с lParam
установленный в NULL - для нахождения количества символов - и обработчик возвращает количество символов без завершающегося пустого указателя. Затем вызывающая сторона выделяет память и отправляет сообщение снова - на этот раз, передавая буферный адрес как lParam
.
Обработчик должен скопировать завершающийся пустой указатель? Я имею в виду если в первый раз возвращенный обработчик N
и вызывающая сторона выделила место для N
символы и обработчик добавляют завершающийся пустой указатель затем, переполнение буфера происходит. Но если вызывающая сторона действительно ожидала, что строка будет пустым завершенным и выделенным местом для N+1
символы и обработчик не добавляют пустой разделитель, обработчик будет иметь строку, которая не завершается пустым указателем, и снова переполнение буфера может произойти (если вызывающая сторона не достаточно осторожна).
Таким образом, что должен сделать обработчик? Это должно скопировать пустой разделитель или нет?
MFC использует разумный подход в своей реализации CMFCToolBar :: OnGetButtonText (), предполагая, что вызывающий знает, что он должен выделить N + 1, и использует lstrcpy () для копирования текста.