全方位掌握 NSIS 的使用
Posted on 2008-01-30 11:48 Matthew Chen 閱讀(750) 評(píng)論(0) 編輯 收藏 所屬分類: Softwares ConfigurationsNSIS 確實(shí)是一個(gè)不錯(cuò)的安裝程序制作軟件。新版本 2.0a7 真正實(shí)現(xiàn)了中文支持和支持 WinXP 的安裝對(duì)話框。不過(guò)要用它實(shí)現(xiàn)漂亮的安裝界面和完美的安裝功能就必須好好的寫腳本。而 NSIS 的腳本指令是在是太多了,有時(shí)候覺(jué)得好像又回到了學(xué)習(xí) C 語(yǔ)言的年代。他豐富而起強(qiáng)大的功能甚至可以編譯出一些小而使用的軟件(例如查找窗口句柄,然后...)好了,不多說(shuō)。我在這里著重介紹關(guān)于 NSIS 的一些使用問(wèn)題以及新界面安裝程序的制作過(guò)程,中間會(huì)附上一個(gè)示例腳本。
這里只說(shuō)單語(yǔ)言的簡(jiǎn)體中文
1. NSIS的運(yùn)行問(wèn)題
2.0a7 的 NSIS 安裝在長(zhǎng)文件名的目錄中好像會(huì)有問(wèn)題(Win2k 和 WinXP 下,Win98 下好像沒(méi)問(wèn)題)。你若是將NSIS 安裝在類似于“E:\System\Installer\NSIS 的目錄中”(其中的“Installer”是超過(guò)了 8 個(gè)字符的長(zhǎng)文件名),運(yùn)行 makensisw 或是直接在命令提示符中使用 makensis 可能會(huì)非法操作。
解決的辦法是:在命令提示符下使用如下指令:
cd E:\System\Instal~1\NSIS
進(jìn)入 NSIS 安裝目錄后使用命令行:
makensis /CD /X"Compressor bzip2" "f:\1.nsi"
你可以在腳本文件中使用了“SetCompressor bzip2”指令,這樣就可以去掉“/X"Compressor bzip2"”參數(shù)。使用 makensisw 的朋友我就不多說(shuō)了,你可以從我上面的分析中得到點(diǎn)啟發(fā)。自己設(shè)置一下它的運(yùn)行參數(shù)吧!不過(guò) makensisw 也有 Bug,若用 makensisw 編譯時(shí)發(fā)現(xiàn)腳本錯(cuò)誤,程序就立馬非法操作。
2. 關(guān)于腳本的整體布局
說(shuō) NSIS 有些象高級(jí)語(yǔ)言的語(yǔ)法一點(diǎn)沒(méi)錯(cuò)。NSIS 的語(yǔ)法非常注重先后順序(我曾經(jīng)為了一個(gè)指令的先后順序來(lái)回 Ctrl+C & Ctrl+V 了 N 次)。例如象它的幫助文件中提到的“SetFont”指令必須在“AddBrandingImage”指令之前等。我在這里要說(shuō)的而是關(guān)于如何正確的對(duì)腳本進(jìn)行整體布局,使其能更加合理、高效的被使用,這樣才有利于日后的安裝程序更新
你可以用我后面的示例腳本為模板制作自己的 NSIS 腳本。
大體布局如下:
//////////////////////////////////////////////////////////////
預(yù)設(shè)參數(shù)(包括外部壓縮器選擇、編譯選項(xiàng)、宏定義以及文件包含等)
普通安裝設(shè)置
自定義函數(shù)
安裝程序區(qū)域內(nèi)容
安裝程序回調(diào)函數(shù)及其相關(guān)函數(shù)定義
卸載程序區(qū)域內(nèi)容
卸載程序回調(diào)函數(shù)及其相關(guān)函數(shù)定義
//////////////////////////////////////////////////////////////
3. 關(guān)于安裝程序 Logo 畫面的說(shuō)明:
先前版本的 NSIS 使用 splash.exe 制作 logo畫面,但若您使用 2.0a7,
我建議您使用(好像也只能使用)magiclime.exe,它在 Win2k 和 WinXP
下顯示 logo畫面時(shí)會(huì)有淡入淡出的效果。超 Cool....
4. 關(guān)于標(biāo)牌位圖(即顯示在安裝程序?qū)υ捒蛑械淖远x位圖)的說(shuō)明:
2.0a7 提供了宏指令用于在安裝程序的對(duì)話框中顯示標(biāo)牌位圖。當(dāng)然你也可以用標(biāo)準(zhǔn)的 NSIS 指令。
5. 關(guān)于使用新的 Modern UI 界面的說(shuō)明:
2.0a7 同樣提供了宏指令使你可以使用全新的安裝界面:
首先你需要安裝 NSIS v2.0a7 簡(jiǎn)體中文補(bǔ)丁(漢化新世紀(jì)有下載):
然后打開(kāi)安裝目錄下的 Examples\Modern UI\ModernUI.nsh 文件,將從
!macro MUI_INTERFACE UI ICON UNICON CHECKS PROGRESSBAR
到第一個(gè)
!macroend
之間的注釋符(即分號(hào))刪除(若沒(méi)有這步究省了)。保存。
接下來(lái)就可以在你自己的腳本中使用形式對(duì)話框了,并且支持 WinXP 的新的視覺(jué)效果樣式。
6. 以下是我的示例腳本:
引用來(lái)自 2005-12-7 上午 10:15:26
7.注意兩個(gè)標(biāo)牌位圖列表宏指令必須放置到函數(shù)的后面,就像我編寫的那樣,安裝程序的標(biāo)牌位
圖列表放置到到所有安裝程序回調(diào)函數(shù)的后面;卸載程序的標(biāo)牌位圖列表放置到所有卸載程序回
調(diào)函數(shù)的后面。
關(guān)鍵是要注意整體布局(這樣才不會(huì)看迷糊),當(dāng)然若編譯不能通過(guò),就要進(jìn)行合適的調(diào)整。
8. 使用指令:
makensis /CD f:\study.nsi"
進(jìn)行編譯(這個(gè)示例腳本我沒(méi)試過(guò)-_-,若編譯無(wú)法通過(guò)只好自己動(dòng)手研究研究了。我放出來(lái)只是用于參考學(xué)習(xí))
9. 還沒(méi)完—— NSIS 對(duì)多語(yǔ)言的支持還是不夠完美(注意:是完美——有點(diǎn)雞蛋里挑骨頭的味道)。
我們繼續(xù):
用 ExeScope (其他的資源編輯器也行,別說(shuō)你沒(méi)有)打開(kāi)生成的 study.exe 文件,找到對(duì)話框資源的 105 項(xiàng)目。你會(huì)發(fā)現(xiàn)有一塊很明顯的用以顯示標(biāo)牌位圖的控件。因?yàn)?NSIS 在插件此控件時(shí)是使其保持于授權(quán)協(xié)議文件控件等高的,所以當(dāng)使用用 modern2.exe 對(duì)話框模板時(shí)會(huì)與對(duì)話框頂部多出 45 的距離——不羅嗦了,總之根據(jù)需要搞得好看就行(別過(guò)火!)。順便提一下,NSIS 安裝目中的 Contrib\UIs 子目錄下提供了多種對(duì)話框模板,你可以自行選用(就是用
ChangeUI 指令或用宏指令),甚至根據(jù)需要用資源編輯器修改模板資源。
接著修改:找到 111 項(xiàng),把里面的資源漢化掉(新的界面居然沒(méi)有對(duì)此對(duì)話框的多語(yǔ)言支持!這個(gè)對(duì)話框只有在大容量的安裝程序執(zhí)行時(shí)才顯示)。
用 ExeScope 更新后,再用 Hex WorkShop 打開(kāi)我問(wèn)可憐的試驗(yàn)品——study.exe,查找字符串“unpacking data: ”(沒(méi)引號(hào)的,你別瞎加。找不到別怪我 $_$)。找到后處理一下,用“正在解壓縮數(shù)據(jù):”
替換(正好 8 個(gè)字符 Yeah?。?
10. 現(xiàn)在我要說(shuō)為什么不啟用 UPX 壓縮以及關(guān)閉 CRC 檢測(cè):
用 UPX 壓縮可執(zhí)行文件頭或啟用 CRC 檢測(cè)(起用的話就是打開(kāi)了自校驗(yàn)),我們的 ExeScope 就無(wú)用武之地了(除非你夠牛會(huì)動(dòng)態(tài)跟蹤技術(shù)和反匯編把文件頭殼和自校驗(yàn)去掉,否則還是關(guān)掉的好)。
至此全部完工。
若有任何語(yǔ)法難點(diǎn),請(qǐng)參閱 NSIS 的幫助文件。內(nèi)有上千字的詳細(xì)說(shuō)明(可能更多,我也沒(méi)統(tǒng)計(jì)過(guò))。還有一些指令我沒(méi)有用上,因?yàn)槟切┎惶赡苡玫纳稀?
這個(gè)示例腳本已能作出較佳的安裝程序界面,大家可以下載我為 QCD v3.40B35 做的安裝界面。
有問(wèn)題請(qǐng)跟貼。歡迎一起交流。
出處:http://bbs.hanzify.org/bbs/cgi-bin/topic.cgi?forum=8&topic=1010
這里只說(shuō)單語(yǔ)言的簡(jiǎn)體中文
1. NSIS的運(yùn)行問(wèn)題
2.0a7 的 NSIS 安裝在長(zhǎng)文件名的目錄中好像會(huì)有問(wèn)題(Win2k 和 WinXP 下,Win98 下好像沒(méi)問(wèn)題)。你若是將NSIS 安裝在類似于“E:\System\Installer\NSIS 的目錄中”(其中的“Installer”是超過(guò)了 8 個(gè)字符的長(zhǎng)文件名),運(yùn)行 makensisw 或是直接在命令提示符中使用 makensis 可能會(huì)非法操作。
解決的辦法是:在命令提示符下使用如下指令:
cd E:\System\Instal~1\NSIS
進(jìn)入 NSIS 安裝目錄后使用命令行:
makensis /CD /X"Compressor bzip2" "f:\1.nsi"
你可以在腳本文件中使用了“SetCompressor bzip2”指令,這樣就可以去掉“/X"Compressor bzip2"”參數(shù)。使用 makensisw 的朋友我就不多說(shuō)了,你可以從我上面的分析中得到點(diǎn)啟發(fā)。自己設(shè)置一下它的運(yùn)行參數(shù)吧!不過(guò) makensisw 也有 Bug,若用 makensisw 編譯時(shí)發(fā)現(xiàn)腳本錯(cuò)誤,程序就立馬非法操作。
2. 關(guān)于腳本的整體布局
說(shuō) NSIS 有些象高級(jí)語(yǔ)言的語(yǔ)法一點(diǎn)沒(méi)錯(cuò)。NSIS 的語(yǔ)法非常注重先后順序(我曾經(jīng)為了一個(gè)指令的先后順序來(lái)回 Ctrl+C & Ctrl+V 了 N 次)。例如象它的幫助文件中提到的“SetFont”指令必須在“AddBrandingImage”指令之前等。我在這里要說(shuō)的而是關(guān)于如何正確的對(duì)腳本進(jìn)行整體布局,使其能更加合理、高效的被使用,這樣才有利于日后的安裝程序更新
你可以用我后面的示例腳本為模板制作自己的 NSIS 腳本。
大體布局如下:
//////////////////////////////////////////////////////////////
預(yù)設(shè)參數(shù)(包括外部壓縮器選擇、編譯選項(xiàng)、宏定義以及文件包含等)
普通安裝設(shè)置
自定義函數(shù)
安裝程序區(qū)域內(nèi)容
安裝程序回調(diào)函數(shù)及其相關(guān)函數(shù)定義
卸載程序區(qū)域內(nèi)容
卸載程序回調(diào)函數(shù)及其相關(guān)函數(shù)定義
//////////////////////////////////////////////////////////////
3. 關(guān)于安裝程序 Logo 畫面的說(shuō)明:
先前版本的 NSIS 使用 splash.exe 制作 logo畫面,但若您使用 2.0a7,
我建議您使用(好像也只能使用)magiclime.exe,它在 Win2k 和 WinXP
下顯示 logo畫面時(shí)會(huì)有淡入淡出的效果。超 Cool....
4. 關(guān)于標(biāo)牌位圖(即顯示在安裝程序?qū)υ捒蛑械淖远x位圖)的說(shuō)明:
2.0a7 提供了宏指令用于在安裝程序的對(duì)話框中顯示標(biāo)牌位圖。當(dāng)然你也可以用標(biāo)準(zhǔn)的 NSIS 指令。
5. 關(guān)于使用新的 Modern UI 界面的說(shuō)明:
2.0a7 同樣提供了宏指令使你可以使用全新的安裝界面:
首先你需要安裝 NSIS v2.0a7 簡(jiǎn)體中文補(bǔ)丁(漢化新世紀(jì)有下載):
然后打開(kāi)安裝目錄下的 Examples\Modern UI\ModernUI.nsh 文件,將從
!macro MUI_INTERFACE UI ICON UNICON CHECKS PROGRESSBAR
到第一個(gè)
!macroend
之間的注釋符(即分號(hào))刪除(若沒(méi)有這步究省了)。保存。
接下來(lái)就可以在你自己的腳本中使用形式對(duì)話框了,并且支持 WinXP 的新的視覺(jué)效果樣式。
6. 以下是我的示例腳本:

////////////////////////////////////////////////////////////////////////////
[color=#008000]; study.nsi
;
; 以下腳本用以生成 study.exe 文件
; 它包含有授權(quán)協(xié)議
;
; 安裝時(shí)若發(fā)現(xiàn)應(yīng)用程序正在運(yùn)行,安裝程序會(huì)提示并替用戶關(guān)閉應(yīng)用程序
; 安裝成功后會(huì)自動(dòng)運(yùn)行應(yīng)用程序
;
; 啟用新的 Modern UI 的宏指令語(yǔ)法,原先的部分指令將被禁止以防止重復(fù)
; 我會(huì)盡量展示如何基本指令的用法。當(dāng)然宏指令也會(huì)與一些基本指令發(fā)生重
; 復(fù)定義的情況,不過(guò) NSIS 照樣能編譯成功.
; 其中的一些路徑、文件你可以根據(jù)需要更改
; 啟用外部壓縮工具(這里我們不用,原因看第 10 步)
;!define HAVE_UPX
; 若啟用了外部壓縮工具,這進(jìn)行可執(zhí)行文件頭的壓縮
!ifdef HAVE_UPX
; 用 UPX 壓縮可執(zhí)行文件頭(用其他的相關(guān)工具也行)
!packhdr tmp.dat "E:UPX\upx --best tmp.dat"
!endif
; 編譯選項(xiàng)
; 設(shè)置覆蓋標(biāo)記
SetOverwrite on
; 設(shè)置壓縮選項(xiàng)
SetCompress auto
; 選擇壓縮方式
SetCompressor bzip2
; 設(shè)置數(shù)據(jù)塊優(yōu)化
SetDatablockOptimize on
; 設(shè)置數(shù)據(jù)寫入時(shí)間
SetDateSave on
; 相關(guān)數(shù)據(jù)預(yù)設(shè)
; 軟件的名字,后面的${NAME}調(diào)用這個(gè)名字
!define NAME "NSIS"
!define NAME_FULL "全方位掌握 NSIS 的使用"
!verbose 3
; 包含窗口消息定義文件
!include "${NSISDIR}\Examples\WinMessages.nsh"
; 包含新界面的宏指令文件
!include "${NSISDIR}\Examples\Modern UI\ModernUI.nsh"
; 包含標(biāo)牌位圖宏指令文件
!include "${NSISDIR}\Examples\branding.nsh"
!verbose 4
!define CURRENTPAGE $9
!define TEMP1 $R0
!define TEMP2 $R1
; 插入安裝界面宏定義(這里我禁用了,啟用也沒(méi)問(wèn)題。編譯照樣通過(guò)。后面我都定義過(guò)了)
;!insertmacro MUI_INTERFACE "modern2.exe" "adni18-installer-C-no48xp.ico" "adni18-uninstall-C-no48xp.ico" "modern.bmp" "smooth"
; 安裝程序設(shè)置
; 輸出文件
OutFile "F:\study.exe"
; 安裝程序名稱
Name /LANG=2052 "NSIS"
; 替換對(duì)話框樣式
ChangeUI all "${NSISDIR}\Contrib\UIs\modern2.exe"
; 啟用 WindowsXP 的視覺(jué)樣式
XPstyle on
;設(shè)置字體
SetFont 宋體 9
; 標(biāo)題名稱
Caption /LANG=2052 "全方位掌握 NSIS 的使用"
; 標(biāo)牌的內(nèi)容
BrandingText /LANG=2052 /TRIMCENTER "Shao Hao"
; 安裝程序圖標(biāo)
Icon "F:\12\QCDIcon.ico"
; 安裝程序顯示標(biāo)題
WindowIcon on
; 添加標(biāo)牌位圖(放在頂部用 TOP 參數(shù)。后面接高度)
AddBrandingImage LEFT 105
; 設(shè)定漸變背景
BGGradient off
; 設(shè)置安靜安裝模式
;SilentInstall normal
; 設(shè)置安靜卸載模式
;SilentUnInstall normal
; 執(zhí)行 CRC 檢查(最好用 on 打開(kāi)。關(guān)閉是因?yàn)檫€要修改安裝程序,看第 10 步)
CRCCheck off
; 加載相應(yīng)的語(yǔ)言文件
LoadLanguageFile "${NSISDIR}\Contrib\Language files\SimpChinese.nlf"
; 替換各個(gè)對(duì)話框標(biāo)題的文字
SubCaption /LANG=2052 0 "授權(quán)協(xié)議"
SubCaption /LANG=2052 1 "安裝選項(xiàng)"
SubCaption /LANG=2052 2 "安裝目錄"
SubCaption /LANG=2052 3 "正在安裝"
SubCaption /LANG=2052 4 "完成安裝"
; 替換默認(rèn)按鈕的文字
MiscButtonText /LANG=2052 "< 上一步" "下一步 >" "取消" "關(guān)閉"
; 替換“安裝”按鈕的文字
;InstallButtonText /LANG=2052 "安裝"
; 替換當(dāng)文件無(wú)法被寫入時(shí)的警告窗的文字
FileErrorText /LANG=2052 "無(wú)法寫入文件$\r$\n$0$\r$\n請(qǐng)確認(rèn)文件屬性不是只讀且未被使用中!"
; 默認(rèn)的安裝目錄
InstallDir "$PROGRAMFILES\QCD 3"
; 如果可能的化從注冊(cè)表中監(jiān)測(cè)安裝路徑
InstallDirRegKey HKLM \
"Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" \
"UninstallString"
; 授權(quán)協(xié)議頁(yè)面
LicenseText /LANG=2052 "NSIS 是免費(fèi)軟件。安裝前請(qǐng)先閱讀以下協(xié)議條款" "我同意"
; 使用授權(quán)協(xié)議文本
LicenseData /LANG=2052 "F:\12\License.txt"
; 設(shè)置授權(quán)協(xié)議頁(yè)面的背景色
;LicenseBkColor 000000
; 選擇要按安裝的組件
ComponentText /LANG=2052 "現(xiàn)在將安裝 ${NAME_FULL}到您的計(jì)算機(jī):" "請(qǐng)選擇安裝類型" "或選擇您希望安裝的組件"
InstType "完全安裝(都在了)"
InstType "典型安裝"
InstType /LANG=2052 /CUSTOMSTRING=自定義?
;InstType /LANG=2052 /NOCUSTOM
;InstType /COMPONENTSONLYONCUSTOM
CheckBitmap "${NSISDIR}\Contrib\Icons\modern.bmp"
; 替換顯示磁盤空間信息的文字
SpaceTexts /LANG=2052 "所需空間:" "可用空間:"
; 提示用戶輸入目錄的文本
; DirShow hide
; 替換顯示選擇安裝目錄的文字
DirText /LANG=2052 "請(qǐng)選擇 ${NAME} 的安裝路徑:" "選擇目錄用以安裝 ${NAME}:" "瀏覽..."
; 是否允許安裝在根目錄下
AllowRootDirInstall false
; 安裝信息的顏色
;InstallColors 000000 FFFFFF
; 安裝進(jìn)度條顯示方式
InstProgressFlags smooth colored
; 完成后自動(dòng)關(guān)閉安裝程序
AutoCloseWindow true
; 顯示“顯示詳細(xì)細(xì)節(jié)”對(duì)話框
ShowInstDetails hide
; 替換“顯示細(xì)節(jié)”按鈕的文字
DetailsButtonText /LANG=2052 "顯示細(xì)節(jié)"
; 替換“完成”按鈕的文字
CompletedText /LANG=2052 "已完成"
; 卸載程序設(shè)置
; 替換卸載程序的文字
UninstallText /LANG=2052 "現(xiàn)在將從你的系統(tǒng)中卸載 ${NAME}:" "卸載目錄:"
; 卸載程序圖標(biāo)
UninstallIcon "F:\12\UnQCDIcon.ico"
; 替換卸載程序標(biāo)題的文字
UninstallCaption /LANG=2052 "卸載 ${NAME}"
; 替換卸載程序每頁(yè)按鈕的文字
UninstallSubCaption /LANG=2052 0 ":確認(rèn)"
UninstallSubCaption /LANG=2052 1 ":正在刪除文件"
UninstallSubCaption /LANG=2052 2 ":完成"
; 卸載程序顯示方式
ShowUninstDetails hide
; 替換“卸載”按鈕的文字
UninstallButtonText /LANG=2052 "卸載"
; 安裝程序內(nèi)容及其相關(guān)的回調(diào)函數(shù)
; 安裝程序內(nèi)容
Section /e "!主要程序(必須安裝)" SecCore
SectionIn 1 2 RO
; 設(shè)置輸出路徑,每次使用都會(huì)改變
SetOutPath $INSTDIR
; 循環(huán)包含目錄下全部?jī)?nèi)容
File /r "F:\12\1\*.*"
; 只包含一個(gè)文件
File "F:\12\gf.gif"
; 處理動(dòng)態(tài)連接庫(kù)文件
IfFileExists "$INSTDIR\1.dll" 0 NoFile1
; 取消組件注冊(cè)
UnRegDll "$INSTDIR\1.dll"
Delete "$INSTDIR\1.dll"
NoFile1:
File "F:\12\1.dll"
; 注冊(cè)組件
RegDLL "$INSTDIR\QCDIconMgr.dll"
; 寫入軟件注冊(cè)鍵值
WriteRegStr HKLM "Software\NSIS\NSIS" "" "$INSTDIR"
; 為 Windows 卸載程序?qū)懭腈I值
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "DisplayName" "NSIS(只用于移除)"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "UninstallString" '"$INSTDIR\uninst.exe"'
; 寫入生成卸載程序(可多次使用)
WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd
Section /e "擴(kuò)展(可選)" SecUpdate
SectionIn 1
SetOutPath "$INSTDIR\Plugins"
File "F:\12\qcdplus\Plugins\2.dll"
File /r "F:\12\qcdplus\Plugins\3"
SectionEnd
SubSection /e "選項(xiàng)" SecOptions
Section /e "創(chuàng)建桌面圖標(biāo)" SecDesktopShortCut
SectionIn 1 2
SetOutPath "$INSTDIR\Plugins"
CreateShortCut "$DESKTOP\NSIS.lnk" "$INSTDIR\gf.gif"
WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd
Section /e "創(chuàng)建快速啟動(dòng)欄圖標(biāo)" SecQuickbarShortCut
SectionIn 1 2
SetOutPath "$INSTDIR\Plugins"
CreateShortCut "$QUICKLAUNCH\NSIS.lnk" "$INSTDIR\gf.gif"
WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd
Section /e "創(chuàng)建 NSIS 程序組" SecShortCutGroup
SectionIn 1 2
SetOutPath "$INSTDIR\Plugins"
CreateDirectory "$SMPROGRAMS\NSIS"
CreateShortCut "$SMPROGRAMS\QCD Player\gf.lnk" "$INSTDIR\gf.gif"
WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd
SubSectionEnd
Section "-Run"; 運(yùn)行?
ExecWait '"$INSTDIR\2.exe" -p'
WriteINIStr "$INSTDIR\NSIS.ini" "2" "Language" "Chinese"
Exec "$INSTDIR\2.exe"
ExecShell open "$INSTDIR\漢化說(shuō)明.htm"
SectionEnd
Section ""
;Invisible section to display the Finish header
!insertmacro MUI_FINISHHEADER SetHeader
SectionEnd
; 安裝程序初始化設(shè)置
Function .onInit
; 發(fā)現(xiàn)有程序正在運(yùn)行時(shí)提示退出后繼續(xù)運(yùn)行
loop:
FindWindow $R0 "NSIS"
IntCmp $R0 0 done
MessageBox MB_OKCANCEL \
"NSIS 正在運(yùn)行。$\n點(diǎn)擊“確定”按鈕會(huì)關(guān)閉 NSIS 然后繼續(xù)安裝,點(diǎn)擊“取消”按鈕將退出安裝程序" \
IDOK NoAbort
Abort
NoAbort:
SendMessage $R0 1029 0 0
; 稍等后繼續(xù)檢測(cè)直至檢測(cè)不到或用戶選擇取消
Sleep 444
Goto loop
done:
; 顯示 Logo 畫面
SetOutPath $TEMP
File /oname=qcd_logo.bmp "F:\12\logo.bmp"
File /oname=magiclime.exe "${NSISDIR}\Bin\magiclime.exe"
ExecWait '"$TEMP\magiclime.exe" qcd_logo.bmp'
Delete "$TEMP\magiclime.exe"
Delete "$TEMP\qcd_logo.bmp"
; 初始化標(biāo)牌位圖
!insertmacro BI_INIT $R0
FunctionEnd
; 安裝程序主界面的相關(guān)文本
Function SetHeader
!insertmacro MUI_HEADER_INIT
!insertmacro MUI_HEADER_START 1
!insertmacro MUI_HEADER_TEXT 2052 "授權(quán)協(xié)議" "安裝 ${NAME} 之前,請(qǐng)認(rèn)真閱讀一下授權(quán)條款."
!insertmacro MUI_HEADER_STOP 1
!insertmacro MUI_HEADER_START 2
!insertmacro MUI_HEADER_TEXT 2052 "選擇組件" "請(qǐng)選擇你要安裝的組件."
!insertmacro MUI_HEADER_STOP 2
!insertmacro MUI_HEADER_START 3
!insertmacro MUI_HEADER_TEXT 2052 "選擇安裝位置" "為 ${NAME} 選擇一個(gè)安裝目錄."
!insertmacro MUI_HEADER_STOP 3
!insertmacro MUI_HEADER_START 4
!insertmacro MUI_HEADER_TEXT 2052 "安裝" "${NAME} 已經(jīng)安裝,請(qǐng)等待."
!insertmacro MUI_HEADER_STOP 4
!insertmacro MUI_HEADER_START 5
!insertmacro MUI_HEADER_TEXT 2052 "完成" "安裝順利完成."
!insertmacro MUI_HEADER_STOP 5
!insertmacro MUI_HEADER_END
FunctionEnd
; 初始化安裝程序?qū)υ捒虻娘@示文本
Function .onInitDialog
!insertmacro MUI_INNERDIALOG_INIT
!insertmacro MUI_INNERDIALOG_START 1
!insertmacro MUI_INNERDIALOG_TEXT 2052 1040 "如果你同意協(xié)議中的所有條款,選擇“我同樣”繼續(xù)安裝,如果你選擇了“取消”,安裝程序?qū)⒔K止,只有接受條款才能安裝 ${NAME}."
!insertmacro MUI_INNERDIALOG_STOP 1
!insertmacro MUI_INNERDIALOG_START 2
!insertmacro MUI_INNERDIALOG_TEXT 2052 1042 "描述"
!insertmacro MUI_INNERDIALOG_TEXT 2052 1043 "移動(dòng)你的鼠標(biāo)到組件上,便可以見(jiàn)到相關(guān)的描述."
!insertmacro MUI_INNERDIALOG_STOP 2
!insertmacro MUI_INNERDIALOG_START 3
!insertmacro MUI_INNERDIALOG_TEXT 2052 1041 "目標(biāo)文件夾"
!insertmacro MUI_INNERDIALOG_STOP 3
!insertmacro MUI_INNERDIALOG_END
FunctionEnd
; 轉(zhuǎn)到下頁(yè)面時(shí)的處理
Function .onNextPage
!insertmacro MUI_NEXTPAGE_OUTER
!insertmacro MUI_NEXTPAGE SetHeader
; 標(biāo)牌位圖設(shè)置
!insertmacro BI_NEXT
FunctionEnd
; 轉(zhuǎn)到上一頁(yè)面時(shí)的處理
Function .onPrevPage
!insertmacro MUI_PREVPAGE
; 標(biāo)牌位圖設(shè)置
!insertmacro BI_PREV
FunctionEnd
; 鼠標(biāo)移到指定組件時(shí)的顯示處理
Function .onMouseOverSection
; 用宏指令設(shè)置安裝自己的注釋文本
!insertmacro MUI_DESCRIPTION_INIT
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecCore} "安裝主應(yīng)用程序"
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecUpdate} "安裝 NSIS 的更新或新增插件"
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecOptions} "選擇 NSIS 的其他安裝選項(xiàng),例如:創(chuàng)建快捷方式和應(yīng)用程序組的"
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecDesktopShortCut} "在用戶的桌面上創(chuàng)建 NSIS 的快捷方式"
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecQuickbarShortCut} "在用戶的快速欄里創(chuàng)建 NSIS 快捷方式"
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecShortCutGroup} "在用戶的開(kāi)始菜單的程序中創(chuàng)建 NSIS 的快捷方式組"
!insertmacro MUI_DESCRIPTION_END
FunctionEnd
; 安裝成功完成后的設(shè)置
Function .onInstSuccess
; 自己加吧:)
FunctionEnd
; 放棄安裝時(shí)警告窗口的顯示信息
Function .onUserAbort
!insertmacro MUI_ABORTWARNING 2052 "你確定要推出 ${NAME} 的安裝嗎?"
!insertmacro MUI_ABORTWARNING_END
FunctionEnd
; 安裝程序標(biāo)牌位圖列表
!insertmacro BI_LIST
!insertmacro BI_LIST_ADD "F:\12\Brand1.bmp" /RESIZETOFIT
!insertmacro BI_LIST_ADD "F:\12\Brand2.bmp" /RESIZETOFIT
!insertmacro BI_LIST_ADD "F:\12\Brand3.bmp" /RESIZETOFIT
!insertmacro BI_LIST_END
; 卸載程序及其相關(guān)回調(diào)函數(shù)
; 卸載程序內(nèi)容
Section "Uninstall"
ExecWait '"$INSTDIR\12.exe" /un'
; 循環(huán)刪除文件直至刪除文件夾
RMDir /r "$SMPROGRAMS\NSIS"
UnRegDLL "$INSTDIR\2.dll"
Delete "$INSTDIR\QCDIconMgr.dll"
Delete "$INSTDIR\*.*"
DeleteRegKey HKLM "Software\NSIS"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS"
MessageBox MB_YESNO|MB_ICONQUESTION \
"是否連插件目錄也要?jiǎng)h除?$\n(若您要保留這些文件,請(qǐng)點(diǎn)擊下面的“否”按鈕)" \
IDNO NoDelete
; 全刪光!?。?br /> RMDir /r "$INSTDIR"
NoDelete:
SectionEnd
; 定義卸載程序標(biāo)牌位圖
!define BI_UNINSTALL
!include "${NSISDIR}\Examples\branding.nsh"
; 初始化卸載程序?qū)υ捒虻脑O(shè)置
Function un.onInit
; 初始化標(biāo)牌位圖
!insertmacro BI_INIT $R0
FunctionEnd
; 卸載程序主界面的相關(guān)文本
Function un.SetHeader
!insertmacro MUI_HEADER_INIT
!insertmacro MUI_HEADER_START 1
!insertmacro MUI_HEADER_TEXT 2052 "卸載 ${NAME}" "${NAME_FULL} 將從你的系統(tǒng)里移除."
!insertmacro MUI_HEADER_STOP 1
!insertmacro MUI_HEADER_START 2
!insertmacro MUI_HEADER_TEXT 2052 "卸載" "${NAME} 正在被卸載,請(qǐng)等待."
!insertmacro MUI_HEADER_STOP 2
!insertmacro MUI_HEADER_START 3
!insertmacro MUI_HEADER_TEXT 2052 "完成" "${NAME_FULL} 已從你的系統(tǒng)中移除."
!insertmacro MUI_HEADER_STOP 3
!insertmacro MUI_HEADER_END
FunctionEnd
; 初始化卸載程序?qū)υ捒驎r(shí)的處理
Function un.onInitDialog
; 自己加:)
FunctionEnd
; 卸載程序轉(zhuǎn)到下一頁(yè)時(shí)的處理
Function un.onNextPage
!insertmacro MUI_NEXTPAGE_OUTER
!insertmacro MUI_NEXTPAGE un.SetHeader
; 標(biāo)牌位圖設(shè)置
!insertmacro BI_NEXT
FunctionEnd
; 卸載程序完成時(shí)的處理
Function un.onUninstSuccess
; 再加^_^
FunctionEnd
; 放棄卸載程序時(shí)的處理
Function un.onUserAbort
FunctionEnd
; 卸載程序標(biāo)牌位圖列表
!insertmacro BI_LIST
!insertmacro BI_LIST_ADD "F:\12\UnBrand1.bmp" /RESIZETOFIT
!insertmacro BI_LIST_ADD "F:\12\UnBrand2.bmp" /RESIZETOFIT
!insertmacro BI_LIST_END
; 結(jié)束
/////////////////////////////////////////////////////////////////////////////
[/color]
[color=#008000]; study.nsi
;
; 以下腳本用以生成 study.exe 文件
; 它包含有授權(quán)協(xié)議
;
; 安裝時(shí)若發(fā)現(xiàn)應(yīng)用程序正在運(yùn)行,安裝程序會(huì)提示并替用戶關(guān)閉應(yīng)用程序
; 安裝成功后會(huì)自動(dòng)運(yùn)行應(yīng)用程序
;
; 啟用新的 Modern UI 的宏指令語(yǔ)法,原先的部分指令將被禁止以防止重復(fù)
; 我會(huì)盡量展示如何基本指令的用法。當(dāng)然宏指令也會(huì)與一些基本指令發(fā)生重
; 復(fù)定義的情況,不過(guò) NSIS 照樣能編譯成功.
; 其中的一些路徑、文件你可以根據(jù)需要更改
; 啟用外部壓縮工具(這里我們不用,原因看第 10 步)
;!define HAVE_UPX
; 若啟用了外部壓縮工具,這進(jìn)行可執(zhí)行文件頭的壓縮
!ifdef HAVE_UPX
; 用 UPX 壓縮可執(zhí)行文件頭(用其他的相關(guān)工具也行)
!packhdr tmp.dat "E:UPX\upx --best tmp.dat"
!endif
; 編譯選項(xiàng)
; 設(shè)置覆蓋標(biāo)記
SetOverwrite on
; 設(shè)置壓縮選項(xiàng)
SetCompress auto
; 選擇壓縮方式
SetCompressor bzip2
; 設(shè)置數(shù)據(jù)塊優(yōu)化
SetDatablockOptimize on
; 設(shè)置數(shù)據(jù)寫入時(shí)間
SetDateSave on
; 相關(guān)數(shù)據(jù)預(yù)設(shè)
; 軟件的名字,后面的${NAME}調(diào)用這個(gè)名字
!define NAME "NSIS"
!define NAME_FULL "全方位掌握 NSIS 的使用"
!verbose 3
; 包含窗口消息定義文件
!include "${NSISDIR}\Examples\WinMessages.nsh"
; 包含新界面的宏指令文件
!include "${NSISDIR}\Examples\Modern UI\ModernUI.nsh"
; 包含標(biāo)牌位圖宏指令文件
!include "${NSISDIR}\Examples\branding.nsh"
!verbose 4
!define CURRENTPAGE $9
!define TEMP1 $R0
!define TEMP2 $R1
; 插入安裝界面宏定義(這里我禁用了,啟用也沒(méi)問(wèn)題。編譯照樣通過(guò)。后面我都定義過(guò)了)
;!insertmacro MUI_INTERFACE "modern2.exe" "adni18-installer-C-no48xp.ico" "adni18-uninstall-C-no48xp.ico" "modern.bmp" "smooth"
; 安裝程序設(shè)置
; 輸出文件
OutFile "F:\study.exe"
; 安裝程序名稱
Name /LANG=2052 "NSIS"
; 替換對(duì)話框樣式
ChangeUI all "${NSISDIR}\Contrib\UIs\modern2.exe"
; 啟用 WindowsXP 的視覺(jué)樣式
XPstyle on
;設(shè)置字體
SetFont 宋體 9
; 標(biāo)題名稱
Caption /LANG=2052 "全方位掌握 NSIS 的使用"
; 標(biāo)牌的內(nèi)容
BrandingText /LANG=2052 /TRIMCENTER "Shao Hao"
; 安裝程序圖標(biāo)
Icon "F:\12\QCDIcon.ico"
; 安裝程序顯示標(biāo)題
WindowIcon on
; 添加標(biāo)牌位圖(放在頂部用 TOP 參數(shù)。后面接高度)
AddBrandingImage LEFT 105
; 設(shè)定漸變背景
BGGradient off
; 設(shè)置安靜安裝模式
;SilentInstall normal
; 設(shè)置安靜卸載模式
;SilentUnInstall normal
; 執(zhí)行 CRC 檢查(最好用 on 打開(kāi)。關(guān)閉是因?yàn)檫€要修改安裝程序,看第 10 步)
CRCCheck off
; 加載相應(yīng)的語(yǔ)言文件
LoadLanguageFile "${NSISDIR}\Contrib\Language files\SimpChinese.nlf"
; 替換各個(gè)對(duì)話框標(biāo)題的文字
SubCaption /LANG=2052 0 "授權(quán)協(xié)議"
SubCaption /LANG=2052 1 "安裝選項(xiàng)"
SubCaption /LANG=2052 2 "安裝目錄"
SubCaption /LANG=2052 3 "正在安裝"
SubCaption /LANG=2052 4 "完成安裝"
; 替換默認(rèn)按鈕的文字
MiscButtonText /LANG=2052 "< 上一步" "下一步 >" "取消" "關(guān)閉"
; 替換“安裝”按鈕的文字
;InstallButtonText /LANG=2052 "安裝"
; 替換當(dāng)文件無(wú)法被寫入時(shí)的警告窗的文字
FileErrorText /LANG=2052 "無(wú)法寫入文件$\r$\n$0$\r$\n請(qǐng)確認(rèn)文件屬性不是只讀且未被使用中!"
; 默認(rèn)的安裝目錄
InstallDir "$PROGRAMFILES\QCD 3"
; 如果可能的化從注冊(cè)表中監(jiān)測(cè)安裝路徑
InstallDirRegKey HKLM \
"Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" \
"UninstallString"
; 授權(quán)協(xié)議頁(yè)面
LicenseText /LANG=2052 "NSIS 是免費(fèi)軟件。安裝前請(qǐng)先閱讀以下協(xié)議條款" "我同意"
; 使用授權(quán)協(xié)議文本
LicenseData /LANG=2052 "F:\12\License.txt"
; 設(shè)置授權(quán)協(xié)議頁(yè)面的背景色
;LicenseBkColor 000000
; 選擇要按安裝的組件
ComponentText /LANG=2052 "現(xiàn)在將安裝 ${NAME_FULL}到您的計(jì)算機(jī):" "請(qǐng)選擇安裝類型" "或選擇您希望安裝的組件"
InstType "完全安裝(都在了)"
InstType "典型安裝"
InstType /LANG=2052 /CUSTOMSTRING=自定義?
;InstType /LANG=2052 /NOCUSTOM
;InstType /COMPONENTSONLYONCUSTOM
CheckBitmap "${NSISDIR}\Contrib\Icons\modern.bmp"
; 替換顯示磁盤空間信息的文字
SpaceTexts /LANG=2052 "所需空間:" "可用空間:"
; 提示用戶輸入目錄的文本
; DirShow hide
; 替換顯示選擇安裝目錄的文字
DirText /LANG=2052 "請(qǐng)選擇 ${NAME} 的安裝路徑:" "選擇目錄用以安裝 ${NAME}:" "瀏覽..."
; 是否允許安裝在根目錄下
AllowRootDirInstall false
; 安裝信息的顏色
;InstallColors 000000 FFFFFF
; 安裝進(jìn)度條顯示方式
InstProgressFlags smooth colored
; 完成后自動(dòng)關(guān)閉安裝程序
AutoCloseWindow true
; 顯示“顯示詳細(xì)細(xì)節(jié)”對(duì)話框
ShowInstDetails hide
; 替換“顯示細(xì)節(jié)”按鈕的文字
DetailsButtonText /LANG=2052 "顯示細(xì)節(jié)"
; 替換“完成”按鈕的文字
CompletedText /LANG=2052 "已完成"
; 卸載程序設(shè)置
; 替換卸載程序的文字
UninstallText /LANG=2052 "現(xiàn)在將從你的系統(tǒng)中卸載 ${NAME}:" "卸載目錄:"
; 卸載程序圖標(biāo)
UninstallIcon "F:\12\UnQCDIcon.ico"
; 替換卸載程序標(biāo)題的文字
UninstallCaption /LANG=2052 "卸載 ${NAME}"
; 替換卸載程序每頁(yè)按鈕的文字
UninstallSubCaption /LANG=2052 0 ":確認(rèn)"
UninstallSubCaption /LANG=2052 1 ":正在刪除文件"
UninstallSubCaption /LANG=2052 2 ":完成"
; 卸載程序顯示方式
ShowUninstDetails hide
; 替換“卸載”按鈕的文字
UninstallButtonText /LANG=2052 "卸載"
; 安裝程序內(nèi)容及其相關(guān)的回調(diào)函數(shù)
; 安裝程序內(nèi)容
Section /e "!主要程序(必須安裝)" SecCore
SectionIn 1 2 RO
; 設(shè)置輸出路徑,每次使用都會(huì)改變
SetOutPath $INSTDIR
; 循環(huán)包含目錄下全部?jī)?nèi)容
File /r "F:\12\1\*.*"
; 只包含一個(gè)文件
File "F:\12\gf.gif"
; 處理動(dòng)態(tài)連接庫(kù)文件
IfFileExists "$INSTDIR\1.dll" 0 NoFile1
; 取消組件注冊(cè)
UnRegDll "$INSTDIR\1.dll"
Delete "$INSTDIR\1.dll"
NoFile1:
File "F:\12\1.dll"
; 注冊(cè)組件
RegDLL "$INSTDIR\QCDIconMgr.dll"
; 寫入軟件注冊(cè)鍵值
WriteRegStr HKLM "Software\NSIS\NSIS" "" "$INSTDIR"
; 為 Windows 卸載程序?qū)懭腈I值
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "DisplayName" "NSIS(只用于移除)"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "UninstallString" '"$INSTDIR\uninst.exe"'
; 寫入生成卸載程序(可多次使用)
WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd
Section /e "擴(kuò)展(可選)" SecUpdate
SectionIn 1
SetOutPath "$INSTDIR\Plugins"
File "F:\12\qcdplus\Plugins\2.dll"
File /r "F:\12\qcdplus\Plugins\3"
SectionEnd
SubSection /e "選項(xiàng)" SecOptions
Section /e "創(chuàng)建桌面圖標(biāo)" SecDesktopShortCut
SectionIn 1 2
SetOutPath "$INSTDIR\Plugins"
CreateShortCut "$DESKTOP\NSIS.lnk" "$INSTDIR\gf.gif"
WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd
Section /e "創(chuàng)建快速啟動(dòng)欄圖標(biāo)" SecQuickbarShortCut
SectionIn 1 2
SetOutPath "$INSTDIR\Plugins"
CreateShortCut "$QUICKLAUNCH\NSIS.lnk" "$INSTDIR\gf.gif"
WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd
Section /e "創(chuàng)建 NSIS 程序組" SecShortCutGroup
SectionIn 1 2
SetOutPath "$INSTDIR\Plugins"
CreateDirectory "$SMPROGRAMS\NSIS"
CreateShortCut "$SMPROGRAMS\QCD Player\gf.lnk" "$INSTDIR\gf.gif"
WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd
SubSectionEnd
Section "-Run"; 運(yùn)行?
ExecWait '"$INSTDIR\2.exe" -p'
WriteINIStr "$INSTDIR\NSIS.ini" "2" "Language" "Chinese"
Exec "$INSTDIR\2.exe"
ExecShell open "$INSTDIR\漢化說(shuō)明.htm"
SectionEnd
Section ""
;Invisible section to display the Finish header
!insertmacro MUI_FINISHHEADER SetHeader
SectionEnd
; 安裝程序初始化設(shè)置
Function .onInit
; 發(fā)現(xiàn)有程序正在運(yùn)行時(shí)提示退出后繼續(xù)運(yùn)行
loop:
FindWindow $R0 "NSIS"
IntCmp $R0 0 done
MessageBox MB_OKCANCEL \
"NSIS 正在運(yùn)行。$\n點(diǎn)擊“確定”按鈕會(huì)關(guān)閉 NSIS 然后繼續(xù)安裝,點(diǎn)擊“取消”按鈕將退出安裝程序" \
IDOK NoAbort
Abort
NoAbort:
SendMessage $R0 1029 0 0
; 稍等后繼續(xù)檢測(cè)直至檢測(cè)不到或用戶選擇取消
Sleep 444
Goto loop
done:
; 顯示 Logo 畫面
SetOutPath $TEMP
File /oname=qcd_logo.bmp "F:\12\logo.bmp"
File /oname=magiclime.exe "${NSISDIR}\Bin\magiclime.exe"
ExecWait '"$TEMP\magiclime.exe" qcd_logo.bmp'
Delete "$TEMP\magiclime.exe"
Delete "$TEMP\qcd_logo.bmp"
; 初始化標(biāo)牌位圖
!insertmacro BI_INIT $R0
FunctionEnd
; 安裝程序主界面的相關(guān)文本
Function SetHeader
!insertmacro MUI_HEADER_INIT
!insertmacro MUI_HEADER_START 1
!insertmacro MUI_HEADER_TEXT 2052 "授權(quán)協(xié)議" "安裝 ${NAME} 之前,請(qǐng)認(rèn)真閱讀一下授權(quán)條款."
!insertmacro MUI_HEADER_STOP 1
!insertmacro MUI_HEADER_START 2
!insertmacro MUI_HEADER_TEXT 2052 "選擇組件" "請(qǐng)選擇你要安裝的組件."
!insertmacro MUI_HEADER_STOP 2
!insertmacro MUI_HEADER_START 3
!insertmacro MUI_HEADER_TEXT 2052 "選擇安裝位置" "為 ${NAME} 選擇一個(gè)安裝目錄."
!insertmacro MUI_HEADER_STOP 3
!insertmacro MUI_HEADER_START 4
!insertmacro MUI_HEADER_TEXT 2052 "安裝" "${NAME} 已經(jīng)安裝,請(qǐng)等待."
!insertmacro MUI_HEADER_STOP 4
!insertmacro MUI_HEADER_START 5
!insertmacro MUI_HEADER_TEXT 2052 "完成" "安裝順利完成."
!insertmacro MUI_HEADER_STOP 5
!insertmacro MUI_HEADER_END
FunctionEnd
; 初始化安裝程序?qū)υ捒虻娘@示文本
Function .onInitDialog
!insertmacro MUI_INNERDIALOG_INIT
!insertmacro MUI_INNERDIALOG_START 1
!insertmacro MUI_INNERDIALOG_TEXT 2052 1040 "如果你同意協(xié)議中的所有條款,選擇“我同樣”繼續(xù)安裝,如果你選擇了“取消”,安裝程序?qū)⒔K止,只有接受條款才能安裝 ${NAME}."
!insertmacro MUI_INNERDIALOG_STOP 1
!insertmacro MUI_INNERDIALOG_START 2
!insertmacro MUI_INNERDIALOG_TEXT 2052 1042 "描述"
!insertmacro MUI_INNERDIALOG_TEXT 2052 1043 "移動(dòng)你的鼠標(biāo)到組件上,便可以見(jiàn)到相關(guān)的描述."
!insertmacro MUI_INNERDIALOG_STOP 2
!insertmacro MUI_INNERDIALOG_START 3
!insertmacro MUI_INNERDIALOG_TEXT 2052 1041 "目標(biāo)文件夾"
!insertmacro MUI_INNERDIALOG_STOP 3
!insertmacro MUI_INNERDIALOG_END
FunctionEnd
; 轉(zhuǎn)到下頁(yè)面時(shí)的處理
Function .onNextPage
!insertmacro MUI_NEXTPAGE_OUTER
!insertmacro MUI_NEXTPAGE SetHeader
; 標(biāo)牌位圖設(shè)置
!insertmacro BI_NEXT
FunctionEnd
; 轉(zhuǎn)到上一頁(yè)面時(shí)的處理
Function .onPrevPage
!insertmacro MUI_PREVPAGE
; 標(biāo)牌位圖設(shè)置
!insertmacro BI_PREV
FunctionEnd
; 鼠標(biāo)移到指定組件時(shí)的顯示處理
Function .onMouseOverSection
; 用宏指令設(shè)置安裝自己的注釋文本
!insertmacro MUI_DESCRIPTION_INIT
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecCore} "安裝主應(yīng)用程序"
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecUpdate} "安裝 NSIS 的更新或新增插件"
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecOptions} "選擇 NSIS 的其他安裝選項(xiàng),例如:創(chuàng)建快捷方式和應(yīng)用程序組的"
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecDesktopShortCut} "在用戶的桌面上創(chuàng)建 NSIS 的快捷方式"
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecQuickbarShortCut} "在用戶的快速欄里創(chuàng)建 NSIS 快捷方式"
!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecShortCutGroup} "在用戶的開(kāi)始菜單的程序中創(chuàng)建 NSIS 的快捷方式組"
!insertmacro MUI_DESCRIPTION_END
FunctionEnd
; 安裝成功完成后的設(shè)置
Function .onInstSuccess
; 自己加吧:)
FunctionEnd
; 放棄安裝時(shí)警告窗口的顯示信息
Function .onUserAbort
!insertmacro MUI_ABORTWARNING 2052 "你確定要推出 ${NAME} 的安裝嗎?"
!insertmacro MUI_ABORTWARNING_END
FunctionEnd
; 安裝程序標(biāo)牌位圖列表
!insertmacro BI_LIST
!insertmacro BI_LIST_ADD "F:\12\Brand1.bmp" /RESIZETOFIT
!insertmacro BI_LIST_ADD "F:\12\Brand2.bmp" /RESIZETOFIT
!insertmacro BI_LIST_ADD "F:\12\Brand3.bmp" /RESIZETOFIT
!insertmacro BI_LIST_END
; 卸載程序及其相關(guān)回調(diào)函數(shù)
; 卸載程序內(nèi)容
Section "Uninstall"
ExecWait '"$INSTDIR\12.exe" /un'
; 循環(huán)刪除文件直至刪除文件夾
RMDir /r "$SMPROGRAMS\NSIS"
UnRegDLL "$INSTDIR\2.dll"
Delete "$INSTDIR\QCDIconMgr.dll"
Delete "$INSTDIR\*.*"
DeleteRegKey HKLM "Software\NSIS"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS"
MessageBox MB_YESNO|MB_ICONQUESTION \
"是否連插件目錄也要?jiǎng)h除?$\n(若您要保留這些文件,請(qǐng)點(diǎn)擊下面的“否”按鈕)" \
IDNO NoDelete
; 全刪光!?。?br /> RMDir /r "$INSTDIR"
NoDelete:
SectionEnd
; 定義卸載程序標(biāo)牌位圖
!define BI_UNINSTALL
!include "${NSISDIR}\Examples\branding.nsh"
; 初始化卸載程序?qū)υ捒虻脑O(shè)置
Function un.onInit
; 初始化標(biāo)牌位圖
!insertmacro BI_INIT $R0
FunctionEnd
; 卸載程序主界面的相關(guān)文本
Function un.SetHeader
!insertmacro MUI_HEADER_INIT
!insertmacro MUI_HEADER_START 1
!insertmacro MUI_HEADER_TEXT 2052 "卸載 ${NAME}" "${NAME_FULL} 將從你的系統(tǒng)里移除."
!insertmacro MUI_HEADER_STOP 1
!insertmacro MUI_HEADER_START 2
!insertmacro MUI_HEADER_TEXT 2052 "卸載" "${NAME} 正在被卸載,請(qǐng)等待."
!insertmacro MUI_HEADER_STOP 2
!insertmacro MUI_HEADER_START 3
!insertmacro MUI_HEADER_TEXT 2052 "完成" "${NAME_FULL} 已從你的系統(tǒng)中移除."
!insertmacro MUI_HEADER_STOP 3
!insertmacro MUI_HEADER_END
FunctionEnd
; 初始化卸載程序?qū)υ捒驎r(shí)的處理
Function un.onInitDialog
; 自己加:)
FunctionEnd
; 卸載程序轉(zhuǎn)到下一頁(yè)時(shí)的處理
Function un.onNextPage
!insertmacro MUI_NEXTPAGE_OUTER
!insertmacro MUI_NEXTPAGE un.SetHeader
; 標(biāo)牌位圖設(shè)置
!insertmacro BI_NEXT
FunctionEnd
; 卸載程序完成時(shí)的處理
Function un.onUninstSuccess
; 再加^_^
FunctionEnd
; 放棄卸載程序時(shí)的處理
Function un.onUserAbort
FunctionEnd
; 卸載程序標(biāo)牌位圖列表
!insertmacro BI_LIST
!insertmacro BI_LIST_ADD "F:\12\UnBrand1.bmp" /RESIZETOFIT
!insertmacro BI_LIST_ADD "F:\12\UnBrand2.bmp" /RESIZETOFIT
!insertmacro BI_LIST_END
; 結(jié)束
/////////////////////////////////////////////////////////////////////////////
[/color]
7.注意兩個(gè)標(biāo)牌位圖列表宏指令必須放置到函數(shù)的后面,就像我編寫的那樣,安裝程序的標(biāo)牌位
圖列表放置到到所有安裝程序回調(diào)函數(shù)的后面;卸載程序的標(biāo)牌位圖列表放置到所有卸載程序回
調(diào)函數(shù)的后面。
關(guān)鍵是要注意整體布局(這樣才不會(huì)看迷糊),當(dāng)然若編譯不能通過(guò),就要進(jìn)行合適的調(diào)整。
8. 使用指令:
makensis /CD f:\study.nsi"
進(jìn)行編譯(這個(gè)示例腳本我沒(méi)試過(guò)-_-,若編譯無(wú)法通過(guò)只好自己動(dòng)手研究研究了。我放出來(lái)只是用于參考學(xué)習(xí))
9. 還沒(méi)完—— NSIS 對(duì)多語(yǔ)言的支持還是不夠完美(注意:是完美——有點(diǎn)雞蛋里挑骨頭的味道)。
我們繼續(xù):
用 ExeScope (其他的資源編輯器也行,別說(shuō)你沒(méi)有)打開(kāi)生成的 study.exe 文件,找到對(duì)話框資源的 105 項(xiàng)目。你會(huì)發(fā)現(xiàn)有一塊很明顯的用以顯示標(biāo)牌位圖的控件。因?yàn)?NSIS 在插件此控件時(shí)是使其保持于授權(quán)協(xié)議文件控件等高的,所以當(dāng)使用用 modern2.exe 對(duì)話框模板時(shí)會(huì)與對(duì)話框頂部多出 45 的距離——不羅嗦了,總之根據(jù)需要搞得好看就行(別過(guò)火!)。順便提一下,NSIS 安裝目中的 Contrib\UIs 子目錄下提供了多種對(duì)話框模板,你可以自行選用(就是用
ChangeUI 指令或用宏指令),甚至根據(jù)需要用資源編輯器修改模板資源。
接著修改:找到 111 項(xiàng),把里面的資源漢化掉(新的界面居然沒(méi)有對(duì)此對(duì)話框的多語(yǔ)言支持!這個(gè)對(duì)話框只有在大容量的安裝程序執(zhí)行時(shí)才顯示)。
用 ExeScope 更新后,再用 Hex WorkShop 打開(kāi)我問(wèn)可憐的試驗(yàn)品——study.exe,查找字符串“unpacking data: ”(沒(méi)引號(hào)的,你別瞎加。找不到別怪我 $_$)。找到后處理一下,用“正在解壓縮數(shù)據(jù):”
替換(正好 8 個(gè)字符 Yeah?。?
10. 現(xiàn)在我要說(shuō)為什么不啟用 UPX 壓縮以及關(guān)閉 CRC 檢測(cè):
用 UPX 壓縮可執(zhí)行文件頭或啟用 CRC 檢測(cè)(起用的話就是打開(kāi)了自校驗(yàn)),我們的 ExeScope 就無(wú)用武之地了(除非你夠牛會(huì)動(dòng)態(tài)跟蹤技術(shù)和反匯編把文件頭殼和自校驗(yàn)去掉,否則還是關(guān)掉的好)。
至此全部完工。
若有任何語(yǔ)法難點(diǎn),請(qǐng)參閱 NSIS 的幫助文件。內(nèi)有上千字的詳細(xì)說(shuō)明(可能更多,我也沒(méi)統(tǒng)計(jì)過(guò))。還有一些指令我沒(méi)有用上,因?yàn)槟切┎惶赡苡玫纳稀?
這個(gè)示例腳本已能作出較佳的安裝程序界面,大家可以下載我為 QCD v3.40B35 做的安裝界面。
有問(wèn)題請(qǐng)跟貼。歡迎一起交流。
出處:http://bbs.hanzify.org/bbs/cgi-bin/topic.cgi?forum=8&topic=1010