Опция компилятора ресурсов VC (RC) / n …?

#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 .