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* ” |
“string-ending-in-backslash” |
“double-quoted-string-value””
如果 %strkey% 标记的值满足以下任一条件, 则必须 用双引号(“)括起来:
如果指定的字符串具有必须保留为其值的一部分的前导空格或尾随空格,则必须用双引号字符括住该字符串,以防止其前导和/或尾随空格被 INF 分析器丢弃。
如果长字符串可能包含任何内部换行符或返回字符,因为文本编辑器中换行,还应用双引号括起来,以防止在初始内部换行符或返回字符处截断字符串。
如果此类字符串包含分号,则必须用双引号引起来防止字符串在分号处截断。 (如 INF 文件的一般语法规则中所述,分号字符在 INF 文件中开始每个注释。
如果此类字符串以反斜杠结尾,则必须用双引号引起来防止字符串与下一个条目连接。 (如 INF 文件的一般语法规则中所述,反斜杠字符 () 用作 INF 文件中的行连续性器。
与无引号字符串规范一样,此类“带引号的字符串”不能包含内部双引号字符。 但是,可以使用一个或多个附加双引号字符(例如“某些字符串”)指定为显式双引号字符串值。
INF 分析器不仅放弃本部分中任何“带引号”的最外侧双引号对,还会将每个后续的双引号对压缩成一个双引号字符。
例如,分析“”某些字符串“时,”某些字符串“也变为”某些字符串”。
总之,如果存在以下任一情况,则必须将任何字符串括在一对双引号字符(“)中:
- 字符串包含前导空格或尾随空格。
- 字符串太长,以至于行换行。
- 字符串包含分号或最终反斜杠字符。
- 字符串本身是带引号的字符串。
系统 INF 分析器放弃分隔此类字符串的最外侧双引号字符对,以及双引号字符串分隔符之外的任何前导或尾随空格字符。
Remarks
由于系统 INF 分析器从定义 %strkey% 标记的任何“带引号”中去除最外侧的双引号对,因此许多系统 INF 文件将所有 %strkey% 标记定义为“引号字符串”,以避免在 INF 分析期间意外丢失前导空格和尾随空格。 使用 “带引号的字符串”还可以确保无法截断换行的特别长字符串值,并且具有结束反斜杠的字符串不能连接到 INF 文件中的下一行。
若要创建单个国际 INF 文件,INF 可以具有一组特定于区域设置 的字符串。LanguageID 节,如正式语法语句所示。 LanguageID 扩展是一个 4 位十六进制值(没有前导的“0x”),定义如下:
- 较低的 10 位包含主要语言 ID,接下来的 6 位包含子语言 ID,由 Winnt.h 中定义的 MAKELANGID 宏指定。
- 语言和子语言 ID 必须与 Winnt.h 中定义的 Win32 LANG_XXX 的系统定义值匹配,并且SUBLANG_XXX 常量。
例如, LanguageID 值为 0407 表示LANG_GERMAN(07)的主要语言 ID,其子语言 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 节,以及一个字符串。每个 LanguageID 值的 LanguageID 节。
Windows选择一个字符串部分,用于转换安装的所有 %strkey% 令牌。 根据特定计算机的当前区域设置,Windows按以下方式选择“字符串”部分:
Windows首先查找 。 INF 中与分配给计算机的当前区域设置匹配的 LanguageID 值。 如果找到完全匹配项,Windows使用该字符串。LanguageIDINF 部分用于转换 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使用未编码的 Strings 节来转换在 INF 中定义的 %strkey% 令牌。
按照约定,为了方便为国际市场创建一组 INF 文件, 字符串 部分是所有系统 INF 文件中的最后一部分。 对 INF 中的所有用户可见字符串值使用 %strkey% 令牌,并将其放置在每个区域设置 的 Strings 部分中,简化了此类字符串的转换。 有关特定于区域设置的 INF 文件的详细信息,请参阅 “创建国际 INF 文件”。
尽管 Strings 节是每个 INF 文件中的最后一部分,但字符串节中定义的任何指定的 %strkey% 令牌都可以在 INF 中的其他位置重复使用,尤其是在需要该令牌的转换值的位置。 SetupAPI 函数将每个 %strkey% 令牌扩展到指定的字符串,然后使用该扩展值进一步处理 INF。
INF 文件中的 %strkey% 令牌的使用不限于用户可见的字符串值。 只要每个令牌在 Strings 节中定义,就可以以任何方式方便 INF 编写器使用这些令牌。 例如,当你编写需要多个 GUID 规范的 INF 文件时,使用有意义的名称作为每个 GUID 值的替代,为每个 GUID 创建 %strkey% 令牌可能很方便。
在 INF 文件的 Strings 节中指定一组 %strkey% = “{GUID}” 值需要仅键入每个显式 GUID 值一次。 这可以帮助提供比在整个 INF 文件中使用显式 GUID 值更具可读性的内部 INF 文档。
所有 %strkey% 令牌都必须在引用它们的 INF 文件中定义。 因此,对于包含 “ 和 需要 ”条目的任何 INF 文件,包含的 INF 必须具有自己的 Strings 节,才能定义在该 INF 中引用的所有 %strkey% 标记。
在 INF 字符串部分中,替换字符串(包括终止 NULL 字符)的最大长度为 4096(Windows Vista 及更高版本的 Windows)和 512(Windows Server 2003、Windows XP 和 2000 年Windows)。 字符串替换后,INF 文件字符串的最大长度(以字符为单位)为 4096,包括终止 NULL 字符。
Examples
以下示例演示系统提供的特定于区域设置的 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."