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 文件名>,<入口点>,<调用参数>
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$”、“$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] 上面的入口并非都必需,如果需要一个入口,则应该在等号右侧指出存在于该INF文件内的索引节名(不用指出节名的一个特例是CopyFiles入口,可使用“@”字符后跟文件名的形式,效果是直接将文件拷贝到DestinationDirs节所罗列的硬盘目录)。节名需由可打印字符组成,在中文系统平台中,可使用中文字符作为节名,这也是体现INF格式安装本地化的地方,非常直观。每类入口在一个[Install]节内只能出现一次,第二次及以后出现的同名重复入口将被忽略。每类入口的等号右侧可罗列多个节名,节名之间以逗号分开,以便列举同一类动作的不同作用对象,如删除多个注册表键、拷贝文件到多个目录路径等。 下表是各类入口的动作含义,具体语法本文不做细述:
|
[DestinationDirs]节 一个具体的安装实例 下面再以一个MPEG4视频播放控件ImageCtl.ocx的安装文件来进行说明,该INF文件兼容Vista系统,已运用于工程项目中。
;通用部分,说明INF文件适应所有Win98之后的操作系统
;拷贝文件到我window/system32目录 [ImageCtl.Copy]
[SourceDisksNames] [SourceDisksFiles]
;写注册表,该控件实现了IE初始化和脚本化安全接口 ; [ImageCtl.AddReg] HKCR,IMAGECTL.ImageCtlCtrl.1,,,ImageCtl Control HKLM,CLSID/{B0772B17-29F0-4E96-A47A-7D5530A1686A},,,ImageCtl Control HKLM,IMAGECTL.ImageCtlCtrl.1,,,ImageCtl Control |