丁健
張萬
江南
安裝信息
(Setup Information)
文件是
Windows
系統(tǒng)支持的一種安裝信息存放文件,一般以
INF
作為擴(kuò)展名,因此也叫
INF
文件。安裝信息
INF
文件與
Windows
內(nèi)建的安裝服務(wù)引擎
(API
函數(shù)庫
)
緊密協(xié)同工作,基于其嚴(yán)格的編寫語法制作而成的
INF
文件在拷貝、刪除文件,增、刪注冊(cè)表鍵,更改系統(tǒng)設(shè)置等方面都有優(yōu)秀的表現(xiàn),完全可以用來實(shí)現(xiàn)應(yīng)用程序文件安裝的目標(biāo),而且價(jià)格免費(fèi),透明度高,安裝程序小,可完全定制。
INF
文件是文本文件,可在任何文本編輯器內(nèi)查看、創(chuàng)建、修改,普通用戶使用
Windows
系統(tǒng)本身提供的記事本、寫字板即可進(jìn)行文件安裝腳本的編寫。
INF
文件安裝動(dòng)作的觸發(fā)機(jī)制
在文件目錄中用鼠標(biāo)右擊
INF
文件,會(huì)顯示不同于其他擴(kuò)展名文件的
“
安裝
”
菜單。
Windows
平臺(tái)在計(jì)算機(jī)中完成初始安裝后,就注冊(cè)了
INF
文件的
“
安裝
”
動(dòng)作,此
“
安裝
”
動(dòng)作關(guān)聯(lián)命令行程序基本形式為
:
RunDll setupx.dll,InstallHinfSection section reboot-mode inf-name
如筆者目前正在使用的
Windows 98
系統(tǒng)注冊(cè)表中,
HKEY_CLASSES_ROOT\inffile\install\
command
鍵的默認(rèn)值為(
install
即為安裝):
C:\WINDOWS\rundll.exe setupx.dll,InstallHinfSection DefaultInstall 132 %1
其中,
rundll
程序以命令行的形式調(diào)用
Windows
的動(dòng)態(tài)鏈接庫,其命令格式為:
rundll.exe <DLL
文件名
>,<
入口點(diǎn)
>,<
調(diào)用參數(shù)
>
setupx.dll
是安裝
API(Setup API)
函數(shù)庫,包含了
InstallHinfSection
、
SetupGetInfSections
、
SetupInstallFromInfSection
、
SetupPromptForDisk
、
SetupDiCreateDevRegKey
等
INF
文件內(nèi)部語法檢查、節(jié)名搜索、注冊(cè)鍵創(chuàng)建等功能函數(shù)。
setupx.dll
與其后的入口點(diǎn)用逗號(hào)
(,)
分開,入口點(diǎn)是大小寫敏感的。
Section
是
INF
文件內(nèi)初始執(zhí)行節(jié)名,首先執(zhí)行該節(jié)內(nèi)容,默認(rèn)情況下名稱為
“DefaultInstall”
,系統(tǒng)用戶一般不宜對(duì)此做任何改動(dòng),如被改動(dòng),則在后續(xù)
INF
文件的
Install
節(jié)使用相應(yīng)修改后的名稱。
reboot-mode
是重啟動(dòng)參數(shù),指示在
INF
文件執(zhí)行后對(duì)系統(tǒng)的設(shè)置進(jìn)行了改變,操作系統(tǒng)是否重新啟動(dòng)。該參數(shù)一般設(shè)為
132
或
4
,即由安裝程序決定是否必須重啟動(dòng),因?yàn)槟承┰O(shè)置的改變必須在重啟動(dòng)后才能生效。
inf-name
是
INF
文件的名稱,
“%1”
即為所選中文件本身。
INF
文件內(nèi)部節(jié)
(Section)
的定義
INF
文件用特殊的文本文件格式編輯、保存,
Windows
內(nèi)建的安裝函數(shù)遵循既定的語法從
INF
文件內(nèi)獲取安裝信息。
INF
文件和初始化
(
或稱私有化,
Private File)
文件相似,采用節(jié)
(Section)
和入口
(Entries)
的索引機(jī)制,節(jié)和入口定義了所有操作類型及操作對(duì)象。一個(gè)
INF
文件由不同類型的節(jié)組成,每類節(jié)都有其特殊的目的和不同的實(shí)現(xiàn)語法,每節(jié)的內(nèi)容均服務(wù)于該節(jié)的目的。除了基本的識(shí)別
INF
格式的
“Version”
節(jié)外,
INF
文件中節(jié)的數(shù)目和類型沒有限制,主要取決于具體安裝任務(wù)。一個(gè)基本的
INF
文件,一般包含如下幾節(jié):
?
節(jié)的名稱
|
節(jié)的作用
|
[Version]
|
INF
文件頭,提供有效
INF
文件的版本信息
|
[DefaultInstall]
|
安裝包含所關(guān)聯(lián)動(dòng)作(文件拷貝或刪除,注冊(cè)表鍵值更新、子鍵增刪等)在
INF
文件內(nèi)的節(jié)名指針,默認(rèn)情況下首先執(zhí)行該節(jié)內(nèi)容
|
[OtherInstall]
|
與
[DefaultInstall]
節(jié)遵循相同的語法,但必須顯式的調(diào)用,常被用來定義反安裝動(dòng)作
|
[DestinationDirs]
|
指定羅列于一個(gè)節(jié)內(nèi)將被拷貝、刪除或重命名的文件在硬盤上的位置
|
[FileCopy/Delete/RenameSection(s)]
|
羅列將被拷貝、刪除或重命名的文件
|
[RegistryUpdateSection(s)]
|
指定對(duì)注冊(cè)表鍵值更新、子鍵增刪等動(dòng)作
|
[IniFileUpdateSection(s)]
|
指定對(duì)
ini
文件的更新、快捷方式可通過該節(jié)進(jìn)行創(chuàng)建
|
[SourceDisksNames]
|
羅列文件所在盤盤名、盤卷標(biāo)、盤序列號(hào)
|
[SourceDisksFiles]
|
羅列安裝時(shí)使用的源文件及其所在盤
|
[Strings]
|
羅列本地化字符串(或稱宏字符串)
|
表中黑體節(jié)名是保留關(guān)鍵字,名稱固定,大小寫不敏感,斜體節(jié)名名稱任意,由
INF
文件編寫者確定。每節(jié)的標(biāo)題字符均用括號(hào)
([])
括起。
限于篇幅本文只對(duì)黑體節(jié)名做進(jìn)一步的解釋。
[Version]
節(jié)
任何
INF
文件的第一個(gè)小節(jié)均是
[Version]
,又稱為
INF
文件頭。一般有如下語句:
[Version]
Signature=“$Chicago$”
LayoutFile=filename.inf
其中,
Signature
的值應(yīng)為
“$Chicago$”
、
“$Windows 95$”
或
“$Windows NT$”
中的一個(gè)
(
不區(qū)分大小寫
)
,否則
Windows
不接受該文件為
INF
文件,內(nèi)建的動(dòng)作也就不會(huì)起作用。
filename.inf
文件包含安裝組件必需的安裝布局信息
(
源盤和源文件
)
,該行是可選的,如果沒有提供布局信息文件,則在
INF
文件內(nèi)必須包含
[SourceDisksNames]
和
[SourceDisksFiles]
節(jié)。
[Install]
節(jié)
[Install]
節(jié)提供了一個(gè)
INF
文件安裝過程的總覽,它識(shí)別文件內(nèi)其他包含安裝信息節(jié)的詳細(xì)動(dòng)作,是
Windows
內(nèi)建安裝函數(shù)識(shí)別安裝過程和內(nèi)容的真正入口,用戶所有的安裝目的在這里表現(xiàn)。那些與
[Install]
節(jié)內(nèi)容不存在關(guān)聯(lián)的節(jié)的動(dòng)作將被忽略。
[Install]
節(jié)分
[DefaultInstall]
和
[OtherInstall]
兩類,它們使用相同的格式。
[DefaultInstall]
節(jié)節(jié)名
“DefaultInstall”
如前面表格內(nèi)容所述被顯式地在注冊(cè)表中指定,大小寫不敏感。該節(jié)也是系統(tǒng)獲取
INF
文件中安裝信息的首要入口,當(dāng)用戶右擊
INF
文件選
“
安裝
”
時(shí)該節(jié)內(nèi)容被執(zhí)行。
[OtherInstall]
與
[DefaultInstall]
節(jié)遵循相同的語法
,
但必須被顯式地調(diào)用,常被用來定義反安裝動(dòng)作。它們均可包括以下種類的可選入口
:
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
上面的入口并非都必需,如果需要一個(gè)入口,則應(yīng)該在等號(hào)右側(cè)指出存在于該
INF
文件內(nèi)的索引節(jié)名
(
不用指出節(jié)名的一個(gè)特例是
CopyFiles
入口
,
可使用
“@”
字符后跟文件名的形式,效果是直接將文件拷貝到
DestinationDirs
節(jié)所羅列的硬盤目錄
)
。節(jié)名需由可打印字符組成,在中文系統(tǒng)平臺(tái)中,可使用中文字符作為節(jié)名,這也是體現(xiàn)
INF
格式安裝本地化的地方,非常直觀。每類入口在一個(gè)
[Install]
節(jié)內(nèi)只能出現(xiàn)一次,第二次及以后出現(xiàn)的同名重復(fù)入口將被忽略。每類入口的等號(hào)右側(cè)可羅列多個(gè)節(jié)名,節(jié)名之間以逗號(hào)分開,以便列舉同一類動(dòng)作的不同作用對(duì)象,如刪除多個(gè)注冊(cè)表鍵、拷貝文件到多個(gè)目錄路徑等。
下表是各類入口的動(dòng)作含義,具體語法本文不做細(xì)述
:
?
CopyFiles
|
等號(hào)右側(cè)是拷貝文件羅列節(jié)節(jié)名,將文件拷貝到
DestinationDirs
節(jié)指定的目的地,所有的源文件必須在
SourceDisksFiles
節(jié)列出
|
RenFiles
|
重命名文件
|
DelFiles
|
刪除文件
|
UpdateInis
|
安裝過程中更新
INI
初始化文件內(nèi)容
|
UpdateIniField
|
安裝過程中更新
INI
初始化文件值內(nèi)容
|
AddReg
|
增加注冊(cè)表鍵或鍵值
|
DelReg
|
刪除注冊(cè)表鍵或鍵值
|
Ini2Reg
|
用
INI
文件內(nèi)容更新注冊(cè)表
|
UpdateCfgSys
|
更新
Config.sys
文件內(nèi)的設(shè)置
|
UpdateAutoBat
|
更新
Autoexec.bat
文件內(nèi)的設(shè)置
|
在實(shí)際編寫
INF
文件時(shí),注冊(cè)表根鍵通常采用縮寫方式,如下表:
HKCR
|
HKEY_CLASSES_ROOT
的簡寫
|
HKCU
|
HKEY_CURRENT_USER
的簡寫
|
HKLM
|
HKEY_LOCAL_MACHINE
的簡寫
|
HKU
|
HKEY_USERS
的簡寫
|
HKR
|
相對(duì)鍵,對(duì)于硬件設(shè)備驅(qū)動(dòng)程序類安裝的
|
?
[DestinationDirs]
節(jié)
[DestinationDirs]
節(jié)指定拷貝、重命名或刪除文件三類動(dòng)作的目的目錄路徑,拷貝、重命名或刪除操作對(duì)象即文件的列表在專門的節(jié)中列出,這些節(jié)名最初在
“Install”
的
CopyFiles
、
RenFiles
或
DelFiles
入口中明確。
[DestinationDirs]
節(jié)內(nèi)語句的語法為:
file-list-section=LDID
,
[Subdir]
[DefaultDestDir=LDID
,
[Subdir]]
其中
file-list-section
為必選項(xiàng),是
CopyFiles
、
RenFiles
或
DelFiles
入口內(nèi)列出的節(jié)名。
LDID(Logical disk identifier)
為必選項(xiàng),是邏輯盤標(biāo)識(shí)碼,代表各種系統(tǒng)或?qū)崟r(shí)安裝路徑,邏輯盤標(biāo)識(shí)碼可看做一種宏字符串,隨系統(tǒng)或?qū)崟r(shí)安裝路徑的不同而相應(yīng)改變。邏輯盤標(biāo)識(shí)碼機(jī)制確保了安裝的靈活性和正確性,該標(biāo)識(shí)碼可為下表所述值之一:
Subdir
為可選項(xiàng),指定
LDID
目錄下的子目錄名。
DefaultDestDir
為可選項(xiàng),指定
CopyFiles
、
RenFiles
或
DelFiles
入口的缺省操作目錄。
[SourceDisksNames]
節(jié)
[SourceDisksNames]
節(jié)羅列源文件所在盤符序列碼、盤描述符、盤卷標(biāo)號(hào)和盤序列號(hào)。
[SourceDisksNames]
節(jié)內(nèi)語句的語法為:
disk-ordinal=“disk-description”,disk-label,disk-serial-number
其中
disk-ordinal
為必選項(xiàng),是盤符序列碼,標(biāo)識(shí)一個(gè)源盤,具有惟一性,一般可設(shè)置為從
1
開始遞增的整數(shù),
0
不是一個(gè)有效的盤符序列碼。當(dāng)存在多個(gè)源盤時(shí),盤符序列碼之間不能重復(fù)。
disk-description
為必選項(xiàng),是盤描述符,用雙引號(hào)括起的字符串或字符串宏描述盤的內(nèi)容或目的。安裝引擎將該字符串顯示在對(duì)話框內(nèi)以提示用戶。
disk-label
為源盤的卷標(biāo)識(shí)。
disk-serial-number
未使用,但必須被設(shè)置為
0
。
[SourceDisksFiles]
節(jié)
[SourceDisksFiles]
節(jié)指定安裝時(shí)使用的源文件和盤符序列碼、盤描述符。
[SourceDisksFiles]
節(jié)內(nèi)語句的語法為:
file-name=disk-number[,subdir] [,file-size]
其中
file-name
為必選項(xiàng),是源盤上文件的名稱。
disk-number
是包含
file-name
指定文件所在源盤的盤符序列碼,該盤符序列碼需在
[SourceDisksNames]
節(jié)中列出
,
并大于或等于
1
。
Subdir
為可選項(xiàng),指定文件所在源盤的子目錄,如省略則源盤為缺省安裝路徑。
file-size
為可選項(xiàng),表明文件的大小,以字節(jié)為單位。
[Strings]
節(jié)
[Strings]
節(jié)定義一個(gè)或多個(gè)本地化字符串,或稱字符串宏。盡管
[Strings]
節(jié)一般被放置在
INF
文件的末尾,字符串宏可在
INF
文件任何地方使用,安裝引擎解釋、展開字符串宏為給定的長字符串并做進(jìn)一步處理。字符串宏在使用時(shí)需用百分號(hào)
(%)
括起。
[Strings]
節(jié)內(nèi)語句的語法為:
strings-key=value
其中
strings-key
為由字母或數(shù)字等可打印字符組成的宏名。
Value
為被雙引號(hào)括起的長字符串,字符串可由字母、數(shù)字或其他可打印字符組成。
一個(gè)具體的安裝實(shí)例
本文接下來列舉一個(gè)名為
“Mysetup.inf”
的安裝信息文件實(shí)例,以便讀者熟悉
INF
文件語法,領(lǐng)略
INF
文件的安裝效果。該
“Mysetup.inf”
文件可完成如下的安裝任務(wù):假設(shè)應(yīng)用程序有
“MyApp.exe”
、
“MyApp.hlp”
、
“MyApp.dll”
等幾個(gè)需安裝到應(yīng)用程序主目錄的文件,有
“Ass_1.dll”
、
“Ass_2.dll”
等幾個(gè)需安裝到
Windows\System
子目錄的文件,要求將各文件按預(yù)定目錄位置拷貝到位,其中應(yīng)用程序主目錄可在安裝過程中選定,同時(shí),在
“
開始
>
程序
”
下面建立名為
“
我的程序組
”
的程序組,在該程序組下建立名為
“
我的應(yīng)用程序
”
、
“
我的應(yīng)用程序幫助
”
的兩個(gè)程序項(xiàng),分別與
“MyApp.exe”
和
“MyApp.hlp”
文件關(guān)聯(lián)。
完成上述安裝任務(wù)的
“Mysetup.inf”
文件內(nèi)容如下:
[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]
“”
,
“”
,
“”,
,
““
默認(rèn)安裝到
“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,,“““
我的應(yīng)用程序
””,““““““%49000%\MyApp.exe””””””,,,,,““MyApp.exe”””
[
加
hlp
文件快捷方式
]
setup.ini, progman.groups,, “group1=““
我的程序組
”””
setup.ini, group1,,“““
我的應(yīng)用程序幫助
””,““““““%49000%\MyApp.hlp””””””,,,,,““MyApp.hlp”””
讀者會(huì)注意到上面的文件內(nèi)許多鍵名使用了中文,這是因?yàn)?/span>
INF
格式文件支持中文提示及中文鍵名。這些中文鍵名不僅充當(dāng)功能鍵起索引的作用,還形象化地標(biāo)識(shí)了鍵的前后對(duì)應(yīng)關(guān)系,增強(qiáng)了文件內(nèi)容的可讀性,有利于后續(xù)更改、維護(hù)。
安裝時(shí),首先確保應(yīng)用程序的所有待安裝文件和
“Mysetup.inf”
文件處在同一個(gè)目錄下,右擊
“Mysetup.inf”
文件選
“
安裝
”
或按
Shift
鍵的同時(shí)按功能鍵
F10
。待目錄選擇對(duì)話框出現(xiàn),點(diǎn)擊
“
瀏覽
”
按鈕或直接在文本編輯框內(nèi)鍵入目錄名稱后,屏幕顯示文件安裝拷貝和更新快捷方式進(jìn)度,最終結(jié)束。
打開資源管理器,就可查看到所有文件均已拷貝到指定目錄位置。點(diǎn)擊
“
開始
>
程序
”
,可以找到
“
我的程序組
”
程序組及下屬的
“
我的應(yīng)用程序
”
、
“
我的應(yīng)用程序幫助
”
程序項(xiàng),選中程序項(xiàng)均能激活對(duì)應(yīng)文件,說明文件安裝及快捷方式關(guān)聯(lián)均告成功。
小
結(jié)
本文介紹的文件安裝方法適合于大眾,讀者可熟悉語法、參考例子、效仿編寫,制作出自己的安裝信息文件。