C++乐园

C/C++ 交流

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  12 随笔 :: 18 文章 :: 14 评论 :: 0 Trackbacks

丁健 张万 江南

安装信息 (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 。待目录选择对话框出现,点击 浏览 按钮或直接在文本编辑框内键入目录名称后,屏幕显示文件安装拷贝和更新快捷方式进度,最终结束。

打开资源管理器,就可查看到所有文件均已拷贝到指定目录位置。点击 开始 > 程序 ,可以找到 我的程序组 程序组及下属的 我的应用程序 我的应用程序帮助 程序项,选中程序项均能激活对应文件,说明文件安装及快捷方式关联均告成功。

本文介绍的文件安装方法适合于大众,读者可熟悉语法、参考例子、效仿编写,制作出自己的安装信息文件。

posted on 2007-01-25 09:08 小不懂^_^ 阅读(1408) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理