VC ++资源编译器(RC)选项/ n ......?

时间:2011-10-12 18:57:00

标签: c++ resources command-line-arguments

我刚刚阅读了VC ++ 2010(rc.exe)附带的资源编译器的可用命令行选项的描述,其中一个引起了我的注意:

/ n:将null添加到字符串表中的所有字符串

也许答案是显而易见的,我只是没有考虑正确的道路,但这个选项什么时候才有意义呢?

首先根据MSDN文档字符串表中的字符串是“只需以null结尾的Unicode或ASCII字符串,可以在需要时从可执行文件中加载”。其次,LoadString的文档进一步声明该函数“从与指定模块关联的可执行文件中加载字符串资源,将字符串复制到缓冲区,并附加终止空字符

感谢。

1 个答案:

答案 0 :(得分:2)

STRINGTABLE中的字符串通常不会被零终结符终止,而是STRINGTABLE的格式指定每个字符串前面都有字符串长度。通常LoadString()将字符串资源复制到应用程序提供的缓冲区中并附加零终止符。在这种情况下,您实际上不需要选项/n

但是,当您指定LoadString()作为缓冲区大小时,可以使用LoadStringW()(或者更准确地0作为ANSI变体不能这样做)来检索原始字符串资源:

WCHAR* str;
int str_len;
str_len = LoadStringW(hInstance, ID_STRING, (LPWSTR) &str, 0);

在这种情况下,它只是将原始字符串资源的地址存储到映射到进程内存中的str中,并且不会发生字符串复制。显然,LoadLibrary()实现根本无法添加终结符,这就是资源编译器选项很方便,因为使用零终止字符串比使用字符串长度(LoadLibrary()的返回值)容易得多)。