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