丁健
張萬
江南
安裝信息
(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
。待目錄選擇對話框出現,點擊
“
瀏覽
”
按鈕或直接在文本編輯框內鍵入目錄名稱后,屏幕顯示文件安裝拷貝和更新快捷方式進度,最終結束。
打開資源管理器,就可查看到所有文件均已拷貝到指定目錄位置。點擊
“
開始
>
程序
”
,可以找到
“
我的程序組
”
程序組及下屬的
“
我的應用程序
”
、
“
我的應用程序幫助
”
程序項,選中程序項均能激活對應文件,說明文件安裝及快捷方式關聯均告成功。
小
結
本文介紹的文件安裝方法適合于大眾,讀者可熟悉語法、參考例子、效仿編寫,制作出自己的安裝信息文件。