NSIS制作32+64位安装包
来源:互联网 发布:js页面重载 编辑:程序博客网 时间:2024/06/06 09:58
只是简单的将32和64的安装脚本组合在一起制作的安装包,会根据系统选择性地安装对应的东西到对应路径下。
; 安装程序初始定义常量 RequestExecutionLevel admin ;------针对UAC进行权限请求 !define PRODUCT_NAME "xxx" !define PRODUCT_VERSION "1.0" !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\xxx.exe" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" !define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir" SetCompressor /SOLID lzma SetCompressorDictSize 32 ; ------ MUI 现代界面定义 (1.67 版本以上兼容) ------ ;--------------x64安装定义---------------------------- !include "MUI.nsh" !include "x64.nsh" #---------加入64位头文件---------- !include "Library.nsh" !define LIBRARY_X64 ;----------------------------------------------------- ; MUI 预定义常量 !define MUI_ABORTWARNING !define MUI_ICON "E:\xxx\logo.ico" !define MUI_UNICON "E:\xxx\modern-uninstall.ico" ; 语言选择窗口常量设置 !define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}" !define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}" !define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language" ; 欢迎页面 !insertmacro MUI_PAGE_WELCOME ; 安装目录选择页面 !insertmacro MUI_PAGE_DIRECTORY ; 开始菜单设置页面 ; -------------------定义语言字符串变量----------------------------- LangString LANG_PRODUCT_FLODER 1033 "xxx English" LangString LANG_PRODUCT_FLODER 2052 "xxx 简中" LangString LANG_PRODUCT_FLODER 1028 "xxx 繁中" LangString LANG_PRODUCT_NAME 1033 "xxx English" LangString LANG_PRODUCT_NAME 2052 "xxx 简中" LangString LANG_PRODUCT_NAME 1028 "xxx 繁中" ; ------------------------------------------------------------------ var ICONS_GROUP !define MUI_STARTMENUPAGE_NODISABLE !define MUI_STARTMENUPAGE_DEFAULTFOLDER "$(LANG_PRODUCT_FLODER)\$(LANG_PRODUCT_NAME)\xxx" !define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}" !define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_STARTMENU_REGVAL}" !insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP ; 安装过程页面 !insertmacro MUI_PAGE_INSTFILES ; 安装完成页面 !define MUI_FINISHPAGE_RUN "$INSTDIR\xxx.exe" !insertmacro MUI_PAGE_FINISH ; 安装卸载过程页面 !insertmacro MUI_UNPAGE_INSTFILES ; 安装界面包含的语言设置 !insertmacro MUI_LANGUAGE "English" !insertmacro MUI_LANGUAGE "SimpChinese" !insertmacro MUI_LANGUAGE "TradChinese" ; 安装预释放文件 !insertmacro MUI_RESERVEFILE_LANGDLL !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS ; ------ MUI 现代界面定义结束 ------ Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" OutFile "Setup.exe" InstallDir "$PROGRAMFILES64\xxx\xxx" InstallDirRegKey HKLM "${PRODUCT_UNINST_KEY}" "UninstallString" ShowInstDetails show ShowUnInstDetails show Section "MainSection" SEC01 ${IF} ${RunningX64} ;----------------------------------- !ifdef LIBRARY_X64 ${DisableX64FSRedirection} !endif ;-------------------------------------- SetOutPath "$SYSDIR" SetOverwrite ifnewer File "E:\xxx\xxx" File "E:\xxx\xxx" ExecWait "$SYSDIR\xxx" SetOutPath "$INSTDIR" File "E:\xxx\xxx.exe" SetOutPath "C:\Windows\SysWOW64" SetOverwrite ifnewer File "E:\xxx\xxx" File "E:\xxx\xxx" File "E:\xxx\xxx" ; -------------------------------------------------------- ;----------与后面指令对应-------------- SetShellVarContext all ;-------------------------------------- ${Else} Call .inFirefox SetOutPath "$SYSDIR" SetOverwrite ifnewer File "E:\xxx\xxx" File "E:\xxx\xxx" File "E:\xxxx\xxx" ExecWait "$SYSDIR\xxx" SetOutPath "$INSTDIR" File "E:\xxx\xxx.exe" ; -------------------------------------------------------- ${EndIf} ; 创建开始菜单快捷方式 !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateDirectory "$SMPROGRAMS\$ICONS_GROUP" CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\xxx.lnk" "$INSTDIR\xxx.exe" CreateShortCut "$DESKTOP\Techshino.lnk" "$INSTDIR\xxx.exe" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd Section -AdditionalIcons !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk" "$INSTDIR\uninst.exe" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd Section -Post ${IF} ${RunningX64} ;----------给x64注册表访问权限----------- !ifdef LIBRARY_X64 SetRegView 64 !endif ;---------------------------------------- WriteUninstaller "$INSTDIR\uninst.exe" ;创建自启动 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Run" "xxx" "$INSTDIR\xxx.exe" WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\xxx.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\xxx.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" ;----------结束x64注册表访问权限----------- !ifdef LIBRARY_X64 SetRegView Lastused !endif ;---------------------------------------- ${Else}WriteUninstaller "$INSTDIR\uninst.exe" ;创建自启动 WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Run" "CNCBUK2TESOMon" "$INSTDIR\xxx.exe" WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\xxx.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\xxx.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" ${EndIf} SectionEnd #-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--# ; ------判断是否安装Firefox代码如下:------------------- Var Firefox Function .inFirefox ClearErrors ReadRegStr $Firefox HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe" "Path" IfErrors 0 ExitCheckFirefox Goto NoFirefox ExitCheckFirefox: SetOutPath "$Firefox\plugins" SetOverwrite ifnewer File "E:\xxx\xxx" NoFirefox: FunctionEnd /****************************** * 以下是安装程序的卸载部分 * ******************************/ #-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--# ;卸载菜单语言设置 ; -------------------设置多语言字符串显示----------------------------- LangString UNINSTALL_MESSAGE 1033 "Are you sure you want to completely remove [Techshino] and all of its components?" LangString UNINSTALL_MESSAGE 2052 "你确实要完全移除 [xxx] ,及其所有的组件?" LangString UNINSTALL_MESSAGE 1028 "妳確實要完全移除 [xxx] ,及其所有的組件?" LangString UNINSTALL_MESSAGE_OK 1033 "[xxx] was successfully removed from your computer." LangString UNINSTALL_MESSAGE_OK 2052 "[xxx] 已成功地从你的计算机移除。" LangString UNINSTALL_MESSAGE_OK 1028 "[xxx] 已成功地從妳的計算機移除。" ; -------------------------------------------------------------------- Section Uninstall ${IF} ${RunningX64} ;-------消除安装路径转向--------------- !ifdef LIBRARY_X64 ${DisableX64FSRedirection} !endif ;-------删除64系统system 32下文件---------------------- !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP nsProcess::_KillProcess "xxx.exe" Delete "$INSTDIR\uninst.exe" Delete /rebootok "$INSTDIR\xxx.exe" Delete "$SYSDIR\xxx" Delete "$SYSDIR\xxx" Delete "$SYSDIR\xxx" Delete "$SYSDIR\xxx" ;----------删除64系统SysWOW64下文件----------------------- Delete "C:\Windows\SysWOW64\xxx" Delete "C:\Windows\SysWOW64\xxx" Delete "C:\Windows\SysWOW64\xxx" Delete "C:\Windows\SysWOW64\xxx" Delete "C:\Windows\SysWOW64\xxx" ;-------------用于删除开始菜单快捷图标----------- SetShellVarContext all ;------------------------------------------------ Delete "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk" Delete "$DESKTOP\xxx.lnk" Delete "$SMPROGRAMS\$ICONS_GROUP\xxx.lnk" RMDir "$SMPROGRAMS\$ICONS_GROUP" RMDir "$SMPROGRAMS\$(LANG_PRODUCT_FLODER)\$(LANG_PRODUCT_NAME)" RMDir "$SMPROGRAMS\$(LANG_PRODUCT_FLODER)" RMDir /rebootok "$INSTDIR" RMDir /rebootok "$PROGRAMFILES64\xxx\xxx" RMDir /rebootok "$PROGRAMFILES64\xxx" ;----------给x64注册表访问权限----------- !ifdef LIBRARY_X64 SetRegView 64 !endif ;---------------------------------------- DeleteRegKey HKCU "Software\Microsoft\SystemCertificates\My\PhysicalStores" DeleteRegKey HKLM "Software\Microsoft\Cryptography\Defaults\Provider\xxx" DeleteRegValue HKLM "Software\Microsoft\Windows\CurrentVersion\Run" "xxx" DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" ;----------结束x64注册表访问权限----------- !ifdef LIBRARY_X64 SetRegView Lastused !endif ;---------------------------------------- SetAutoClose true ${Else} Call un.Firefox !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP KillProcDLL::KillProc "xxx.exe" Delete "$INSTDIR\uninst.exe" Delete /rebootok "$INSTDIR\xxx.exe" Delete "$SYSDIR\xxx" Delete "$SYSDIR\xxx" Delete "$SYSDIR\xxx" Delete "$SYSDIR\xxx" Delete "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk" Delete "$DESKTOP\xxx.lnk" Delete "$SMPROGRAMS\$ICONS_GROUP\xxx.lnk" RMDir "$SMPROGRAMS\$ICONS_GROUP" RMDir "$SMPROGRAMS\$(LANG_PRODUCT_FLODER)\$(LANG_PRODUCT_NAME)" RMDir "$SMPROGRAMS\$(LANG_PRODUCT_FLODER)" RMDir /rebootok "$INSTDIR" RMDir /rebootok "$PROGRAMFILES\xxx\xxx" RMDir /rebootok "$PROGRAMFILES\xxx" DeleteRegKey HKCU "Software\Microsoft\SystemCertificates\My\PhysicalStores" DeleteRegKey HKLM "SOFTWARE\Microsoft\Cryptography\Defaults\Provider\xxx" DeleteRegValue HKLM "Software\Microsoft\Windows\CurrentVersion\Run" "xxx" DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" SetAutoClose true ${EndIf} SectionEnd Function un.Firefox ; ------判断是否安装Firefox并删除DLL文件------------------- ClearErrors ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe" "Path" IfErrors 0 unExitCheckFirefox Goto unNoFirefox unExitCheckFirefox: Delete "$0\plugins\xxx"RMDIR "$0\plugins"unNoFirefox: FunctionEnd ; ---------------------------------------------------------- Function un.onInit !insertmacro MUI_UNGETLANGUAGE MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$(UNINSTALL_MESSAGE)" IDYES +2 Abort FunctionEnd Function un.onUninstSuccess HideWindow MessageBox MB_ICONINFORMATION|MB_OK "$(UNINSTALL_MESSAGE_OK)" FunctionEnd
NSIS生成的安装程序都是32位的应用程序,所以在x64下运行时,所安装的文件会被自动转向,如安装到C:\Windows\System32目录下的文件会被安装到C:\Windows\SysWOW64目录下。这对于有些软件是不方便的。 NSIS已经有现成的头文件 x64.nsh (X:\NSIS\Include\x64.nsh) 供大家使用 首先需要引用 !include "x64.nsh" x64.nsh 里有三个宏 _RunningX64、DisableX64FSRedirection 和 EnableX64FSRedirection 根据宏名称能猜到它们是功能,分别对应 检查运行环境是否是X64、禁止文件转向 和 运行文件转向 在实际调用的时候就可以根据实际需要来运用上述3个宏了。 简单的测试代码:
!include x64.nshFunction .onInit ${If} ${RunningX64} ${EnableX64FSRedirection} ${else} MessageBox MB_OK "Sorry this application runs only on x64 machines" Abort ${EndIf}FunctionEndSection - Detailprint '$SYSDIR' DetailPrint '$WINDIR' DetailPrint '$PROGRAMFILES'SectionEnd
NSIS生成的安装程序都是32位的应用程序,所以在x64下运行时,所安装的文件会被自动转向,如安装到C:\Windows\System32目录下 的文件会被安装到C:\Windows\SysWOW64目录下。这对于有些软件是不方便的。一个办法是重新编译NSIS的代码为64位,就是有点麻烦, 而且需要大量的时间测试一下。利用简单的代码也可以解决类似的问题: 1、检测操作系统是否为x64系统 可以读环境变量PROCESSOR_ARCHITECTURE,该变量在32位系统为x86,在AMD的x64的机器和在Intel的x64机器上为AMD64,在安腾(Itanium)系统为IA64。可以使用下面的代码: ReadEnvStr $Win64 PROCESSOR_ARCHITECTURE StrCmp $Win64 "x86" lbl_Win32 2、禁止文件转向 调用Wow64EnableWow64FsRedirection函数可以禁止或恢复文件转向。如: ; 禁止 System::Call "Kernel32::Wow64EnableWow64FsRedirection(i0)"......; 恢复System::Call "Kernel32::Wow64EnableWow64FsRedirection(i1)"
转自:http://blog.csdn.net/allens_zhou/article/details/8575734
参考:
http://it.oyksoft.com/post/4305/ http://blog.csdn.net/yysyangyangyangshan/article/details/7172294
http://www.cnblogs.com/badnewfish/p/4000141.html
http://www.cppblog.com/wanghaiguang/archive/2012/05/04/173655.aspx
0 0
- NSIS制作32+64位安装包
- NSIS制作32+64位安装包
- NSIS 安装程序 制作32+64位安装包
- NSIS制作32位安装包
- 用 NSIS 制作 64位安装包 步骤
- 用 NSIS制作64位安装包 步骤
- 制作安装包 nsis
- NSIS安装包制作
- NSIS安装包制作
- 利用 NSIS 制作安装包
- NSIS制作安装包步骤
- 使用NSIS制作安装包
- C#安装包制作:NSIS安装包
- NSIS 制作 64 位系统下的安装程序
- 使用NSIS制作安装包(1)
- 使用NSIS制作安装包(2)
- 利用NSIS制作游戏安装包
- NSIS制作自己的安装包
- switch 循环中的判断 类型和if() 的判断类型
- 利用开源库libjpeg库解析jpeg格式图片
- Fragment ViewPager的例子代码
- OpenGLES2.0着色器语言glsl
- Nginx + Tomcat + Redis负载均衡及session共享
- NSIS制作32+64位安装包
- 【VB+数控原理与系统】数控原理与系统课程设计刀具半径补偿直线-直线VB模拟软件实现
- DOM4J的简单应用
- NDK交叉编译资料
- [递归和循环]面试题6
- 设计模式:开闭原则(OCP)
- Sql Server 2005 分页
- Swift基础学习
- asp.net+mvc5新建控制器时出现的,运行所选代码生成器时错误