INF文件详解
安装信息(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] | 指定罗列与一个节内容被拷贝、删除或重命名的文件在硬盘上的位置 |
[Fillcopy/Delete/Remename Sections] | 罗列将被拷贝、删除、或重命名的文件 |
[Registry UpdateSection] | 指定对注册表键值更新、子键增等动作 |
[iniFileUpdateSection] | 制动对ini文件进行更新、快捷方式通过该节进行创建 |
[SourseDiskNames] | 罗列文件所在盘盘名、盘的卷标、盘序列号 |
[sourseDiskFiles] | 罗列安装时使用的源文件及其所在的盘 |
[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]节内只能出现一次,第二次及以后出现的同名重复入口将被忽略。每类入口的等号右侧可罗列多个节名,节名之间以逗号分开,以便列举同一类动作的不同作用对象,如删除多个注册表键、拷贝文件到多个目录路径等。
下表是各类入口的动作含义,具体语法本文不做细述:
在实际编写INF文件时,注册表根键通常采用缩写方式,如下表:
[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。待目录选择对话框出现,点击“浏览”按钮或直接在文本编辑框内键入目录名称后,屏幕显示文件安装拷贝和更新快捷方式进度,最终结束。
打开资源管理器,就可查看到所有文件均已拷贝到指定目录位置。点击“开始>程序”,可以找到“我的程序组”程序组及下属的“我的应用程序”、“我的应用程序帮助”程序项,选中程序项均能激活对应文件,说明文件安装及快捷方式关联均告成功。
小 结
本文介绍的文件安装方法适合于大众,读者可熟悉语法、参考例子、效仿编写,制作出自己的安装信息文件。
用INF来创建快捷方式和修改注册表
基本格式:
[Version]
Signature="$CHICAGO$"
Provider=www.lxasp.com, 2007.9.14
[DefaultInstall]
AddReg = AddReg
UpdateInis = AddLink
[AddReg]
根键,"子键路径","键值名",键类型ID,键值内容
[AddLink]
setup.ini, progman.groups,, "group1=""目标目录ID"""
setup.ini, group1,,"""快捷方式名"",""快捷方式目标文件路径"",""图标文件名"",图标编号,,""工作目录"",""其他描述"""
修改注册表的示例:
修改字符串型:
hklm,"SOFTWARE\Corel\AppLauncher","Corel BARCODE WIZARD",,"%01%\PROGRAMS\BARCODE.EXE"
修改字符串型默认:
hklm,"SOFTWARE\Classes\.htm\OpenWithList\EMEDITOR.EXE",,,""
修改DWORD型:
hklm,"SOFTWARE\Corel\CorelDRAW\12.0","ShowEULA",65537,00,00,00,00
修改二进制型:
hklm,"SOFTWARE\Corel\Conversions\11\Import","Word95Import",1,43,00
创建快捷方式的示例:
在开始菜单的程序中:
setup.ini, progman.groups,, "group1=""%16386%"""
setup.ini, group1,,"""EmEditor"",""%01%\EmEditor.exe"",,,,"""",""EmEditor.exe"""
在当前用户的桌面中:
setup.ini, progman.groups,, "group2=""%16384%"""
setup.ini, group2,,"""EmEditor"",""%01%\EmEditor.exe"",,,,""%01%"",""EmEditor.exe"""
常用的ID值:
[根键]的值:
HKCR = HKEY_CLASSES_ROOT
HKCU = HKEY_CURRENT_USER
HKLM = HKEY_LOCAL_MACHINE
HKU = HKEY_USERS
[键类型ID]的值:
0 或 留空 = 字符串型
1 = 二进制型
0x00010000 = 扩展UNICODE字符串型
0x00020000 = 扩展字符串型
0x00010001(65537) = 数值型(DWORD)
[目标目录ID]的值:(前后都加上百分号,例如 %01% / %16384% )
01 INF文件所在的当前目录
10 C:\Windows
11 C:\Windows\System32
18 C:\Windows\Help
20 C:\Windows\Fonts
24 C:\ 即系统所在盘
53 C:\Documents and Settings\[当前用户名]
其他常用的目录ID:
16384 Current User\Desktop
16386 Current User\Start Menu\Programs
16389 Current User\My Documents
16390 Current User\Favorites
16391 Current User\Start Menu\Programs\Startup
16392 Current User\Recent
16393 Current User\SendTo
16395 Current User\Start Menu
16397 Current User\My Docu
下面是一个例子,测试通过的
[version] Signature="$CHICAGO$" AdvancedINF=2.0 [Add.Code] QLBanK.ocx=QLBanK.ocx SAFE_User20120522.exe=SAFE_User20120522.exe [QLBanK.ocx] File-win32-x86=thiscab RegisterServer=yes clsid={B735F9B5-5E75-49D4-9AD1-D427805352A3} DestDir=11 FileVersion=1,0,0,1 [WSAFE_User20120522.exe] hook=QLinstaller FileVersion=1,0,1,1 [QLinstaller] file-win32-x86=./QLBank.CAB run=%EXTRACT_DIR%\SAFE_User20120522.exe
下面是另一个例子(网上找的)
[version] signature="$CHICAGO$" AdvancedINF=2.0 [DefaultInstall] CopyFiles=install.files RegisterOCXs=RegisterFiles [RInstallApplicationFiles] CopyFiles=install.files RegisterOCXs=RegisterFiles [DestinationDirs] install.files=11 [SourceDisksNames] 1=%DiskName%,TestCAB.CAB,1 [Add.Code] pcpos.ocx=pcpos.ocx Comm.dll=comm.dll pcpos.dll=pcpos.dll TCPCLNT.dll=TCPCLNT.dll [install.files] pcpos.ocx=pcpos.ocx Comm.dll=comm.dll pcpos.dll=pcpos.dll TCPCLNT.dll=TCPCLNT.dll [SourceDisksFiles] pcpos.ocx=1 Comm.dll=1 pcpos.dll=1 TCPCLNT.dll=1 [pcpos.ocx] file-win32-x86=thiscab RegisterServer=yes clsid={719A1D6E-7099-4123-9D63-F0118AFF2D61} DestDir=11 FileVersion=1,0,0,1 [Comm.dll] file-win32-x86=thiscab RegisterServer=yes DestDir=11 FileVersion=1,0,0,1 [pcpos.dll] file-win32-x86=thiscab RegisterServer=yes DestDir=11 FileVersion=1,0,0,1 [TCPCLNT.dll] file-win32-x86=thiscab RegisterServer=yes DestDir=11 FileVersion=1,0,0,1 [RegisterFiles] %11%\pcpos.ocx
下面是一些部署cab时注意的问题
一、确定CAB的打包正确,打包的方式在网上随便都能找到;但要确定的包正确,如果在起点摔倒,已经丧失了“全程”的主动性,开始我们打的包就不好使。
二、设置IE的安全级别,默认的情况是禁止很多插件加载的。
1.正式库为可信任站点:
【IE】—>【工具】—>【Internet选项】—>【安全】—>【可信任站点】
说明:
a.) a 【站点】打开一窗口,里面输入cab包所在的服务器的地址,然后确定。
b.) 【自定义级别】中所有关于ActiveX的都设置为“启用”或者“提示”,同时将安全级别设置到最低,然后点确定。
2. 参照上面“1”中的将【Internet】中【自定义级别】如上面“b”中设置,因为图太大,在此省略。
三、在打开页面过程中如果碰到如下类似提,都要选择安装。
四、【IE】—>【工具】—>【管理加载项】—>【启动或禁用加载项】
看是否你需要的插件被禁止加载,如果是你可以选中后点“启用”加载该插件,重启加载一次。
五、根据页面中cab包加载的代码中,classid中的字符串标识,在注册表中搜索一下,看看些标识有没有写入到注册表;如果已经写入了,说明是包里面的ActiveX没有被成功加载,你可以手动解压CAB包,把里的插件手动COPY到C:\WINDOWS\system32(也可能是否C:\WINDOWS\system看你的打包文件了)目录下,先后重启一下IE试一下,有时候重启一下机器也可能会解决。
六、就我们项目中的插件而言,除个上述原因外;本身和自身的硬件与操作系统也有关联,特别大多数的操作系统为了减少安装时间或者根本没有破解好,缺了很多底层系统支持文件才导致我们的部分插件无法打入;如果是这种原因引起的可以通过下面方式查看一下。
【我的电脑】—>【管理】—>【事件查看器】—>【系统】:如果插件没有加载成功,在右边会生成很多"红叉" 事件提示,双击打开看以看到里面的描述信息,发生这个事件的原因;看心打开里面的链接看更多的信息。如果不清楚还可以从更多信息中的“来源”的值在百度上搜索一下,看看缺少什么支持文件,下载就应该没有什么问题了,这也是我们用到的解决方法,研究不深,如果有兴趣可以详细帮我解释一下,不胜感激。
七、另外建议研究一下这个C:\WINDOWS\Downloaded Program Files文件夹,好像也和加载有关系,没有研究过,如果清楚插件的具体过程可能知道,可惜我不太清楚,感兴趣的可以搜一下,如果有收获不妨共享一下。
八、版本控制:同一个版本号下的的东西如果修改后,不会自动升级,许多软件更新版本号都会有所改变,这点大家都明白。
<object id=”ReadCard” classid=”xxxx” codebase=”/xxx/…/xx.CAB#version=1.0.0.0”>中的
#version=”1.0.0.0”就是版本号,更新后的版本号一定要比当前的高,越改越小的,没有见过,也没有试过。当前如果要升级版本可以是#version=”1.0.0.1”或者#version=”2.0.0.0”总之高于当前版本即可
该博文来自:https://blog.csdn.net/chenlycly/article/details/44726105。感谢该博主。