INF Strings 节
INF 文件必须至少有一个 Strings 节,才能定义该 INF 中其他位置指定的每个 %strkey% 标记。
[Strings] |
[Strings.LanguageID] ...
strkey1 = ["]some string["]
strkey2 = " string-with-leading-or-trailing-whitespace " |
"very-long-multiline-string" |
"string-with-semicolon" |
"string-ending-in-backslash" |
""double-quoted-string-value""
...
项
strkey1, strkey2, ...
INF 文件中的每个字符串键必须指定由字母、数字和/或其他显式可见字符组成的唯一名称。 此类 strkey 标记中的 % 字符必须表示为 %%。
某些字符串 | “some string”
指定一个字符串,可以选择使用双引号字符 (“) 分隔,其中包含字母、数字、标点符号,甚至可能包含某些隐式可见字符,尤其是内部空格和/或制表符。 但是,未带引号的字符串不能包含内部双引号 (“) 、分号 (;) 、换行、返回或任何不可见的控制字符,并且不能将反斜杠 () 作为其最后一个字符。
“* string-with-leading-or-trailing-whitespace* ” |
“very-long-multiline-string” |
“”double-quoted-string-value“”
为 %strkey% 标记指定的值 必须 括在双引号 (“) (如果它满足以下任一条件):
如果指定的字符串具有前导空格或尾随空格,必须将其保留为其值的一部分,则必须将该字符串括在双引号字符中,以防止其前导空格和/或尾随空格被 INF 分析程序丢弃。
如果由于文本编辑器中的换行,长字符串可能包含任何内部换行符或返回字符,则还应将其括在双引号中,以防止在初始内部换行符或返回字符处截断字符串。
如果此类字符串包含分号,则必须将其括在双引号中,以防止字符串在分号处被截断。 (如 INF 文件的一般语法规则中所述,分号字符以 INF 文件中的每个注释开头。)
如果此类字符串以反斜杠结尾,则必须用双引号引起来防止字符串与下一个条目连接。 (如 INF 文件的一般语法规则中所述,反斜杠字符 () 用作 INF 文件中的行连续符。)
与无引号字符串规范一样,此类“带引号的字符串”不能包含内部双引号字符。 但是,可以通过使用一个或多个附加双引号字符对 ((例如“”some string“”) )将其指定为显式双引号字符串值。
INF 分析程序不仅放弃本节中任何“带引号的字符串”的最外层双引号对,而且还会将每个后续连续的双引号对压缩为一个单双引号字符。
例如,“”“some string”“”在分析时也变为“some string”。
总之,如果满足以下任一条件,则必须将任何字符串括在一对双引号字符 (“) 中:
- 字符串包含前导空格或尾随空格。
- 字符串太长,行换行。
- 字符串包含分号或最后一个反斜杠字符。
- 字符串本身是带引号的字符串。
系统 INF 分析程序丢弃分隔此类字符串的最外层双引号字符对,以及双引号字符串分隔符之外的任何前导或尾随空格字符。
注解
由于系统 INF 分析程序从定义 %strkey% 标记的任何“引号字符串”中去除最外侧的双引号对,因此许多系统 INF 文件将所有 %strkey% 标记定义为“引号字符串”,以避免 INF 分析期间前导空格和尾随空格意外丢失。 使用 “带引号的字符串”还可以确保无法截断跨行的特别长字符串值,并且不能将带有结束反斜杠的字符串连接到 INF 文件中的下一行。
若要创建单个国际 INF 文件,INF 可以具有一组特定于区域设置的 字符串。LanguageID 部分,如形式语法语句中所示。 LanguageID 扩展是一个 4 位十六进制值, (没有前导“0x”) ,定义如下:
- 较低的 10 位包含主要语言 ID,接下来的 6 位包含由 Winnt.h 中定义的 MAKELANGID 宏指定的子语言 ID。
- 语言和子语言 ID 必须与 Winnt.h 中定义的 Win32 LANG_XXX 和 SUBLANG_XXX 常量的系统定义值匹配。
例如, LanguageID 值为 0407 表示主要语言 ID LANG_GERMAN (07) ,子语言 ID 为 SUBLANG_GERMAN (01) ,如以下示例所示:
[Strings] ; No language ID implies English
DiskName="My Excellent Software"
LocaleSubDir="English"
[Strings.0407] ; 0407 is the language ID for German
DiskName="Meine ausgezeichnete Software"
LocaleSubDir="German"
INF 文件只能包含一个 Strings 节以及一个 String。每个 LanguageID 值的 LanguageID 部分。
Windows 选择用于转换安装的所有 %strkey% 令牌的单个字符串部分。 根据特定计算机的当前区域设置,Windows 按以下方式选择 “字符串 ”部分:
Windows 首先查找 。 INF 中与分配给计算机的当前区域设置匹配的 LanguageID 值。 如果找到完全匹配项,则 Windows 将使用该 字符串。LanguageID INF 部分,用于转换 INF 中定义的所有 %strkey% 标记。
需要复制所有字符串中的所有 字符串标记。* 节,甚至不需要本地化的数值/固定常量。
否则,Windows 接下来会查找与 LANG_XXX 值的匹配项,值为 SUBLANG_NEUTRAL 作为SUBLANG_XXX。 如果找到此类匹配项,Windows 将使用该 INF 部分来转换 INF 中定义的所有 %strkey% 标记。
否则,Windows 接下来会查找与 LANG_XXX 值的匹配项,以及同一个 LANG_XXX 系列的任何有效SUBLANG_XXX 。 如果找到此类部分匹配项,请使用该 字符串。LanguageID INF 部分,用于转换 INF 中定义的所有 %strkey% 标记。
否则,Windows 将使用未修饰 的字符串 部分来转换 INF 中定义的所有 %strkey% 标记。
按照惯例,为了方便为国际市场创建一组 INF 文件, 字符串 部分在所有系统 INF 文件中是最后一个部分。 对 INF 中的所有用户可见字符串值使用 %strkey% 标记,并将其放置在每个区域设置 的字符串 部分中,可简化此类字符串的转换。 有关特定于区域设置的 INF 文件的详细信息,请参阅 创建国际 INF 文件。
尽管 Strings 节是每个 INF 文件中的最后一个部分,但在 Strings 节中定义的任何指定的 %strkey% 标记都可以在 INF 中的其他位置重复使用,尤其是当需要该标记的已翻译值时。 SetupAPI 函数将每个 %strkey% 标记扩展为指定的字符串,然后使用该扩展值进行进一步的 INF 处理。
INF 文件中 %strkey% 标记的使用不限于用户可见的字符串值。 只要每个标记在 Strings 节中定义,就可以以对 INF 编写器方便的任何方式使用这些令牌。 例如,在编写需要指定多个 GUID 的 INF 文件时,使用有意义的名称作为每个此类 GUID 值的替代项,为每个 GUID 创建 %strkey% 令牌可能很方便。
在 INF 文件的 Strings 节中指定一组 %strkey% = “{GUID}” 值,只需键入每个显式 GUID 值一次。 与在整个 INF 文件中使用显式 GUID 值相比,这有助于提供更具可读性的内部 INF 文档。
所有 %strkey% 标记都必须在引用它们的 INF 文件中定义。 因此,对于包含 Include 和 Needs 条目的任何 INF 文件,包含的 INF 必须具有其自己的 Strings 部分,以定义该 INF 中引用的所有 %strkey% 标记。
在 INF 字符串 部分中,替换字符串(包括终止 NULL 字符)的最大长度为 4096( (Windows Vista 及更高版本的 Windows) )和 512 (Windows Server 2003、Windows XP 和 Windows 2000) 。 字符串替换后,INF 文件字符串的最大长度(以字符为单位)为 4096,包括终止 NULL 字符。
示例
以下示例演示系统提供的特定于区域设置的 dvd.inf 中字符串部分的片段,该片段适用于英语国家/地区中的安装。
[Strings]
Msft="Microsoft"
MfgToshiba="Toshiba"
Tosh404.DeviceDesc="Toshiba DVD decoder card"
; ...
以下示例演示字符串串联。
[OEM Windows System Component Verification]
OID = 1.3.6.1.4.1.311.10.3.7 ; WHQL OEM OID
Notice = "%A% %B% %C% %D% %E%"
[Strings]
A = "This certificate is used to sign untested drivers that have not passed the Windows Hardware Quality Labs (WHQL) testing process."
B = "This certificate and drivers signed with this certificate are intended for use in test environments only, and are not intended for use in any other context."
C = "Vendors who distribute this certificate or drivers signed with this certificate outside a test environment may be in violation of their driver signing agreement."
D = "Vendors who have their drivers signed with this certificate do so at their own risk."
E = "In particular, Microsoft assumes no liability for any damages that may result from the distribution of this certificate or drivers signed with this certificate outside the test environment described in a vendor's driver signing agreement."