Win32匯編--使用資源--字符串資源
程序中用到的字符串常常定義在.const字段中,但Windows也提供了另外一種使用字符串常量的方法,那就是在資源中定義。雖然在資源中定義字符串使用起來(lái)比直接在.const段中定義要復(fù)雜一點(diǎn),但它帶來(lái)的好處是便于開(kāi)發(fā)不同語(yǔ)言的版本,比如,要推出其他語(yǔ)種的版本只需要修改資源中的字符串表就可以了,即使語(yǔ)言轉(zhuǎn)換的工作是由第三方通過(guò)修改可執(zhí)行文件來(lái)做的(如編程受好者常常做的漢化工作),修改資源也遠(yuǎn)比修改代碼來(lái)得快捷和安全。
在資源腳本中定義字符串的語(yǔ)法是:
STRINGTABLE [DISCARDABLE]
BEGIN
字符串ID1 “字符串1”
字符串ID2 “字符串2”
…
END
全部字符串組成一個(gè)字符串表,和其他資源定義不同,由于整個(gè)資源文件中只能定義一個(gè)字符串表,所以字符串表沒(méi)有資源ID,但是表中的不同字符串分別有一個(gè)字符串ID。
在程序中使用字符串資源也很簡(jiǎn)單,用LoadString把字符串裝入到緩沖區(qū)中去就可以用了:
invoke LoadString, hInstance, 字符串ID, addr 緩沖區(qū), sizeof 緩沖區(qū)
為了防止溢出,最后一個(gè)參數(shù)指定緩沖區(qū)的長(zhǎng)度。
如果要在單個(gè)可執(zhí)行文件中實(shí)現(xiàn)多語(yǔ)種,那么可以在字符串表中定義不同語(yǔ)言的字符串。同一語(yǔ)種的字符串按規(guī)律排列,如下列中文的以1000開(kāi)頭,英文的以2000開(kāi)頭:
stringtable
{
1001 “文件未找到!”
1002 “無(wú)法打開(kāi)文件!”
…
2001 “File not found!”
2002 “Can not open file”
…
}
在程序中使用的時(shí)候,先確定一種語(yǔ)言并預(yù)先設(shè)置在dwLanguage變量中,使用中文時(shí)將dwLanguage設(shè)置為1000,使用英文時(shí)設(shè)置為2000,再寫(xiě)一個(gè)讀取不同版本字符串的子程序_GetString,這樣調(diào)用_GetString子程序后就不用考慮版本問(wèn)題了:
_GetString proc _dwID, _lpBuffer, _dwSize
pushad
mov eax, _dwID
invoke LoadString, hInstance, eax, _lpBuffer, _dwSize
popad
ret
_GetString endp