NSIS 是“Nullsoft 腳本安裝系統(tǒng)”(Nullsoft Scriptable Installation System) 的縮寫(xiě),它是一個(gè)免費(fèi)的 Win32 安裝、卸載系統(tǒng),采用了簡(jiǎn)潔高效的腳本方式。它本來(lái)是一個(gè)由 Nullsoft 創(chuàng)建并用于作為 Winamp 及其插件發(fā)布的系統(tǒng),但現(xiàn)已被上百個(gè)應(yīng)用程序所應(yīng)用,作為它們進(jìn)行程序發(fā)布的工具。
相信不是每個(gè)人寫(xiě)的軟件都只發(fā)布一次就可以了,肯定要有修改和維護(hù)的情況發(fā)生。在這種情況下,您可能就需要一個(gè)軟件的升級(jí)安裝包了。
現(xiàn)在,我們就來(lái)一步步把這個(gè)安裝包做出來(lái)。
前提:用戶已經(jīng)使用我們的完整安裝包安裝過(guò)了,且已經(jīng)在注冊(cè)表中記錄了安裝路徑。
在注冊(cè)表中寫(xiě)入安裝路徑WriteRegStr HKCU "Software\無(wú)名智者作品系列" "" $INSTDIR
我們要實(shí)現(xiàn)以下功能:
1、運(yùn)行時(shí)檢測(cè)注冊(cè)表中是否有指定的安裝路徑,如果有,直接進(jìn)入安裝過(guò)程,如果沒(méi)有,給一個(gè)提示。
2、運(yùn)行時(shí)檢測(cè)程序是否運(yùn)行,如果正在運(yùn)行則可以選擇強(qiáng)制結(jié)束。
3、升級(jí)過(guò)程中實(shí)現(xiàn)解壓文件、運(yùn)行BAT等操作,且有進(jìn)度條提示。
4、升級(jí)結(jié)束時(shí)打開(kāi)升級(jí)說(shuō)明以便用戶查看。
第一步:定義基本框架
"!define PRODUCT_NAME "a"!define PRODUCT_VERSION "1.0.0.1" SetCompressor lzmaSetFont "tahoma" 8RequestExecutionLevel admin !include "MUI2.nsh" !insertmacro MUI_LANGUAGE "SimpChinese" Name "${PRODUCT_NAME}_升級(jí)_${PRODUCT_VERSION}"OutFile "${PRODUCT_NAME}_升級(jí)_${PRODUCT_VERSION}.exe"InstallDirRegKey HKCU "Software\a" "" Section "升級(jí)文件" SEC01 SetDetailsPrint textonly DetailPrint "正在升級(jí) ${PRODUCT_NAME},請(qǐng)單擊關(guān)閉按鈕完成升級(jí)!" SetDetailsPrint listonly SectionIn RO SetOutPath "$INSTDIR"SetOverwrite ifnewer ;升級(jí)文件File "a.EXE" File "Server\更新說(shuō)明.txt" ;運(yùn)行BTA nsExec::Exec "$INSTDIR\a.bat" ;指定以記事本打開(kāi)說(shuō)明 Exec '"$SYSDIR\notepad.exe" "$INSTDIR\更新說(shuō)明.txt"' SectionEnd
如果沒(méi)有其他錯(cuò)誤,這時(shí)候我們的升級(jí)程序就已經(jīng)可以編譯了。
下面,我們繼續(xù)進(jìn)行完善。
第二步:禁止重復(fù)運(yùn)行
在.onInit區(qū)段加入以下代碼
InitPluginsDir ;創(chuàng)建互斥防止重復(fù)運(yùn)行 System::Call 'kernel32::CreateMutexA(i 0, i 0, t "ainstaller") i .r1 ?e' Pop $R0 StrCmp $R0 0 +3 MessageBox MB_OK|MB_ICONEXCLAMATION "有一個(gè) ${PRODUCT_NAME} 升級(jí)程序已經(jīng)運(yùn)行!" Abort
第三步:加入是否安裝判斷
我們通過(guò)檢測(cè)注冊(cè)中指定鍵值的方式來(lái)判斷軟件是否已經(jīng)正確安裝。
在.onInit區(qū)段加入以下代碼
;判斷是否已安裝 ReadRegStr $0 HKCU "Software\a" "" StrCmp $0 "" 0 NoAbort MessageBox MB_OK|MB_ICONEXCLAMATION "您未正確安裝本軟件,不能使用此升級(jí)程序!" Abort ;退出安裝程序 NoAbort:
第四步:如果程序正在運(yùn)行則關(guān)閉程序
在.onInit區(qū)段加入以下代碼
;關(guān)閉進(jìn)程 Push $R0 CheckProc: Push "asc.exe" ProcessWork::existsprocess Pop $R0 IntCmp $R0 0 Done MessageBox MB_OKCANCEL|MB_ICONSTOP "升級(jí)程序檢測(cè)到 ${PRODUCT_NAME} 正在運(yùn)行。$\r$\n$\r$\n點(diǎn)擊 “確定” 強(qiáng)制關(guān)閉${PRODUCT_NAME},繼續(xù)升級(jí)。$\r$\n點(diǎn)擊 “取消” 退出安裝程序。" IDCANCEL Exit Push "asc.exe" Processwork::KillProcess Sleep 1000 Goto CheckProc Exit: Abort Done: Pop $R0
這時(shí)我們會(huì)發(fā)現(xiàn)整個(gè)安裝程序還不是很美觀,那么我們繼續(xù)。
第五步:添加MUI
MUI,你懂的!
好,至此,這個(gè)軟件升級(jí)包就大功告成了。
當(dāng)然,你還可以在其中加入其他功能,比如更新卸載文件代碼、注冊(cè)DLL、設(shè)置壁紙、更改主題等,不過(guò),輕狂勸你:這只是一個(gè)升級(jí)安裝包而已,沒(méi)必要搞得功能那么復(fù)雜吧!呵呵