В сотый раз я только что подтвердил, что , когда компилятору ресурсов дано указание завершить строки нулем , число, возвращаемое LoadString , включает терминал NULL символ Я сделал это, изучив выходной буфер, который я сделал доступным для LoadString .
Строки ресурса не по умолчанию завершены нулем. В этом случае возвращаемый счетчик исключает нулевой символ терминала, как описано в документации, поскольку ноль добавляется функцией после того, как строка скопирована в выходной буфер.
Я подозреваю, что это связано с тем, что LoadString не учитывает тот факт, что компилятору ресурсов было дано указание завершить строки пустыми значениями. На самом деле, я подозреваю, что у них нет возможности узнать, что они были.
Что касается того, почему вы хотите завершить строки ресурсов нулем в первую очередь, когда они прекрасно работают без них, и ваш PE-файл, таким образом, немного меньше, причина в том, что реализация широких символов LoadString , в точке входа LoadStringW , возвращает указатель на строку, а не копирует ее в буфер, если переданный в нее адрес буфера является пустым указателем , Если ваши строки не заканчиваются нулем, использование LoadString таким способом приводит к весьма нежелательным результатам.
Поскольку строки ресурсов всегда хранятся в виде строк Unicode (широких символов), реализация LoadString в ANSI не может возвращать указатель, так как строка должна быть преобразована в ANSI; следовательно, его нельзя просто скопировать.