用NSIS建立自己的windows安裝程式製作程式
NSIS簡介:
NSIS 是“Nullsoft 指令碼安裝系統”(Nullsoft Scriptable Installation System)的縮寫,它是一個免費的 Win32 安裝、解除安裝系統,它的特點:指令碼簡潔高效;系統開銷小;當然進行安裝、解除安裝、設定系統設定、解壓檔案等等更不在話下,幾乎可以做所有的事情。更多的功能請閱讀藍色網際的《NSIS幫助文件》。
對於製作NSIS的使用教程,藍色網際是NSIS方面的專家,她的《NSIS幫助文件》就是一本NSIS的聖經,而對初學者來說,最頭疼的莫過於一大堆看不懂的程式碼,對他們來說無異於一本天書。緣於此,特草此基礎教程,希望NSIS專家們勿見笑,不當之處歡迎批評指正以期完善,也希望給初學者作個鋪墊。
工具:
NIS Edit+Nullsoft Installation System(NSIS)
[此兩款軟體都可以到世紀主站上下載到]
思路:指令碼嚮導+修改程式碼=個性化安裝包
步驟:
I.利用嚮導製作安裝包:
1.安裝上述兩款,啟動NIS Edit,在“檔案”選單中“新建指令碼:嚮導”=>下一步”,如圖1:
附圖
2.設定應用程式資訊,如軟體名稱、版本、出版人等,如圖2。
當然最一個網站可以留空,如果設定了,則安裝包會生成一個對應網址的“Internet 快捷方式”。
附圖
3.設定程式選項,如安裝包圖示、安裝程式檔案、安裝包語言[這裡選“SimChinese”]、使用者圖形介面及壓縮方式等,
我們可以選用預設值,也可以點選對應專案的按鈕或下拉選單更改設定,如下圖3
附圖
4.設定安裝目錄及授權資訊,如圖4後“下一步”:
附圖
5.選定程式檔案,即我們要打包的檔案,可以使用預設的“Mainsection”,
也可以根據需要進行更改或新建組別,
如果組比較多時,
你也可以設定是否“允許使用者選擇要安裝的元件”,如圖5。
附圖
完畢後進行“新增檔案”操作,選定我們要打包的檔案,如圖6,
完成自動後返回的圖5的介面,執行下一步操作。
附圖
6.設定開始選單中資料夾名稱及快捷方式,這裡我們使用預設值,如圖7,按“下一步”:
附圖
7.指定安裝後要執行的程式,同上用預設值並設定相關執行引數及描述,
如果你和我一樣懶的話,或不想在安裝執行任何程式,則留空即可,如圖8:
附圖
8.這步是有關解除安裝程式的相關資訊,如解除安裝時的提示、解除安裝的圖示等,如圖9
附圖
9.至此完成嚮導,如圖10,,鉤選“儲存指令碼”、“轉換檔案路徑到相關路徑”及“編譯指令碼”
附圖
提示儲存指令碼路徑並自動編譯指令碼,我們可以按或F9執行安裝程式進行預覽,嚮導產生的安裝包效果圖如圖11所示:
附圖
II.修改程式碼以個性化安裝包:
10.選擇可修改之處:
1)軟體LOGO[如圖11A]、安裝包標題[圖11B]、圖11C、圖12、圖13
圖11見上樓
圖12如下
附圖
圖13如下
附圖
11.修改程式碼
1) 修改軟體LOGO:在原始碼“ MUI Settings”後面新增下列程式碼:
|
註釋:引號內為點陣圖的路徑,點陣圖大小大約為165*298
效果圖如圖14所示
附圖
2)修改安裝包標題,在同上位置新增下列程式碼:
|
註釋:\r\n為換行標誌
效果圖上樓如圖14所示
3)修改圖11C中的說明,同上位置新增下列程式碼:
|
效果圖如圖14所示
4)對圖12中的修改,在原始碼:
|
後新增:
|
效果圖如圖15所示
附圖
5)在完成新增“漢化說明”,只要在原始碼:
|
後新增:
|
效果所示
附圖
6)閃屏介面,可以在原始碼中加入下列程式碼即可:
A、普通效果
|
|
7)背景音樂[貫穿安裝過程]
|
後語:
以上僅是NSIS製作安裝包最基本的操作,供初學者入門之用,故云“初級篇”。
希望不會怡笑大方,更希望藍MM、陳敏毅老大等NSIS高手的中高階教程:)
相關資料下載[以Pdf2allV5.35d為例,可直接點選下載]
全文的Word文件附在附件中
NSIS.rar 偶以Pdf2allV5.35d為例,
製作了安裝包製作動畫演示
[可直接點選下載]
相關檔案列表如下:
動畫演示 [pdf2all-movie.exe]
安裝包的NSIS指令碼程式碼 [PDF2all-nsis.nsi.txt]
成品的安裝包 [pdf2all-setup.exe]
常見修改的程式碼 [code.txt]
NSIS基礎教程CHM版 [NSIS安裝製作基礎教程(CHM格式)-特別感謝tracky]
感謝chenmy老大提供空間:)
偶的閃屏圖:
附圖
下面摘引一些論壇的討論,原帖點選進入: 漸現漸隱的程式碼:
|
背景音樂(貫穿安裝全過程):
|
背景音樂2:
|
最後一種方法使用了 bgimage 外掛,安裝程式執行到該外掛時會等待 wav 播放完再繼續執行。
謝謝dujuan509兄
如果閃屏效果[漸隱]+背景音樂[全程]放在一起
那程式碼該如何修改?
偶兩者無法兼得
望不吝賜教
藍色網際 推薦一個 NSIS 的快速編輯器 - NotePad2。雖然不是 NSIS 專門編輯器不過有時候比 Venis 方便,因為 Venis 不支援文字塊操作,而且 Venis 對語法高亮做得不是很好。NotePad2 的語法高亮是根據字尾名來確定的,只要你開啟 NSI 檔案不用任何設定就會自動語法高亮。 其實 NotePad2 作為記事本替代者也非常不過,介面非常相似,而 NotePad2 功能強大了好多。 你可以在 http://foobar.nease.net/nsis/np2.exe 下載我修改的版本,主要補全了 NSIS 語法高亮,原版由於很久沒更新 NSIS 的語法高亮程式碼,所以有一些新增的 NSIS 指令不能高亮顯示。 並作了一些優化,做要是讓它更像記事本 貼個圖: 附圖 dujuan509
你指的是選擇安裝目錄頁面的提示文字吧? 只需在
前面新增一行:
基本上包括了做補丁包含的大部分情況: 自動查詢原版軟體安裝目錄幷包含目錄修正 原版軟體的備份和恢復,以及漢化補丁的解除安裝 對原版進行 MD5 校驗 把漢化補丁應用到原版軟體不同版本 登錄檔的修正,主要是右鍵選單 資料庫的漢化 讀取、修改、寫入登錄檔二進位制型別資料 NSIS 做補丁的優點是生成檔案比較小,而且還可以包含 N 個版本的補丁 附件 hb-acdsee7_pub[1].nsi.zip raindy
設定了自定義安裝圖示就會自動顯示的,不需要另外新增,自定義安裝圖示:
這一點和INNO不同,INNO中則需要在[setup]中設定:
zkdpower 請問各位如何改這些 第一個就是如何把插入的headerimage圖片放到右邊(預設是在左邊) 第二個就是把headerimage上面的字改掉 謝謝 附圖
2、在 !insertmacro MUI_PAGE_LICENSE "c:\License.txt"前增加兩行:
請問藍色網際,在你的MUI 文件中有 “MUI_HEADERIMAGE_RIGHT 令本應顯示於左邊的頁首影象顯示於右面(當使用 RTL 語言時, 它將會顯示於左邊而不顯示於右邊).” 這麼一段話,請問何為RTL語言呢,本人愚拙,望指點 藍色網際 restools venis function 嚮導功能在 NISEdit 上完整實現,晚上或明天放出,不過需要人幫忙把嚮導指令碼編寫完整,因為寫程式時只是拿了4個具代表性的 function 來作為測試,這是這次放出版本實現的功能。要知道 NSIS 的 funciton 有這麼多啊。
|
顯示效果
2.彈出函式編輯視窗:
3.確定後,輸入,這裡一提的是,輸入時,會自動根據上一行程式碼的縮排,自動在輸入的函式行前面新增前導空格,以減少自己再輸入前面的空格。
==================
ISS2NSI v1.0a2
==================
ISS2NSI is a tool for convert Inno Setup script files into NSIS script files.
Usage:
==================
Program:
At the command prompt write: iss2nsi issscript.iss [nsiscript.nsi]
if nsiscript.nsi is no specified then the converted script will be
saved with the same name of the issscript.iss but with extension .nsi.
NIS Edit Plugin:
1- Close HM NIS Edit.
2- Put hmne_iss2nsi.dll in the plugins directory
(Default $PROGRAMFILES\HMSoft\NIS Edit\Plugins)
3- Start HM NIS Edit.
4- You will found a new item in the tools menu called "Convert InnoSetup script".
NOTE: Before compile the converted script please check it, because
complete compatibility is NOT available. I design this tool to convert my
Inno Setup scripts and is not tested with more complex scripts.
The source code is included if you want to contribute to the project
for make the converted script 100% compatible with the original.
Please send my your modifications to [email protected]
Note that this project is a modification to the Inno Setup 3.0.6
compiler and modifications to the Inno Setup source files are under
the Inno Setup license (see: src\is-src\is-license.txt).
Note: the files in the src\is-src directory are unmodified Inno Setup
source files needed by the Compile.pas unit located in the src directory
---------------------------------------------------------
hmne_iss2nsi.dll 把這個檔案放到 NISEdit 目錄下的 Plugins 中就可以使用,沒有詳細測試,不過如果是針對版本的話, Inno Setup 3.0.6 ,估計應該沒問題吧。
ISS2NSI.rar
雖然版本太低,用來從 ISS 的指令碼轉向學習 NSIS 應該容易點吧。
ISS2NSI 原始碼下載。
沒時間去看看它,只是把它編譯成了一個DLL。有時間看看它是什麼原理。
NISEdit 的增強版本,希望有人來幫幫忙,增加一下函式,否則這個版本也強不到哪裡去。
把裡面的那些檔案放入 NISEdit 的目錄中,為了區分原版,程式改名為 VNISEdit。
兩個版本可以同時存在,不過你要把 VNISEdit 設為預設編輯器,才可以預設用它來開啟。
修正:
1.新增一種選單的面板。
2.增加 NSIS 函式嚮導功能。(類似 Venis 中的 function 功能)
4.改程式呼叫幫助時,不要把幫助視窗置頂,因為置頂會令到檢視幫助時不能切換會編輯器視窗。
最新功能(區段結構分析)
左圖是VNISEdit解釋的,右圖是Venis分析的。分析物件(makensis.nsi)
全景圖:試一下唄,分析速度比 Venis 好很多的。基本上感覺不到檢視的閃動。執行緒實時分析,只要改動程式碼,檢視會立刻作出反應。
請問下面那些問題怎樣做的,
1、怎樣控制自定義面的“下一步”按鈕的可用與不可用
2、怎樣為自定義頁面上的元件新增Change事件呢
3、我在這個網站裡下載的foobar漢化增強版的安裝檔案裡看到頁面“MUI_PAGE_COMPONENTS”是怎麼做到的,就是怎麼把那個頁面的左邊改為能顯示描述內容和隱蔽一些文字
colonel
藍色網際
對於控制下一步按鈕來說,有三個階段分別是:頁面初始化之前、頁面初始化時、頁面要關閉時。不同的階段對應的插入函式不同。
比如要在頁面初始化之前禁止下一步按鈕,MUI 介面可以這樣
以下是程式碼片段: !define MUI_PAGE_CUSTOMFUNCTION_PRE ComponentPre !insertmacro MUI_PAGE_COMPONENTS Function ComponentPre GetDlgItem $0 $HWNDPARENT 1 EnableWindow $0 0 FunctionEnd |
那“2、怎樣為自定義頁面上的元件新增Change事件呢”,我自定義了一個配置頁面,我想使用者在完成配置才可啟用“下一步”按鈕,這個怎麼做的呢
藍色網際
需要給控制元件加上 NOTIFY 的標記。
例子在我的簽名裡有。
需要先了解 GetDlgItem 和 EnableWindow 指令的作用。
colonel
這個問題呢
3、我在這個網站裡下載的foobar漢化增強版的安裝檔案裡看到頁面“MUI_PAGE_COMPONENTS”是怎麼做到的,就是怎麼把那個頁面的左邊改為能顯示描述內容和隱蔽一些文字
怎樣使“MUI_PAGE_COMPONENTS”中的樹目錄只能在點選複選框才被選中呢
藍色網際
這個用 Resource Hacker 調整一下控制元件就行了。預設的 UI 檔案是 NSIS\Contrib\UIs\modern.exe
到我的簽名裡下一個特別版的 makensis.exe。
colonel
我不想在元件選擇頁面中用 onMouseOverSection 來顯示 描述 ,如果架設函式可以增加的話,我就想到這個 “回撥 onMouseDownSection ”
我是想通過元件目錄裡的 OnChange 事件來顯示
我不懂VC++吖,如果我會的話就可以像MM你那樣去改它的程式碼了
藍色網際
特別版的就是這樣啊,當你點選元件的時候描述區域才會顯示或改變。
普通版的只要滑鼠移上去就顯示了。你沒試過嗎。
colonel
哦~~~~~~~試到了,原來你是改了onMouseOverSection 回撥,對啦,MM你有沒有做過 元件的OnChange 事件嗎?主要是用在自定義頁面上的
是用這個嗎?Call shell32.dll::SHChangeNotify
藍色網際
不知道你說的“元件的 OnChange 事件”是什麼意思。
是不是當元件選擇更改的時候呼叫的函式呢?如果是的話那直接使用 Function .onSelChange 就行了。
各位好:我是新手,
我在看function時,沒發現引數的傳入。
可能我的思維方式不對。
function Fname
functionend
引數應該怎麼傳呢?
藍色網際
NSIS 的函式其實是個假函式,並不能像 C++ 那樣傳遞引數,如果你需要傳遞引數請使用堆疊。
一個典型的例子請看附錄的 Get parent directory。
那如果一個Edit裡的內容發生變化,另一個元件也跟關變化,這個Edit 的Change事件去寫呢
PS:可能我習慣於使用delphi所以有時說到的元件事件名稱與你不一樣吧
colonel
那如果一個Edit裡的內容發生變化,另一個元件也跟關變化,這個Edit 的Change事件去寫呢
PS:可能我習慣於使用delphi所以有時說到的元件事件名稱與你不一樣吧
藍色網際
你可以參考一下 NSIS\Contrib\InstallOptions\testnotify.nsi
File "${LOCATION}\$R0"
$R0是一個檔案,結果
說沒有這個檔案,
File "${LOCATION}\123.exe"
那就可以了。
奇怪,我第一句寫錯了麼?
File "${LOCATION}\${R0}"這樣也不對。
藍色網際
你可以先在資源管理器裡看看是否有 $R0 這個檔案。一般來說很少有這種不帶副檔名的奇怪檔案,況且不帶副檔名的話很容易被當作目錄來處理。
一般來說編譯器的報告是正確的,這裡有一個測試指令碼,你可以試試看。
test.zip
wq99
啊~對不起啊,我沒說仔細。
$R0是變數,是從堆疊裡Pop出來的。
即123.exe.
File "${LOCATION}\$R0"
即File "${LOCATION}\123.exe"
以下是程式碼片段: Push "123.exe" …… Function InstallOne Pop $R0 DetailPrint $R0 SetOutPath "$INSTDIR" File "${LOCATION}\$R0" ExecWait ’"$INSTDIR\$R0"’ FunctionEnd |
DetailPrint $R0
是可以打印出 123.exe
改成File "${LOCATION}\123.exe"是可以的。
怎麼用$R0就不行了呢?
藍色網際
File 指令後面的檔案必須是編譯時當前系統存在的檔案,而 $R0 要在編譯後才有值當然會出錯。變數是執行時才有效的。
如果你想改名的話請使用 File "/oname=目標檔案" "本地檔案"
oname= 後面的目標檔案可以用變數。
為什麼我的“安裝程式語言”裡面是空的
如圖,請指教,謝謝
注:WinXP SP2簡體中文系統
zhp0083
手動指定一次就會有了
以下是程式碼片段: !insertmacro MUI_LANGUAGE "SimpChinese" |
sjhome
請問NSIS只能新增一個目錄下的檔案,怎麼樣能新增所以目錄下的檔案呢?怎麼設定呢?多謝!
如圖所示.
只能新增"Counter-Strike Source"目錄下的檔案,怎麼樣能新增"Counter-Strike Source下的bin檔案,config檔案及所以資料夾"呢?
藍色網際
File 可以使用 /r 或 /x 。