Win32汇编--使用资源--字符串资源
程序中用到的字符串常常定义在.const字段中,但Windows也提供了另外一种使用字符串常量的方法,那就是在资源中定义。虽然在资源中定义字符串使用起来比直接在.const段中定义要复杂一点,但它带来的好处是便于开发不同语言的版本,比如,要推出其他语种的版本只需要修改资源中的字符串表就可以了,即使语言转换的工作是由第三方通过修改可执行文件来做的(如编程受好者常常做的汉化工作),修改资源也远比修改代码来得快捷和安全。
在资源脚本中定义字符串的语法是:
STRINGTABLE [DISCARDABLE]
BEGIN
字符串ID1 “字符串1”
字符串ID2 “字符串2”
…
END
全部字符串组成一个字符串表,和其他资源定义不同,由于整个资源文件中只能定义一个字符串表,所以字符串表没有资源ID,但是表中的不同字符串分别有一个字符串ID。
在程序中使用字符串资源也很简单,用LoadString把字符串装入到缓冲区中去就可以用了:
invoke LoadString, hInstance, 字符串ID, addr 缓冲区, sizeof 缓冲区
为了防止溢出,最后一个参数指定缓冲区的长度。
如果要在单个可执行文件中实现多语种,那么可以在字符串表中定义不同语言的字符串。同一语种的字符串按规律排列,如下列中文的以1000开头,英文的以2000开头:
stringtable
{
1001 “文件未找到!”
1002 “无法打开文件!”
…
2001 “File not found!”
2002 “Can not open file”
…
}
在程序中使用的时候,先确定一种语言并预先设置在dwLanguage变量中,使用中文时将dwLanguage设置为1000,使用英文时设置为2000,再写一个读取不同版本字符串的子程序_GetString,这样调用_GetString子程序后就不用考虑版本问题了:
_GetString proc _dwID, _lpBuffer, _dwSize
pushad
mov eax, _dwID
invoke LoadString, hInstance, eax, _lpBuffer, _dwSize
popad
ret
_GetString endp