Параметр компилятора ресурсов (RC) VC ++ / n ...? - PullRequest
2 голосов
/ 12 октября 2011

Я только что читал описание доступных параметров командной строки для компилятора ресурсов, который поставляется с VC ++ 2010 (rc.exe), и один из них привлек мое внимание:

/ n: добавить ноль ко всем строкам в таблицах

Может быть, ответ очевиден, и я просто не думаю о правильном пути, но когда этот вариант будет уместен?

Прежде всего, в соответствии с документацией MSDN строки в таблице строк представляют собой «просто строки Unicode с нулевым символом в конце или ASCII , которые при необходимости могут быть загружены из исполняемого файла». Во-вторых, в документации для LoadString далее говорится, что функция «загружает строковый ресурс из исполняемого файла, связанного с указанным модулем, копирует строку в буфер и добавляет завершающий нулевой символ "

Спасибо.

1 Ответ

2 голосов
/ 06 февраля 2013

Строки в STRINGTABLE обычно не заканчиваются нулевым терминатором, вместо этого формат STRINGTABLE указывает, что каждой строке предшествует длина строки.Обычно LoadString() копирует строковый ресурс в предоставленный приложением буфер и добавляет нулевой терминатор.В этом случае вам на самом деле не нужна опция /n.

Однако LoadString() (или точнее LoadStringW(), как вариант ANSI не может этого сделать) можно использовать для извлечения ресурса необработанной строки при указании0 в качестве размера буфера: WCHAR* str; int str_len; str_len = LoadStringW(hInstance, ID_STRING, (LPWSTR) &str, 0);

В этом случае он просто сохраняет адрес исходного строкового ресурса в str, как отображается в памяти процесса, и копирование строки не происходит.Очевидно, что реализация LoadLibrary() тогда просто не может добавить терминатор, и это когда опция компилятора ресурса удобна, так как работать со строками с нулевым символом в конце намного проще, чем использовать длину строки (возвращаемое значение LoadLibrary()).*

...