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”即为所选中文件自己。 ide

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]节遵循相同的语法,但必须被显式地调用,常被用来定义反安装动做。它们都可包括如下种类的可选入口:this

复制代码
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]节内只能出现一次,第二次及之后出现的同名重复入口将被忽略。每类入口的等号右侧可罗列多个节名,节名之间以逗号分开,以便列举同一类动做的不一样做用对象,如删除多个注册表键、拷贝文件到多个目录路径等。
下表是各种入口的动做含义,具体语法本文不作细述: 
spa

在实际编写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时注意的问题

1、肯定CAB的打包正确,打包的方式在网上随便都能找到;但要肯定的包正确,若是在起点摔倒,已经丧失了“全程”的主动性,开始咱们打的包就很差使。 

2、设置IE的安全级别,默认的状况是禁止不少插件加载的。 
1.正式库为可信任站点: 
【IE】—>【工具】—>【Internet选项】—>【安全】—>【可信任站点】 
说明: 
a.) a 【站点】打开一窗口,里面输入cab包所在的服务器的地址,而后肯定。 
b.) 【自定义级别】中全部关于ActiveX的都设置为“启用”或者“提示”,同时将安全级别设置到最低,而后点肯定。 
2. 参照上面“1”中的将【Internet】中【自定义级别】如上面“b”中设置,由于图太大,在此省略。 

3、在打开页面过程当中若是碰到以下相似提,都要选择安装。 

4、【IE】—>【工具】—>【管理加载项】—>【启动或禁用加载项】 
看是否你须要的插件被禁止加载,若是是你能够选中后点“启用”加载该插件,重启加载一次。 
5、根据页面中cab包加载的代码中,classid中的字符串标识,在注册表中搜索一下,看看些标识有没有写入到注册表;若是已经写入了,说明是包里面的ActiveX没有被成功加载,你能够手动解压CAB包,把里的插件手动COPY到C:\WINDOWS\system32(也多是否C:\WINDOWS\system看你的打包文件了)目录下,前后重启一下IE试一下,有时候重启一下机器也可能会解决。

6、就咱们项目中的插件而言,除个上述缘由外;自己和自身的硬件与操做系统也有关联,特别大多数的操做系统为了减小安装时间或者根本没有破解好,缺了不少底层系统支持文件才致使咱们的部分插件没法打入;若是是这种缘由引发的能够经过下面方式查看一下。
【个人电脑】—>【管理】—>【事件查看器】—>【系统】:若是插件没有加载成功,在右边会生成不少"红叉" 事件提示,双击打开看以看到里面的描述信息,发生这个事件的缘由;看心打开里面的连接看更多的信息。若是不清楚还能够从更多信息中的“来源”的值在百度上搜索一下,看看缺乏什么支持文件,下载就应该没有什么问题了,这也是咱们用到的解决方法,研究不深,若是有兴趣能够详细帮我解释一下,不胜感激。

7、另外建议研究一下这个C:\WINDOWS\Downloaded Program Files文件夹,好像也和加载有关系,没有研究过,若是清楚插件的具体过程可能知道,惋惜我不太清楚,感兴趣的能够搜一下,若是有收获不妨共享一下。

8、版本控制:同一个版本号下的的东西若是修改后,不会自动升级,许多软件更新版本号都会有所改变,这点你们都明白。 
<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。感谢该博主。

相关文章
相关标签/搜索