本文共 14746 字,大约阅读时间需要 49 分钟。
使用NSIS作为软件打包发布安装包工具
可使用NSIS Edit作为脚本编辑工具 注意问题:(1). 如果编译脚本提示 Icon大小不匹配,需要将安装和卸载图标的大小,色度改为一致论坛: http://bbs.hanzify.org/index.php?s=c615fa750d55f9b21d68f62ef32d2fa7&showforum=8 登陆名: kuxun_nsisPwd: kuxun我写的安装包脚本:其中涉及到系统函数的调用,自定义对话框的显示属于较有用的脚本;---------------------------------------------;CoXoo安装包脚本;文件创建日期: 2005-08026;文件作者: 周敏;备注: 修改脚本请先阅读NSIS帮助和脚本注释;---------------------------------------------; --------------------------------------------; 安装包信息!define PRODUCT_NAME "CoXoo"; 要修改安装包,快捷方式版本,请修改此常量!define PRODUCT_VERSION "1.6.1"!define PRODUCT_PUBLISHER "CoXoo.com"!define PRODUCT_WEB_SITE "http://www.coxoo.com";---------------------------------------------;引用的系统脚本;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 fileName "CoXoo"OutFile "CoXoo-${PRODUCT_VERSION}-Setup.exe";Default installation folderInstallDir "$PROGRAMFILES/CoXoo";-----------------------------------------------;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/CoXoo.ico";卸载图标!define MUI_UNICON "files/uninst.ico";-----------------------------------------------;定义多语言字符串; 要加载的许可文件路径LicenseLangString SETUP_License_Path ${CHS} "files/LicenseCHS.rtf"LicenseLangString SETUP_License_Path ${CHT} "files/LicenseCHT.rtf"; 要打包的访问coxoo主页文件路径LangString ACCESS_Home_Path ${CHS} "files/coxoo.com_CHS.htm"LangString ACCESS_Home_Path ${CHT} "files/coxoo.com_CHT.htm"; 要打包的帮助文件路径LangString Help_File_Path ${CHS} "files/CoXooHelp_CHS.chm"LangString Help_File_Path ${CHT} "files/CoXooHelp_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} "我接受$/"CoXoo 软件最终用户许可协议$/"中的条款"LangString LICENSE_RadTest_Decline ${CHS} "我不接受$/"CoXoo 软件最终用户许可协议$/"中的条款"LangString LICENSE_RadTest_Accept ${CHT} "и钡$/"CoXoo 硁砰程沧ノめ砛某$/"い兵蹿"LangString LICENSE_RadTest_Decline ${CHT} "иぃ钡$/"CoXoo 硁砰程沧ノめ砛某$/"い兵蹿"; 安装完成页面显示信息字符串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} "运行CoXoo"LangString FINISH_Auto_Run ${CHT} "笲︽CoXoo"LangString FINISH_Access_Home ${CHS} "访问www.coxoo.com首页"LangString FINISH_Access_Home ${CHT} "砐拜www.coxoo.com"; 写入注册表标记程序运行语言版本LangString PROGRAM_Language ${CHS} "GB2312"LangString PROGRAM_Language ${CHT} "BIG5"; 检测到CoXoo已经运行的提示信息LangString ProgramRunningPrompt ${CHS} "$(^Name) 安装程序检测到你的计算机上 $(^Name) 软件正在运行,请关闭正在运行的 $(^Name) 软件。"LangString ProgramRunningPrompt ${CHT} "$(^Name) 杆祘浪代璸衡诀 $(^Name) 硁ンタ笲︽叫闽超タ笲︽ $(^Name) 硁ン"; 检测到已安装CoXoo提示LangString CheckPreInstPrompt ${CHS} "安装程序检测到您的计算机上存在以前安装的 $(^Name) 软件,是否卸载以前安装的 $(^Name) 软件并重新安装 $(^Name) 软件?"LangString CheckPreInstPrompt ${CHT} "杆祘浪代眤璸衡诀玡杆 $(^Name) 硁ン琌更玡杆 $(^Name) 硁ン穝杆 $(^Name) 硁ン";-----------------------------------------------;安装,卸载页面设置; 欢迎页面显示信息!define MUI_WELCOMEPAGE_TEXT $(WELCOME_Page_Text); 许可页面设置!define MUI_LICENSEPAGE_RADIOBUTTONSSection 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/CoXoo.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_INSTFILESUninstPage custom un.DeleteAllFile_Show un.DeleteAllFile_Leave ;自定义页,删除所有文件!insertmacro MUI_UNPAGE_FINISH;---------------------------------------------;安装程序窗口底部的文本BrandingText "CoXoo.com";---------------------------------------------;Languages!insertmacro MUI_LANGUAGE "TradChinese"!insertmacro MUI_LANGUAGE "SimpChinese";---------------------------------------------;加载自定义界面;Reserve FilesReserveFile "files/RegionError.ini"ReserveFile "files/DeleteAllFile.ini"!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS;******************************安装脚本*********************************;---------------------------------------------;Installer SectionsSection "Dummy Section" SecDummySetOutPath $INSTDIR;Create uninstallerWriteUninstaller $INSTDIR/Uninstall.exeSectionEnd;将安装文件加入安装包Section "MainSection" SEC01SetOutPath "$INSTDIR"SetOverwrite ifnewer;CoXoo基本运行文件File "files/CoXoo.exe"StrCmp $LANGUAGE ${LANG_TRADCHINESE} 0 +3File "/oname=coxoo.com.htm" "files/CoXoo.com_CHT.htm"File "/oname=CoXoo.chm" "files/CoXoo_CHT.chm"StrCmp $LANGUAGE ${LANG_SIMPCHINESE} 0 +3File "/oname=coxoo.com.htm" "files/CoXoo.com_CHS.htm"File "/oname=CoXoo.chm" "files/CoXoo_CHS.chm";CoXoo自动升级文件File "files/AutoUpdate.exe"File "files/CoXoo.ini";CoXoo使用的DllFile "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/CoXoo"; 创建开始菜单快捷方式CreateShortCut "$SMPROGRAMS/CoXoo/CoXoo ${PRODUCT_VERSION}.lnk" "$INSTDIR/CoXoo.exe"CreateShortCut "$SMPROGRAMS/CoXoo/www.coxoo.com.lnk" "$INSTDIR/coxoo.com.htm"CreateShortCut "$SMPROGRAMS/CoXoo/CoXoo Help.lnk" "$INSTDIR/CoXoo.chm";创建桌面快捷方式CreateShortCut "$DESKTOP/CoXoo ${PRODUCT_VERSION}.lnk" "$INSTDIR/CoXoo.exe"SectionEnd;---------------------------------------------; 创建反安装快捷方式Section -AdditionalIconsCreateShortCut "$SMPROGRAMS/CoXoo/Uninstall.lnk" "$INSTDIR/Uninstall.exe"SectionEnd;---------------------------------------------; 创建注册表项Section "Registry"WriteRegStr HKCU "Software/${PRODUCT_NAME}Client" "LANGUAGE" $(PROGRAM_Language)WriteRegStr HKLM "Software/Microsoft/Windows/CurrentVersion/Uninstall/CoXoo" "DisplayName" "${PRODUCT_NAME}"WriteRegStr HKLM "Software/Microsoft/Windows/CurrentVersion/Uninstall/CoXoo" "UninstallString" "$INSTDIR/Uninstall.exe"; 将安装路径路径写入注册表WriteRegStr HKCU "Software/${PRODUCT_NAME}Client" "MainFolder" "$INSTDIR/"; 在注册表中写入安装时选择的语言编码WriteRegDWORD HKLM "Software/Microsoft/Windows/CurrentVersion/Uninstall/CoXoo" "InstallLanguage" $LANGUAGESectionEnd;---------------------------------------------; 注册CoXoo运行需要DllSection AutoReg_DllRegDLL $INSTDIR/dll/Helper.dllRegDll $INSTDIR/dll/Pluggable.dllSectionEnd;---------------------------------------------;安装初始化函数Function .onInit!insertmacro MUI_INSTALLOPTIONS_EXTRACT_AS "files/RegionError.ini" "RegionError.ini";安装语言选择页面显示!insertmacro MUI_LANGDLL_DISPLAYFunctionEnd;---------------------------------------------; 检测已安装信息Function CheckPreInstallationStrCpy $0 0loop:EnumRegKey $1 HKLM "Software/Microsoft/Windows/CurrentVersion/Uninstall/" $0StrCmp $1 "" exit +1ReadRegStr $2 HKLM "Software/Microsoft/Windows/CurrentVersion/Uninstall/$1" "DisplayName"StrCmp $2 "CoXoo" done +1IntOp $0 $0 + 1Goto loopdone:ReadRegStr $3 HKLM "Software/Microsoft/Windows/CurrentVersion/Uninstall/$1" "UninstallString"MessageBox MB_YESNO|MB_ICONQUESTION $(CheckPreInstPrompt) IDYES +1 IDNO +3;AbortExecWait $3exit:FunctionEnd;---------------------------------------------; 检测CoXoo是否正在运行函数Function PROGRAM_Running_Check; 检测CoXoo是否正在运行;MessageBox MB_OK "PROGRAM_Running_Check"Push $0FindWindow $0 "CoXooWindowClass"IntCmp $0 0 +4 +4MessageBox MB_OK|MB_ICONEXCLAMATION $(ProgramRunningPrompt)Pop $0AbortFunctionEnd;---------------------------------------------; 自定义对话框函数Function Region_Check ;FunctionName defined with Page command;Display the Install Options dialogPush $0retry:; 获取系统区域语言IDSystem::Call "Kernel32::GetSystemDefaultLangID(v ..) i .s"Pop $0IntOp $0 $0 & 0xFFFF;MessageBox MB_OK $0; 判断获取的区域语言ID是否符合CoXoo运行要求IntCmp $0 ${CHS} installcontinue +1 +1IntCmp $0 ${CHT} installcontinue +1 +1IntCmp $0 ${CHT_HongKong} installcontinue +1 +1IntCmp $0 ${CHS_Singapore} installcontinue +1 +1IntCmp $0 ${CHT_Macao} installcontinue +1 +1Push $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 $R0StrCmp $R0 "success" 0 +2Goto retryPop $R0installcontinue:Pop $0FunctionEnd;******************************卸载脚本*********************************;---------------------------------------------;定义卸载语言字符串常量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} "卸载程序发现CoXoo的安装目录下,有一些用户自己创建的文件夹。其中可能是用户的登录信息或已下载的文件。请您选择删除或保留这些内容。"LangString Page_DeleteAllFile_Field1 ${CHT} "更祘Α祇瞷CoXoo杆ヘ魁Τㄇノめ承郎Жㄤい琌ノめ祅魁玹高┪更郎叫眤匡拒埃┪玂痙硂ㄇず甧"LangString Page_DeleteAllFile_Field2 ${CHS} "把CoXoo安装目录下的内容全部删除"LangString Page_DeleteAllFile_Field2 ${CHT} "рCoXoo杆ヘ魁ず甧场埃"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 HWNDVar DLGITEMVar DELETE_DLL_EXCEPTION;---------------------------------------------; 删除安装的文件Section "Uninstall"SetOutPath $TEMP; 反注册dllUnRegDLL $INSTDIR/dll/Helper.dll;UnRegDLL $INSTDIR/dll/IEHelper.dllUnRegDLL $INSTDIR/dll/Pluggable.dll; 删除注册表项DeleteRegKey HKLM "Software/Microsoft/Windows/CurrentVersion/Uninstall/CoXoo";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";删除CoXoo基本文件Delete "$INSTDIR/CoXoo*.*"Delete "$INSTDIR/Uninstall.exe"; 删除DllDelete "$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/CoXoo.ini"; 删除自动更新下载得到的文件IfFileExists "$INSTDIR/UpdateConfig.ini" 0 +2Delete "$INSTDIR/UpdateConfig.ini"SectionEnd;---------------------------------------------;卸载初始化函数Function un.onInitReadRegDWORD $LANGUAGE HKLM "Software/Microsoft/Windows/CurrentVersion/Uninstall/CoXoo" "InstallLanguage";!insertmacro MUI_UNGETLANGUAGEIntCmp $LANGUAGE 2052 0 +2 +2MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你确认要完全移除 $(^Name),及其所有的组件?" IDYES uninstall_run IDNO uninstall_abortIntCmp $LANGUAGE 1028 0 +2 +2MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "絋粄璶Ч簿埃 $(^Name)のㄤ┮Τ舱ン" IDYES uninstall_run IDNO uninstall_abortuninstall_abort:Abortuninstall_run:;提取删除所有文件页面INI文件!insertmacro MUI_INSTALLOPTIONS_EXTRACT_AS "files/DeleteAllFile.ini" "DeleteAllFile.ini"FunctionEndFunction un.onUninstSuccess; 根据设置删除所有文件Push $R0!insertmacro MUI_INSTALLOPTIONS_READ $R0 "DeleteAllFile.ini" "Field 2" "State";MessageBox MB_OK $R0IntCmp $R0 1 0 +2 +2;MessageBox MB_OK "选择删除所有文件"RMDir /r $INSTDIR ;递归删除安装目录Pop $R0; 检查Dll是否删除成功StrCpy $DELETE_DLL_EXCEPTION ""IfFileExists "$INSTDIR/dll/Helper.dll" 0 +2StrCpy $DELETE_DLL_EXCEPTION "$INSTDIR/dll/Helper.dll,"IfFileExists "$INSTDIR/dll/Pluggable.dll" 0 +2StrCpy $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 $INSTDIRRMDir $INSTDIRFunctionEnd;卸载检测Function un.Uninstall_Check; 检测CoXoo是否正在运行;MessageBox MB_OK "Call Uninstall_Check"Push $0FindWindow $0 "CoXooWindowClass"IntCmp $0 0 +4 +4MessageBox MB_OK|MB_ICONEXCLAMATION $(ProgramRunningPrompt)Pop $0AbortFunctionEnd;删除所有文件及目录页显示Function un.DeleteAllFile_ShowPush $0Push $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_TEXTGetDlgItem $DLGITEM $HWND 1200SendMessage $DLGITEM ${WM_SETTEXT} 0 'STR:$(Page_DeleteAllFile_Field1)'GetDlgItem $DLGITEM $HWND 1201SendMessage $DLGITEM ${WM_SETTEXT} 0 'STR:$(Page_DeleteAllFile_Field2)'GetDlgItem $DLGITEM $HWND 1202SendMessage $DLGITEM ${WM_SETTEXT} 0 'STR:$(Page_DeleteAllFile_Field3)'FindFirst $0 $1 $INSTDIR/*.*StrCmp $1 "." 0 +1FindNext $0 $1StrCmp $1 ".." 0 +1FindNext $0 $1StrCmp $1 "" Page_Disable 0!insertmacro MUI_INSTALLOPTIONS_SHOWPage_Disable:FindClose $0Pop $1Pop $0FunctionEnd;删除所有文件及目录页离开Function un.DeleteAllFile_LeaveFunctionEnd转载地址:http://kggdi.baihongyu.com/