安装信息 (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 。待目录选择对话框出现,点击 “ 浏览 ” 按钮或直接在文本编辑框内键入目录名称后,屏幕显示文件安装拷贝和更新快捷方式进度,最终结束。
打开资源管理器,就可查看到所有文件均已拷贝到指定目录位置。点击 “ 开始 > 程序 ” ,可以找到 “ 我的程序组 ” 程序组及下属的 “ 我的应用程序 ” 、 “ 我的应用程序帮助 ” 程序项,选中程序项均能激活对应文件,说明文件安装及快捷方式关联均告成功。
小 结
本文介绍的文件安装方法适合于大众,读者可熟悉语法、参考例子、效仿编写,制作出自己的安装信息文件。