我刚刚阅读了VC ++ 2010(rc.exe)附带的资源编译器的可用命令行选项的描述,其中一个引起了我的注意:
/ n:将null添加到字符串表中的所有字符串
也许答案是显而易见的,我只是没有考虑正确的道路,但这个选项什么时候才有意义呢?
首先根据MSDN文档字符串表中的字符串是“只需以null结尾的Unicode或ASCII字符串,可以在需要时从可执行文件中加载”。其次,LoadString的文档进一步声明该函数“从与指定模块关联的可执行文件中加载字符串资源,将字符串复制到缓冲区,并附加终止空字符”
感谢。
答案 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()
的返回值)容易得多)。