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