#c #resources #command-line-arguments
#c #Ресурсы #аргументы командной строки
Вопрос:
Я просто читал описание доступных параметров командной строки для компилятора ресурсов, который поставляется с VC 2010 (rc.exe ), и один из них привлек мое внимание:
/n : добавление нулевых значений ко всем строкам в строковых таблицах
Может быть, ответ очевиден, и я просто не думаю о правильном пути, но когда этот вариант будет актуален?
Прежде всего, согласно документации MSDN, строки в таблице строк представляют собой «просто строки Unicode или ASCII с нулевым завершением, которые при необходимости могут быть загружены из исполняемого файла». Во-вторых, в документации для LoadString далее указано, что функция «загружает строковый ресурс из исполняемого файла, связанного с указанным модулем, копирует строку в буфер и добавляет завершающий нулевой символ«
Спасибо.
Ответ №1:
Строки в STRINGTABLE обычно не заканчиваются нулевым терминатором, вместо этого формат STRINGTABLE указывает, что каждой строке предшествует длина строки. Обычно LoadString()
строковый ресурс копируется в буфер, предоставляемый приложением, и добавляется нулевой ограничитель. В этом случае вам на самом деле не нужна опция /n
.
Однако LoadString()
(или, точнее LoadStringW()
, поскольку вариант ANSI не может этого сделать) может использоваться для извлечения необработанного строкового ресурса при указании 0
в качестве размера буфера:
WCHAR* str;
int str_len;
str_len = LoadStringW(hInstance, ID_STRING, (LPWSTR) amp;str, 0);
В этом случае он просто сохраняет адрес исходного строкового ресурса в str
as, отображенный в память процесса, и копирование строки не происходит. Очевидно LoadLibrary()
, что тогда реализация просто не сможет добавить терминатор, и именно тогда опция компилятора ресурсов удобна, поскольку работать со строками с нулевым завершением намного проще, чем использовать длину строки (возвращаемое значение LoadLibrary()
).
Комментарии:
1. Спасибо за ваш отзыв. Это имеет смысл в отношении способа работы LoadStringW при установке четвертого параметра (nBufferMax) в 0, но, как указано в документации MSDN, которую я процитировал, строки в таблице уже заканчиваются нулем, что означает, что даже если вы просто скопируете адрес необработанного строкового ресурса в 'str', он будетпо-прежнему указывает на строку с нулевым завершением ... или я что-то упускаю?
2. Они не заканчиваются автоматически нулем в ТАБЛИЦЕ СТРОК, но перед строками указывается длина. См . blogs.msdn.com/b/oldnewthing/archive/2004/01/30/65013.aspx .