使用NSIS作为软件打包发布安装包工具
可使用NSIS Edit作为脚本编辑工具
注意问题:
(1). 如果编译脚本提示 Icon大小不匹配,需要将安装和卸载图标的大小,色度改为一致
我写的安装包脚本:其中涉及到系统函数的调用,自定义对话框的显示属于较有用的脚本
; -------------------------------------------- ; 安装包信息 !define PRODUCT_NAME "yhxs3344" ; 要修改安装包,快捷方式版本,请修改此常量 !define PRODUCT_VERSION "1.6.1" !define PRODUCT_PUBLISHER "yhxs3344.net" !define PRODUCT_WEB_SITE "http://www.yhxs3344.net" ;--------------------------------------------- ;引用的系统脚本 ;Include Modern UI !include "MUI.nsh" !include "WinMessages.nsh" ;--------------------------------------------- ;定义语言常量 !define ENG 1033 !define CHS 2052 !define CHT 1028 !define CHT_HongKong 3076 !define CHS_Singapore 4100 !define CHT_Macao 5124 ;--------------------------------------------- ;General ;Name and file Name "yhxs3344" OutFile "yhxs3344-${PRODUCT_VERSION}-Setup.exe" ;Default installation folder InstallDir "$PROGRAMFILES/yhxs3344" ;----------------------------------------------- ;Interface Settings !define MUI_ABORTWARNING ;----------------------------------------------- ;程序显示的页眉图片 !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_BITMAP "files/headimage.bmp" ;欢迎页显示的图片 !define MUI_WELCOMEFINISHPAGE_BITMAP "files/welcomefinishpage.bmp" ;----------------------------------------------- ;安装显示图标及图片 !define MUI_ICON "files/yhxs3344.ico" ;卸载图标 !define MUI_UNICON "files/uninst.ico" ;----------------------------------------------- ;定义多语言字符串 ; 要加载的许可文件路径 LicenseLangString SETUP_License_Path ${CHS} "files/LicenseCHS.rtf" LicenseLangString SETUP_License_Path ${CHT} "files/LicenseCHT.rtf" ; 要打包的访问yhxs3344主页文件路径 LangString ACCESS_Home_Path ${CHS} "files/yhxs3344.com_CHS.htm" LangString ACCESS_Home_Path ${CHT} "files/yhxs3344.com_CHT.htm" ; 要打包的帮助文件路径 LangString Help_File_Path ${CHS} "files/yhxs3344Help_CHS.chm" LangString Help_File_Path ${CHT} "files/yhxs3344Help_CHT.chm" ; 欢迎页面显示信息字符串 LangString WELCOME_Page_Text ${CHS} "这个向导将指引你完成 $(^Name) 的安装进程。/r/n/r/n在开始安装之前,建议你先关闭正在运行的 $(^Name) 程序。这将允许“安装程序”更新或者删除指定的 $(^Name) 程序文件。/r/n/r/n单击[下一步(N)]继续。" LangString WELCOME_Page_Text ${CHT} "硂翾旧盢まЧΘ $(^Name) 杆秈祘/r/n/r/n秨﹍杆ぇ玡某闽超タ笲︽ $(^Name) 祘硂盢す砛杆祘穝┪埃﹚ $(^Name) 祘ゅン/r/n/r/n虫阑[˙(N)]膥尿" ;许可协议页面显示信息字符串 LangString LICENSE_RadTest_Accept ${CHS} "我接受$/"yhxs3344 软件最终用户许可协议$/"中的条款" LangString LICENSE_RadTest_Decline ${CHS} "我不接受$/"yhxs3344 软件最终用户许可协议$/"中的条款" LangString LICENSE_RadTest_Accept ${CHT} "и钡$/"yhxs3344 硁砰程沧ノめ砛某$/"い兵蹿" LangString LICENSE_RadTest_Decline ${CHT} "иぃ钡$/"yhxs3344 硁砰程沧ノめ砛某$/"い兵蹿" ; 安装完成页面显示信息字符串 LangString FINISH_Page_Text ${CHS} "$(^Name) 已成功安装到你的系统。/r/n单击 [完成(F)] 关闭 $(^Name) 安装向导。" LangString FINISH_Page_Text ${CHT} "$(^Name) Θ杆╰参/r/n虫阑 [ЧΘ(F)] 闽超 $(^Name) 杆翾旧" LangString FINISH_Auto_Run ${CHS} "运行yhxs3344" LangString FINISH_Auto_Run ${CHT} "笲︽yhxs3344" LangString FINISH_Access_Home ${CHS} "访问www.yhxs3344.com首页" LangString FINISH_Access_Home ${CHT} "砐拜www.yhxs3344.com" ; 写入注册表标记程序运行语言版本 LangString PROGRAM_Language ${CHS} "GB2312" LangString PROGRAM_Language ${CHT} "BIG5" ; 检测到yhxs3344已经运行的提示信息 LangString ProgramRunningPrompt ${CHS} "$(^Name) 安装程序检测到你的计算机上 $(^Name) 软件正在运行,请关闭正在运行的 $(^Name) 软件。" LangString ProgramRunningPrompt ${CHT} "$(^Name) 杆祘浪代璸衡诀 $(^Name) 硁ンタ笲︽叫闽超タ笲︽ $(^Name) 硁ン" ; 检测到已安装yhxs3344提示 LangString CheckPreInstPrompt ${CHS} "安装程序检测到您的计算机上存在以前安装的 $(^Name) 软件,是否卸载以前安装的 $(^Name) 软件并重新安装 $(^Name) 软件?" LangString CheckPreInstPrompt ${CHT} "杆祘浪代眤璸衡诀玡杆 $(^Name) 硁ン琌更玡杆 $(^Name) 硁ン穝杆 $(^Name) 硁ン" ;----------------------------------------------- ;安装,卸载页面设置 ; 欢迎页面显示信息 !define MUI_WELCOMEPAGE_TEXT $(WELCOME_Page_Text) ; 许可页面设置 !define MUI_LICENSEPAGE_RADIOBUTTONS Section License_GUI_Setting ;协议许可选择按钮显示的说明字符 !define MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT "$(LICENSE_RadTest_Accept)" !define MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE "$(LICENSE_RadTest_Decline)" SectionEnd ; 安装页面设置 ; 去掉安装完成自动关闭功能 !define MUI_FINISHPAGE_NOAUTOCLOSE ; 安装完成页面设置 ;运行软件复选框 !define MUI_FINISHPAGE_TEXT $(FINISH_Page_Text) !define MUI_FINISHPAGE_RUN "$INSTDIR/${PRODUCT_NAME}.exe" !define MUI_FINISHPAGE_RUN_TEXT $(FINISH_Auto_Run) ;访问首页复选框 !define MUI_FINISHPAGE_SHOWREADME "$INSTDIR/yhxs3344.com.htm" !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED !define MUI_FINISHPAGE_SHOWREADME_TEXT $(FINISH_Access_Home) ; 卸载页面设置 ; 去掉卸载完成自动关闭功能 !define MUI_UNFINISHPAGE_NOAUTOCLOSE ;----------------------------------------------- ;安装显示的页 Page custom Region_Check ;自定义页,检测安装包运行的操作系统区域 !define MUI_PAGE_CUSTOMFUNCTION_LEAVE PROGRAM_Running_Check !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE $(SETUP_License_Path) !define MUI_PAGE_CUSTOMFUNCTION_PRE CheckPreInstallation !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH ;卸载显示的页 !define MUI_PAGE_CUSTOMFUNCTION_LEAVE un.Uninstall_Check !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES UninstPage custom un.DeleteAllFile_Show un.DeleteAllFile_Leave ;自定义页,删除所有文件 !insertmacro MUI_UNPAGE_FINISH ;--------------------------------------------- ;安装程序窗口底部的文本 BrandingText "yhxs3344.com" ;--------------------------------------------- ;Languages !insertmacro MUI_LANGUAGE "TradChinese" !insertmacro MUI_LANGUAGE "SimpChinese" ;--------------------------------------------- ;加载自定义界面 ;Reserve Files ReserveFile "files/RegionError.ini" ReserveFile "files/DeleteAllFile.ini" !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS ;******************************安装脚本********************************* ;--------------------------------------------- ;Installer Sections Section "Dummy Section" SecDummy SetOutPath $INSTDIR ;Create uninstaller WriteUninstaller $INSTDIR/Uninstall.exe SectionEnd ;将安装文件加入安装包 Section "MainSection" SEC01 SetOutPath "$INSTDIR" SetOverwrite ifnewer ;yhxs3344基本运行文件 File "files/yhxs3344.exe" StrCmp $LANGUAGE ${LANG_TRADCHINESE} 0 +3 File "/oname=yhxs3344.com.htm" "files/yhxs3344.com_CHT.htm" File "/oname=yhxs3344.chm" "files/yhxs3344_CHT.chm" StrCmp $LANGUAGE ${LANG_SIMPCHINESE} 0 +3 File "/oname=yhxs3344.com.htm" "files/yhxs3344.com_CHS.htm" File "/oname=yhxs3344.chm" "files/yhxs3344_CHS.chm" ;yhxs3344自动升级文件 File "files/AutoUpdate.exe" File "files/yhxs3344.ini" ;yhxs3344使用的Dll File "files/id3lib.dll" File "files/msvbvm60.dll" CreateDirectory "$INSTDIR/dll" File "/oname=$INSTDIR/dll/Helper.dll" "files/dll/Helper.dll" File "/oname=$INSTDIR/dll/Pluggable.dll" "files/dll/Pluggable.dll" ;创建开始菜单目录 CreateDirectory "$SMPROGRAMS/yhxs3344" ; 创建开始菜单快捷方式 CreateShortCut "$SMPROGRAMS/yhxs3344/yhxs3344 ${PRODUCT_VERSION}.lnk" "$INSTDIR/yhxs3344.exe" CreateShortCut "$SMPROGRAMS/yhxs3344/www.yhxs3344.com.lnk" "$INSTDIR/yhxs3344.com.htm" CreateShortCut "$SMPROGRAMS/yhxs3344/yhxs3344 Help.lnk" "$INSTDIR/yhxs3344.chm" ;创建桌面快捷方式 CreateShortCut "$DESKTOP/yhxs3344 ${PRODUCT_VERSION}.lnk" "$INSTDIR/yhxs3344.exe" SectionEnd ;--------------------------------------------- ; 创建反安装快捷方式 Section -AdditionalIcons CreateShortCut "$SMPROGRAMS/yhxs3344/Uninstall.lnk" "$INSTDIR/Uninstall.exe" SectionEnd ;--------------------------------------------- ; 创建注册表项 Section "Registry" WriteRegStr HKCU "Software/${PRODUCT_NAME}Client" "LANGUAGE" $(PROGRAM_Language) WriteRegStr HKLM "Software/Microsoft/Windows/CurrentVersion/Uninstall/yhxs3344" "DisplayName" "${PRODUCT_NAME}" WriteRegStr HKLM "Software/Microsoft/Windows/CurrentVersion/Uninstall/yhxs3344" "UninstallString" "$INSTDIR/Uninstall.exe" ; 将安装路径路径写入注册表 WriteRegStr HKCU "Software/${PRODUCT_NAME}Client" "MainFolder" "$INSTDIR/" ; 在注册表中写入安装时选择的语言编码 WriteRegDWORD HKLM "Software/Microsoft/Windows/CurrentVersion/Uninstall/yhxs3344" "InstallLanguage" $LANGUAGE SectionEnd ;--------------------------------------------- ; 注册yhxs3344运行需要Dll Section AutoReg_Dll RegDLL $INSTDIR/dll/Helper.dll RegDll $INSTDIR/dll/Pluggable.dll SectionEnd ;--------------------------------------------- ;安装初始化函数 Function .onInit !insertmacro MUI_INSTALLOPTIONS_EXTRACT_AS "files/RegionError.ini" "RegionError.ini" ;安装语言选择页面显示 !insertmacro MUI_LANGDLL_DISPLAY FunctionEnd ;--------------------------------------------- ; 检测已安装信息 Function CheckPreInstallation StrCpy $0 0 loop: EnumRegKey $1 HKLM "Software/Microsoft/Windows/CurrentVersion/Uninstall/" $0 StrCmp $1 "" exit +1 ReadRegStr $2 HKLM "Software/Microsoft/Windows/CurrentVersion/Uninstall/$1" "DisplayName" StrCmp $2 "yhxs3344" done +1 IntOp $0 $0 + 1 Goto loop done: ReadRegStr $3 HKLM "Software/Microsoft/Windows/CurrentVersion/Uninstall/$1" "UninstallString" MessageBox MB_YESNO|MB_ICONQUESTION $(CheckPreInstPrompt) IDYES +1 IDNO +3 ;Abort ExecWait $3 exit: FunctionEnd ;--------------------------------------------- ; 检测yhxs3344是否正在运行函数 Function PROGRAM_Running_Check ; 检测yhxs3344是否正在运行 ;MessageBox MB_OK "PROGRAM_Running_Check" Push $0 FindWindow $0 "yhxs3344WindowClass" IntCmp $0 0 +4 +4 MessageBox MB_OK|MB_ICONEXCLAMATION $(ProgramRunningPrompt) Pop $0 Abort FunctionEnd ;--------------------------------------------- ; 自定义对话框函数 Function Region_Check ;FunctionName defined with Page command ;Display the Install Options dialog Push $0 retry: ; 获取系统区域语言ID System::Call "Kernel32::GetSystemDefaultLangID(v ..) i .s" Pop $0 IntOp $0 $0 & 0xFFFF ;MessageBox MB_OK $0 ; 判断获取的区域语言ID是否符合yhxs3344运行要求 IntCmp $0 ${CHS} installcontinue +1 +1 IntCmp $0 ${CHT} installcontinue +1 +1 IntCmp $0 ${CHT_HongKong} installcontinue +1 +1 IntCmp $0 ${CHS_Singapore} installcontinue +1 +1 IntCmp $0 ${CHT_Macao} installcontinue +1 +1 Push $R0 ; 提示用户更改区域语言设置 !insertmacro MUI_HEADER_TEXT "Warning" "Your region option and default language is NOT Chinese" ;!insertmacro MUI_INSTALLOPTIONS_INITDIALOG "RegionError.ini" ;!insertmacro MUI_INSTALLOPTIONS_SHOW ;!insertmacro MUI_INSTALLOPTIONS_SHOW_RETURN !insertmacro MUI_INSTALLOPTIONS_DISPLAY_RETURN "RegionError.ini" Pop $R0 ;MessageBox MB_OK $R0 StrCmp $R0 "success" 0 +2 Goto retry Pop $R0 installcontinue: Pop $0 FunctionEnd ;******************************卸载脚本********************************* ;--------------------------------------------- ;定义卸载语言字符串常量 LangString Page_DeleteAllFile_Text ${CHS} "注意" LangString Page_DeleteAllFile_Text ${CHT} "猔種" LangString Page_DeleteAllFile_SubText ${CHS} "请选择是否删除所有文件" LangString Page_DeleteAllFile_SubText ${CHT} "叫匡拒琌埃┮Τ郎" LangString Page_DeleteAllFile_Field1 ${CHS} "卸载程序发现yhxs3344的安装目录下,有一些用户自己创建的文件夹。其中可能是用户的登录信息或已下载的文件。请您选择删除或保留这些内容。" LangString Page_DeleteAllFile_Field1 ${CHT} "更祘Α祇瞷yhxs3344杆ヘ魁Τㄇノめ承郎Жㄤい琌ノめ祅魁玹高┪更郎叫眤匡拒埃┪玂痙硂ㄇず甧" LangString Page_DeleteAllFile_Field2 ${CHS} "把yhxs3344安装目录下的内容全部删除" LangString Page_DeleteAllFile_Field2 ${CHT} "рyhxs3344杆ヘ魁ず甧场埃" LangString Page_DeleteAllFile_Field3 ${CHS} "保留这些内容" LangString Page_DeleteAllFile_Field3 ${CHT} "玂痙硂ㄇず甧" LangString Delete_dll_Prompt1 ${CHS} "文件:" LangString Delete_dll_Prompt1 ${CHT} "郎" LangString Delete_dll_Prompt2 ${CHS} "正在被使用,不能成功卸载,请您关闭所有运行的程序或重新启动计算机后手动删除这些文件。" LangString Delete_dll_Prompt2 ${CHT} "タ砆ㄏノぃΘ更叫眤闽超┮Τ笲︽祘Α┪穝币笆筿福も笆埃硂ㄇ郎" ;--------------------------------------------- ;定义变量 Var HWND Var DLGITEM Var DELETE_DLL_EXCEPTION ;--------------------------------------------- ; 删除安装的文件 Section "Uninstall" SetOutPath $TEMP ; 反注册dll UnRegDLL $INSTDIR/dll/Helper.dll ;UnRegDLL $INSTDIR/dll/IEHelper.dll UnRegDLL $INSTDIR/dll/Pluggable.dll ; 删除注册表项 DeleteRegKey HKLM "Software/Microsoft/Windows/CurrentVersion/Uninstall/yhxs3344" ;MessageBox MB_OK "SOFTWARE/$(^Name)Client" DeleteRegKey HKCU "SOFTWARE/$(^Name)Client" ; 删除程序菜单项 Delete "$SMPROGRAMS/$(^Name)/*.*" ;MessageBox MB_OK "$SMPROGRAMS/$(^Name)" RMDir "$SMPROGRAMS/$(^Name)" ; 删除桌面快捷方式 Delete "$DESKTOP/$(^Name)*.lnk" ;MessageBox MB_OK "$DESKTOP/$(^Name)*.lnk" Delete "$INSTDIR/debuglog/*.*" RMDir "$INSTDIR/debuglog" ;删除yhxs3344基本文件 Delete "$INSTDIR/yhxs3344*.*" Delete "$INSTDIR/Uninstall.exe" ; 删除Dll Delete "$INSTDIR/id3lib.dll" Delete "$INSTDIR/msvbvm60.dll" Delete "$INSTDIR/dll/Helper.dll" Delete "$INSTDIR/dll/Pluggable.dll" RMDir "$INSTDIR/dll" ; 删除Dll生成的文件 Delete "$INSTDIR/CmdFile.ini" ; 删除自动更新可执行文件 Delete "$INSTDIR/AutoUpdate.exe" Delete "$INSTDIR/yhxs3344.ini" ; 删除自动更新下载得到的文件 IfFileExists "$INSTDIR/UpdateConfig.ini" 0 +2 Delete "$INSTDIR/UpdateConfig.ini" SectionEnd ;--------------------------------------------- ;卸载初始化函数 Function un.onInit ReadRegDWORD $LANGUAGE HKLM "Software/Microsoft/Windows/CurrentVersion/Uninstall/yhxs3344" "InstallLanguage" ;!insertmacro MUI_UNGETLANGUAGE IntCmp $LANGUAGE 2052 0 +2 +2 MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你确认要完全移除 $(^Name),及其所有的组件?" IDYES uninstall_run IDNO uninstall_abort IntCmp $LANGUAGE 1028 0 +2 +2 MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "絋粄璶Ч簿埃 $(^Name)のㄤ┮Τ舱ン" IDYES uninstall_run IDNO uninstall_abort uninstall_abort: Abort uninstall_run: ;提取删除所有文件页面INI文件 !insertmacro MUI_INSTALLOPTIONS_EXTRACT_AS "files/DeleteAllFile.ini" "DeleteAllFile.ini" FunctionEnd Function un.onUninstSuccess ; 根据设置删除所有文件 Push $R0 !insertmacro MUI_INSTALLOPTIONS_READ $R0 "DeleteAllFile.ini" "Field 2" "State" ;MessageBox MB_OK $R0 IntCmp $R0 1 0 +2 +2 ;MessageBox MB_OK "选择删除所有文件" RMDir /r $INSTDIR ;递归删除安装目录 Pop $R0 ; 检查Dll是否删除成功 StrCpy $DELETE_DLL_EXCEPTION "" IfFileExists "$INSTDIR/dll/Helper.dll" 0 +2 StrCpy $DELETE_DLL_EXCEPTION "$INSTDIR/dll/Helper.dll," IfFileExists "$INSTDIR/dll/Pluggable.dll" 0 +2 StrCpy $DELETE_DLL_EXCEPTION "$DELETE_DLL_EXCEPTION$INSTDIR/dll/Pluggable.dll" StrCmp $DELETE_DLL_EXCEPTION "" +4 0 ; 提示用户 StrCpy $DELETE_DLL_EXCEPTION "$(Delete_dll_Prompt1) $DELETE_DLL_EXCEPTION" StrCpy $DELETE_DLL_EXCEPTION "$DELETE_DLL_EXCEPTION $(Delete_dll_Prompt2)" MessageBox MB_OK|MB_ICONINFORMATION $DELETE_DLL_EXCEPTION ;MessageBox MB_OK $INSTDIR RMDir $INSTDIR FunctionEnd ;卸载检测 Function un.Uninstall_Check ; 检测yhxs3344是否正在运行 ;MessageBox MB_OK "Call Uninstall_Check" Push $0 FindWindow $0 "yhxs3344WindowClass" IntCmp $0 0 +4 +4 MessageBox MB_OK|MB_ICONEXCLAMATION $(ProgramRunningPrompt) Pop $0 Abort FunctionEnd ;删除所有文件及目录页显示 Function un.DeleteAllFile_Show Push $0 Push $1 !insertmacro MUI_HEADER_TEXT $(Page_DeleteAllFile_Text) $(Page_DeleteAllFile_SubText) !insertmacro MUI_INSTALLOPTIONS_INITDIALOG "DeleteAllFile.ini" ;更改页显示的信息字符串 Pop $HWND ;MessageBox MB_OK $(Page_DeleteAllFile_SubText) ;MessageBox MB_OK $DLGITEM_TEXT GetDlgItem $DLGITEM $HWND 1200 SendMessage $DLGITEM ${WM_SETTEXT} 0 'STR:$(Page_DeleteAllFile_Field1)' GetDlgItem $DLGITEM $HWND 1201 SendMessage $DLGITEM ${WM_SETTEXT} 0 'STR:$(Page_DeleteAllFile_Field2)' GetDlgItem $DLGITEM $HWND 1202 SendMessage $DLGITEM ${WM_SETTEXT} 0 'STR:$(Page_DeleteAllFile_Field3)' FindFirst $0 $1 $INSTDIR/*.* StrCmp $1 "." 0 +1 FindNext $0 $1 StrCmp $1 ".." 0 +1 FindNext $0 $1 StrCmp $1 "" Page_Disable 0 !insertmacro MUI_INSTALLOPTIONS_SHOW Page_Disable: FindClose $0 Pop $1 Pop $0 FunctionEnd ;删除所有文件及目录页离开 Function un.DeleteAllFile_Leave FunctionEnd