丁健
张万
江南
安装信息
(Setup Information)
文件是
Windows
系统支持的一种安装信息存放文件,一般以
INF
作为扩展名,因此也叫
INF
文件。安装信息
INF
文件与
Windows
内建的安装服务引擎
(API
函数库
)
紧密协同工作,基于其严格的编写语法制作而成的
INF
文件在拷贝、删除文件,增、删注册表键,更改系统设置等方面都有优秀的表现,完全可以用来实现应用程序文件安装的目标,而且价格免费,透明度高,安装程序小,可完全定制。
INF
文件是文本文件,可在任何文本编辑器内查看、创建、修改,普通用户使用
Windows
系统本身提供的记事本、写字板即可进行文件安装脚本的编写。
INF
文件安装动作的触发机制
在文件目录中用鼠标右击
INF
文件,会显示不同于其他扩展名文件的
“
安装
”
菜单。
Windows
平台在计算机中完成初始安装后,就注册了
INF
文件的
“
安装
”
动作,此
“
安装
”
动作关联命令行程序基本形式为
:
RunDll setupx.dll,InstallHinfSection section reboot-mode inf-name
如笔者目前正在使用的
Windows 98
系统注册表中,
HKEY_CLASSES_ROOT\inffile\install\
command
键的默认值为(
install
即为安装):
C:\WINDOWS\rundll.exe setupx.dll,InstallHinfSection DefaultInstall 132 %1
其中,
rundll
程序以命令行的形式调用
Windows
的动态链接库,其命令格式为:
rundll.exe <DLL
文件名
>,<
入口点
>,<
调用参数
>
setupx.dll
是安装
API(Setup API)
函数库,包含了
InstallHinfSection
、
SetupGetInfSections
、
SetupInstallFromInfSection
、
SetupPromptForDisk
、
SetupDiCreateDevRegKey
等
INF
文件内部语法检查、节名搜索、注册键创建等功能函数。
setupx.dll
与其后的入口点用逗号
(,)
分开,入口点是大小写敏感的。
Section
是
INF
文件内初始执行节名,首先执行该节内容,默认情况下名称为
“DefaultInstall”
,系统用户一般不宜对此做任何改动,如被改动,则在后续
INF
文件的
Install
节使用相应修改后的名称。
reboot-mode
是重启动参数,指示在
INF
文件执行后对系统的设置进行了改变,操作系统是否重新启动。该参数一般设为
132
或
4
,即由安装程序决定是否必须重启动,因为某些设置的改变必须在重启动后才能生效。
inf-name
是
INF
文件的名称,
“%1”
即为所选中文件本身。
INF
文件内部节
(Section)
的定义
INF
文件用特殊的文本文件格式编辑、保存,
Windows
内建的安装函数遵循既定的语法从
INF
文件内获取安装信息。
INF
文件和初始化
(
或称私有化,
Private File)
文件相似,采用节
(Section)
和入口
(Entries)
的索引机制,节和入口定义了所有操作类型及操作对象。一个
INF
文件由不同类型的节组成,每类节都有其特殊的目的和不同的实现语法,每节的内容均服务于该节的目的。除了基本的识别
INF
格式的
“Version”
节外,
INF
文件中节的数目和类型没有限制,主要取决于具体安装任务。一个基本的
INF
文件,一般包含如下几节:
节的名称
|
节的作用
|
[Version]
|
INF
文件头,提供有效
INF
文件的版本信息
|
[DefaultInstall]
|
安装包含所关联动作(文件拷贝或删除,注册表键值更新、子键增删等)在
INF
文件内的节名指针,默认情况下首先执行该节内容
|
[OtherInstall]
|
与
[DefaultInstall]
节遵循相同的语法,但必须显式的调用,常被用来定义反安装动作
|
[DestinationDirs]
|
指定罗列于一个节内将被拷贝、删除或重命名的文件在硬盘上的位置
|
[FileCopy/Delete/RenameSection(s)]
|
罗列将被拷贝、删除或重命名的文件
|
[RegistryUpdateSection(s)]
|
指定对注册表键值更新、子键增删等动作
|
[IniFileUpdateSection(s)]
|
指定对
ini
文件的更新、快捷方式可通过该节进行创建
|
[SourceDisksNames]
|
罗列文件所在盘盘名、盘卷标、盘序列号
|
[SourceDisksFiles]
|
罗列安装时使用的源文件及其所在盘
|
[Strings]
|
罗列本地化字符串(或称宏字符串)
|
表中黑体节名是保留关键字,名称固定,大小写不敏感,斜体节名名称任意,由
INF
文件编写者确定。每节的标题字符均用括号
([])
括起。
限于篇幅本文只对黑体节名做进一步的解释。
[Version]
节
任何
INF
文件的第一个小节均是
[Version]
,又称为
INF
文件头。一般有如下语句:
[Version]
Signature=“$Chicago$”
LayoutFile=filename.inf
其中,
Signature
的值应为
“$Chicago$”
、
“$Windows 95$”
或
“$Windows NT$”
中的一个
(
不区分大小写
)
,否则
Windows
不接受该文件为
INF
文件,内建的动作也就不会起作用。
filename.inf
文件包含安装组件必需的安装布局信息
(
源盘和源文件
)
,该行是可选的,如果没有提供布局信息文件,则在
INF
文件内必须包含
[SourceDisksNames]
和
[SourceDisksFiles]
节。
[Install]
节
[Install]
节提供了一个
INF
文件安装过程的总览,它识别文件内其他包含安装信息节的详细动作,是
Windows
内建安装函数识别安装过程和内容的真正入口,用户所有的安装目的在这里表现。那些与
[Install]
节内容不存在关联的节的动作将被忽略。
[Install]
节分
[DefaultInstall]
和
[OtherInstall]
两类,它们使用相同的格式。
[DefaultInstall]
节节名
“DefaultInstall”
如前面表格内容所述被显式地在注册表中指定,大小写不敏感。该节也是系统获取
INF
文件中安装信息的首要入口,当用户右击
INF
文件选
“
安装
”
时该节内容被执行。
[OtherInstall]
与
[DefaultInstall]
节遵循相同的语法
,
但必须被显式地调用,常被用来定义反安装动作。它们均可包括以下种类的可选入口
:
CopyFiles=[CopyFiles-section-name]file-list-section[,file-list-section]
RenFiles=file-list-section[,file-list-section]
DelFiles=file-list-section[,file-list-section]
UpdateInis=update-ini-section[,update-ini-section]
UpdateIniFields=update-inifields-section[,update-inifields-section]
AddReg=add-registry-section[,add-registry-section]
DelReg=del-registry-section[,del-registry-section]
Ini2Reg=ini-to-registry-section[,ini-to-registry-section]
UpdateCfgSys=update-config-section
UpdateAutoBat=update-autoexec-section
上面的入口并非都必需,如果需要一个入口,则应该在等号右侧指出存在于该
INF
文件内的索引节名
(
不用指出节名的一个特例是
CopyFiles
入口
,
可使用
“@”
字符后跟文件名的形式,效果是直接将文件拷贝到
DestinationDirs
节所罗列的硬盘目录
)
。节名需由可打印字符组成,在中文系统平台中,可使用中文字符作为节名,这也是体现
INF
格式安装本地化的地方,非常直观。每类入口在一个
[Install]
节内只能出现一次,第二次及以后出现的同名重复入口将被忽略。每类入口的等号右侧可罗列多个节名,节名之间以逗号分开,以便列举同一类动作的不同作用对象,如删除多个注册表键、拷贝文件到多个目录路径等。
下表是各类入口的动作含义,具体语法本文不做细述
:
CopyFiles
|
等号右侧是拷贝文件罗列节节名,将文件拷贝到
DestinationDirs
节指定的目的地,所有的源文件必须在
SourceDisksFiles
节列出
|
RenFiles
|
重命名文件
|
DelFiles
|
删除文件
|
UpdateInis
|
安装过程中更新
INI
初始化文件内容
|
UpdateIniField
|
安装过程中更新
INI
初始化文件值内容
|
AddReg
|
增加注册表键或键值
|
DelReg
|
删除注册表键或键值
|
Ini2Reg
|
用
INI
文件内容更新注册表
|
UpdateCfgSys
|
更新
Config.sys
文件内的设置
|
UpdateAutoBat
|
更新
Autoexec.bat
文件内的设置
|
在实际编写
INF
文件时,注册表根键通常采用缩写方式,如下表:
HKCR
|
HKEY_CLASSES_ROOT
的简写
|
HKCU
|
HKEY_CURRENT_USER
的简写
|
HKLM
|
HKEY_LOCAL_MACHINE
的简写
|
HKU
|
HKEY_USERS
的简写
|
HKR
|
相对键,对于硬件设备驱动程序类安装的
|
[DestinationDirs]
节
[DestinationDirs]
节指定拷贝、重命名或删除文件三类动作的目的目录路径,拷贝、重命名或删除操作对象即文件的列表在专门的节中列出,这些节名最初在
“Install”
的
CopyFiles
、
RenFiles
或
DelFiles
入口中明确。
[DestinationDirs]
节内语句的语法为:
file-list-section=LDID
,
[Subdir]
[DefaultDestDir=LDID
,
[Subdir]]
其中
file-list-section
为必选项,是
CopyFiles
、
RenFiles
或
DelFiles
入口内列出的节名。
LDID(Logical disk identifier)
为必选项,是逻辑盘标识码,代表各种系统或实时安装路径,逻辑盘标识码可看做一种宏字符串,随系统或实时安装路径的不同而相应改变。逻辑盘标识码机制确保了安装的灵活性和正确性,该标识码可为下表所述值之一:
Subdir
为可选项,指定
LDID
目录下的子目录名。
DefaultDestDir
为可选项,指定
CopyFiles
、
RenFiles
或
DelFiles
入口的缺省操作目录。
[SourceDisksNames]
节
[SourceDisksNames]
节罗列源文件所在盘符序列码、盘描述符、盘卷标号和盘序列号。
[SourceDisksNames]
节内语句的语法为:
disk-ordinal=“disk-description”,disk-label,disk-serial-number
其中
disk-ordinal
为必选项,是盘符序列码,标识一个源盘,具有惟一性,一般可设置为从
1
开始递增的整数,
0
不是一个有效的盘符序列码。当存在多个源盘时,盘符序列码之间不能重复。
disk-description
为必选项,是盘描述符,用双引号括起的字符串或字符串宏描述盘的内容或目的。安装引擎将该字符串显示在对话框内以提示用户。
disk-label
为源盘的卷标识。
disk-serial-number
未使用,但必须被设置为
0
。
[SourceDisksFiles]
节
[SourceDisksFiles]
节指定安装时使用的源文件和盘符序列码、盘描述符。
[SourceDisksFiles]
节内语句的语法为:
file-name=disk-number[,subdir] [,file-size]
其中
file-name
为必选项,是源盘上文件的名称。
disk-number
是包含
file-name
指定文件所在源盘的盘符序列码,该盘符序列码需在
[SourceDisksNames]
节中列出
,
并大于或等于
1
。
Subdir
为可选项,指定文件所在源盘的子目录,如省略则源盘为缺省安装路径。
file-size
为可选项,表明文件的大小,以字节为单位。
[Strings]
节
[Strings]
节定义一个或多个本地化字符串,或称字符串宏。尽管
[Strings]
节一般被放置在
INF
文件的末尾,字符串宏可在
INF
文件任何地方使用,安装引擎解释、展开字符串宏为给定的长字符串并做进一步处理。字符串宏在使用时需用百分号
(%)
括起。
[Strings]
节内语句的语法为:
strings-key=value
其中
strings-key
为由字母或数字等可打印字符组成的宏名。
Value
为被双引号括起的长字符串,字符串可由字母、数字或其他可打印字符组成。
一个具体的安装实例
本文接下来列举一个名为
“Mysetup.inf”
的安装信息文件实例,以便读者熟悉
INF
文件语法,领略
INF
文件的安装效果。该
“Mysetup.inf”
文件可完成如下的安装任务:假设应用程序有
“MyApp.exe”
、
“MyApp.hlp”
、
“MyApp.dll”
等几个需安装到应用程序主目录的文件,有
“Ass_1.dll”
、
“Ass_2.dll”
等几个需安装到
Windows\System
子目录的文件,要求将各文件按预定目录位置拷贝到位,其中应用程序主目录可在安装过程中选定,同时,在
“
开始
>
程序
”
下面建立名为
“
我的程序组
”
的程序组,在该程序组下建立名为
“
我的应用程序
”
、
“
我的应用程序帮助
”
的两个程序项,分别与
“MyApp.exe”
和
“MyApp.hlp”
文件关联。
完成上述安装任务的
“Mysetup.inf”
文件内容如下:
[Version]
signature=“$chicago$”
[AdvSetup]
HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Runonce\Setup
,
“INF
制作安装程序
”,,“RunDll32.exe“%01%”\advpack.dll,LaunchINFSection Mysetup.inf,DefaultInstall2”
[DefaultInstallX]
[DefaultInstall]
AddReg=AdvSetup
[DefaultInstall2]
CopyFiles =
拷贝到用户指定目录,拷贝到
Windows\System
子目录
,
……
CustomDestination=My-path
UpdateInis =
加
exe
文件快捷方式
,
加
hlp
文件快捷方式,
……
[SourceDisksNames]
1=“
文件所在目录
”,,0
[SourceDisksFiles]
MyApp.exe.exe=1,,1021
MyApp.dll=1,,1021
MyApp.hlp=1,,1021
Ass_1.dll=1,,1021
Ass_2.dll=1,,1021
[DestinationDirs]
拷贝到用户指定目录
= 49000
拷贝到
Windows\System
子目录
= 11
[My-path]
49000,49001,49002,49003=index-again,1
[index-again]
“”
,
“”
,
“”,
,
““
默认安装到
“C:\MyApp”
目录,可选择
””
,
“%30%\MyApp”
[
拷贝到用户指定目录
]
MyApp.exe
MyApp.dll
MyApp.hlp
[
拷贝到
Windows\System
子目录
]
Ass_1.dll
Ass_2.dll
[
加
exe
文件快捷方式
]
setup.ini, progman.groups,, “group1=““
我的程序组
”””
setup.ini, group1,,“““
我的应用程序
””,““““““%49000%\MyApp.exe””””””,,,,,““MyApp.exe”””
[
加
hlp
文件快捷方式
]
setup.ini, progman.groups,, “group1=““
我的程序组
”””
setup.ini, group1,,“““
我的应用程序帮助
””,““““““%49000%\MyApp.hlp””””””,,,,,““MyApp.hlp”””
读者会注意到上面的文件内许多键名使用了中文,这是因为
INF
格式文件支持中文提示及中文键名。这些中文键名不仅充当功能键起索引的作用,还形象化地标识了键的前后对应关系,增强了文件内容的可读性,有利于后续更改、维护。
安装时,首先确保应用程序的所有待安装文件和
“Mysetup.inf”
文件处在同一个目录下,右击
“Mysetup.inf”
文件选
“
安装
”
或按
Shift
键的同时按功能键
F10
。待目录选择对话框出现,点击
“
浏览
”
按钮或直接在文本编辑框内键入目录名称后,屏幕显示文件安装拷贝和更新快捷方式进度,最终结束。
打开资源管理器,就可查看到所有文件均已拷贝到指定目录位置。点击
“
开始
>
程序
”
,可以找到
“
我的程序组
”
程序组及下属的
“
我的应用程序
”
、
“
我的应用程序帮助
”
程序项,选中程序项均能激活对应文件,说明文件安装及快捷方式关联均告成功。
小
结
本文介绍的文件安装方法适合于大众,读者可熟悉语法、参考例子、效仿编写,制作出自己的安装信息文件。