日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用 NSIS 制作软件安装包

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 NSIS 制作软件安装包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

NSIS(Nullsoft Scriptable Install System)是一個開源的 Windows 系統下安裝程序制作程序。它提供了安裝、卸載、系統設置、文件解壓縮等功能。這如其名字所指出的那樣,NSIS 是通過它的腳本語言來描述安裝程序的行為和邏輯的。NSIS 的腳本語言和通常的編程語言有類似的結構和語法,但它是為安裝程序這類應用所設計的。

http://nsis.sourceforge.net/Download/


先在官網下載NSIS安裝,然后再下載NIS Edit

HM NIS Edit is the best Editor/IDE for Nullsoft Scriptable Install System (NSIS).

NIS Edit 就是一個界面編輯器,最終編譯還是靠NSIS來完成








制作簡單的安裝包: 在NIS Edit中,選擇“文件”菜單中的 “新建腳本:向導“



填寫軟件基本信息


設置圖標與輸出文件,以及安裝界面的語言


設置安裝目錄以及安裝時的界面提示信息



添加要安裝的文件


卸載界面


向導完成后編譯即可生成一個基本的安裝文件,包含開始菜單與桌面的快捷方式,卸載程序




------------------------------------------------------------- ?進階 ?----------------------------------------------------------------------


在卸載時,進行指定目錄的刪除

安裝程序后,可能有會生成一些文件在安裝目錄,或者要刪除其它位置的文件

在腳本文件加入刪除指令,如:

RMDIR /r /REBOOTOK "$INSTDIR"
RMDIR /r /REBOOTOK "$LOCALAPPDATA\XXSof"

C:\Program Files (x86)\XXSof (程序安裝目錄)

C:\Users\liyulin\AppData\Local\XXSof (程序數據放置的位置)

進行刪除


RMDir
[/r] [/REBOOTOK] 目錄名
刪除指定的目錄(沒有通配符的完整路徑)。沒有 /r 參數時只有在目錄為空時才會被刪除。如果指定了 /r ,則目錄會被遞歸刪除,所以在指定目錄下的所有文件和目錄均被刪除。如果指定了 /REBOOTOK ,任何當前不能刪除的文件或目錄將會在重啟后被刪除 -- 如果文件或目錄需要在重啟時被刪除,會放置一個重啟的標記。當文件或目錄不能被刪除時放置一個錯誤的標記。

RMDir $INSTDIR
RMDir $INSTDIR\data
RMDir /r /REBOOTOK $INSTDIR
RMDir /REBOOTOK $INSTDIR\DLLs
需要注意的是當前的工作目錄不能刪除。當前的工作目錄由 SetOutPath 設定。例如,下面的例子將不能刪除該目錄。

SetOutPath $TEMP\dir
RMDir $TEMP\dir
而下面的例子將成功地刪除該目錄。

SetOutPath $TEMP\dir
SetOutPath $TEMP
RMDir $TEMP\dir
警告: 在卸載程序中使用 RMDir /r $INSTDIR 是不安全的。雖然用戶不太可能會選擇將程序安裝到 Program Files 文件夾中,但假如這樣的話,這個命令將會遞歸刪除整個 Program Files 文件夾,包括其他和卸載程序沒有任何關系的程序(目錄)。用戶還可以安裝除了程序文件之外的其他文件并希望它們能被卸載程序刪除。可用的 解決方案 可以輕松地實現只卸載由安裝程序釋放的唯一文件。



無法創建桌面快捷方式或無法刪除開始菜單項

用戶將桌面文件轉移了,如:?D:\Doc\Desktop ?,安裝程序后,桌面不會生成快捷方式, 或者卸載后,開始菜單中的文件也不會被刪除

NSIS卸載后無法刪除開始菜單中的內容
原因:
因為NSIS中使用CreateShortCut創建快捷方式時會在每一個人用戶下面都創建快捷方式,然后Delete刪的時候卻只是在當前用戶下,因此怎么刪也刪不掉。
解決方案:
刪除所有用戶下的快捷方式。首先添加RequestExecutionLevel admin,然后在創建快捷方式和刪除快捷方式的地方加上SetShellVarContext all即可。









在軟件已安裝的情況下,再次安裝,進行提示:

NSIS制作安裝包,如何檢測并卸載已有版本 - CrazyCoder,s blog - 博客頻道 - CSDN.NET?http://t.cn/zRodHPe

NSIS制作安裝包,如何檢測并卸載已有版本
將如下代碼追加到NSIS腳本的尾部即可。


Var UNINSTALL_PROG
Var OLD_VER
Var OLD_PATH

Function .onInit
ClearErrors
ReadRegStr $UNINSTALL_PROG ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} "UninstallString"
IfErrors done

ReadRegStr $OLD_VER ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} "DisplayVersion"
MessageBox MB_YESNOCANCEL|MB_ICONQUESTION \
"檢測到本機已經安裝了 ${PRODUCT_NAME} $OLD_VER。\
$\n$\n是否先卸載已安裝的版本?" \
/SD IDYES \
IDYES uninstall \
IDNO done
Abort

uninstall:
StrCpy $OLD_PATH $UNINSTALL_PROG -10

ExecWait '"$UNINSTALL_PROG" /S _?=$OLD_PATH' $0
DetailPrint "uninst.exe returned $0"
Delete "$UNINSTALL_PROG"
RMDir $OLD_PATH

done:
FunctionEnd


程序正在運行時進行安裝或者卸載


NSIS:安裝、卸載時檢查程序是否正在運行 - 輕狂志 http://t.cn/RLsWJmP

如果我們要安裝或升級的程序正在運行,文件肯定會替換失敗,以下代碼可以提示用戶結束正在運行的程序。

需要使用插件FindProcDLL.dll,下載路徑:http://nsis.sourceforge.net/FindProcDLL_plug-in
下載完后,放入NSIS的插件目錄下: 如 ?C:\Program Files (x86)\NSIS\Plugins


開始安裝時檢查flighty.exe是否正在運行:



Function .onInit
? ;關閉進程
? Push $R0
? CheckProc:
? ? Push "flighty.exe"
? ? ProcessWork::existsprocess
? ? Pop $R0
? ? IntCmp $R0 0 Done
? ? MessageBox MB_OKCANCEL|MB_ICONSTOP "安裝程序檢測到 ${PRODUCT_NAME} 正在運行。$\r$\n$\r$\n點擊 “確定” 強制關閉${PRODUCT_NAME},繼續安裝。$\r$\n點擊 “取消” 退出安裝程序。" IDCANCEL Exit
? ? Push "flighty.exe"
? ? Processwork::KillProcess
? ? Sleep 1000
? ? Goto CheckProc
? ? Exit:
? ? Abort
? ? Done:
? ? Pop $R0
FunctionEnd


開始卸載時檢查flighty.exe是否正在運行:


Function un.onInit
? MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您確實要完全移除 $(^Name) ,及其所有的組件?" IDYES +2
? Abort
? ;檢測程序是否運行
? FindProcDLL::FindProc "flighty.exe"
? ?Pop $R0
? ?IntCmp $R0 1 0 no_run
? ?MessageBox MB_ICONSTOP "卸載程序檢測到 ${PRODUCT_NAME} 正在運行,請關閉之后再卸載!"
? ?Quit
? ?no_run:
FunctionEnd



若需要將:
在軟件已安裝的情況下,再次安裝,進行提示

程序正在運行時進行安裝或者卸載
兩個功能都需要的話,則需要將程序進行合并: 結果為:

Var UNINSTALL_PROG
Var OLD_VER
Var OLD_PATH
Function .onInit


FindProcDLL::FindProc "${PRODUCT_NAME}.exe"
? ?Pop $R0
? ?IntCmp $R0 1 0 no_run
? ?MessageBox MB_ICONSTOP "安裝程序檢測到 ${PRODUCT_NAME} 正在運行,請退出程序后重試"
? ?Quit
? ?no_run:

;FunctionEnd
;Function .onInit
? ClearErrors
? ReadRegStr $UNINSTALL_PROG ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} "UninstallString"
? IfErrors ?done

? ReadRegStr $OLD_VER ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} "DisplayVersion"
? MessageBox MB_YESNOCANCEL|MB_ICONQUESTION \
? ? "檢測到本機已經安裝了 ${PRODUCT_NAME} $OLD_VER。\
? ? $\n$\n是否先卸載已安裝的版本?" \
? ? ? /SD IDYES \
? ? ? IDYES uninstall \
? ? ? IDNO done
? Abort


uninstall:
? StrCpy $OLD_PATH $UNINSTALL_PROG -10


? ExecWait '"$UNINSTALL_PROG" /S _?=$OLD_PATH' $0
? DetailPrint "uninst.exe returned $0"
? Delete "$UNINSTALL_PROG"
? RMDir $OLD_PATH

done:

FunctionEnd



Function un.onInit

? ?FindProcDLL::FindProc "${PRODUCT_NAME}.exe"
? ?Pop $R0
? ?IntCmp $R0 1 0 no_run
? ?MessageBox MB_ICONSTOP "安裝程序檢測到 ${PRODUCT_NAME} 正在運行,請退出程序后重試"
? ?Quit
? ?no_run:


? ?
? MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你確實要完全移除 $(^Name) ,其及所有的組件?" IDYES +2
? Abort
??
FunctionEnd




************************* ?生成的腳本文件(簡化) **************************************************************
; Script generated by the HM NIS Edit Script Wizard.


; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "XXSof"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "My company, Inc."
!define PRODUCT_WEB_SITE "http://www.KeeShow.com"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\XXSof.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"


; MUI 1.67 compatible ------
!include "MUI.nsh"


; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "F:\XXSof.ico"
!define MUI_UNICON "F:\Uninstall.ico"


; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "XXSof\readme.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\XXSof.exe"
!insertmacro MUI_PAGE_FINISH


; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES


; Language files
!insertmacro MUI_LANGUAGE "SimpChinese"


; MUI end ------

RequestExecutionLevel admin


Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "XXSofSetup.exe"
InstallDir "$PROGRAMFILES\XXSof"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show


Section "XXSof" SEC01
? SetOutPath "$INSTDIR"
? File "XXSof\config.xml"?
? File "XXSof\XXSof.exe"
? File "XXSof\libcurl.dll"
? File "XXSof\Model.dll"
? File "XXSof\OpenAL32.dll"
? File "XXSof\OpenThreads.dll"

? SetOutPath "$INSTDIR\platforms"
? File "XXSof\platforms\qminimal.dll"
? File "XXSof\platforms\qoffscreen.dll"
? File "XXSof\platforms\qwindows.dll"

? SetOutPath "$INSTDIR\QtQuick\Dialogs"
? File "XXSof\QtQuick\Dialogs\DefaultColorDialog.qml"
? File "XXSof\QtQuick\Dialogs\DefaultDialogWrapper.qml"
? File "XXSof\QtQuick\Dialogs\DefaultFileDialog.qml"
? File "XXSof\QtQuick\Dialogs\DefaultFontDialog.qml"
? File "XXSof\QtQuick\Dialogs\DefaultMessageDialog.qml"
? File "XXSof\QtQuick\Dialogs\dialogplugin.dll"
SectionEnd

Section -AdditionalIcons
? SetShellVarContext all
? WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
? CreateShortCut "$SMPROGRAMS\XXSof\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
? CreateShortCut "$SMPROGRAMS\XXSof\Uninstall.lnk" "$INSTDIR\uninst.exe"
? CreateShortCut "$DESKTOP\XXSof.lnk" "$INSTDIR\XXSof.exe" "F:\XXSof.ico"

? CreateDirectory "$SMPROGRAMS\XXSof"
? CreateShortCut "$SMPROGRAMS\XXSof\XXSof.lnk" "$INSTDIR\XXSof.exe"
? CreateShortCut "$SMPROGRAMS\XXSof\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
? CreateShortCut "$SMPROGRAMS\XXSof\Uninstall.lnk" "$INSTDIR\uninst.exe"
SectionEnd

Section -Post
? WriteUninstaller "$INSTDIR\uninst.exe"
? WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\XXSof.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\XXSof.exe"
? WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
? WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
? WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd


Function un.onUninstSuccess
? HideWindow
? MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地從你的計算機移除。"
FunctionEnd

Function un.onInit


? ?FindProcDLL::FindProc "${PRODUCT_NAME}.exe"
? ?Pop $R0
? ?IntCmp $R0 1 0 no_run
? ?MessageBox MB_ICONSTOP "安裝程序檢測到 ${PRODUCT_NAME} 正在運行,請退出程序后重試"
? ?Quit
? ?no_run:


? ?
? MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你確實要完全移除 $(^Name) ,其及所有的組件?" IDYES +2
? Abort
??
FunctionEnd

Section Uninstall
? Delete "$INSTDIR\${PRODUCT_NAME}.url"
? Delete "$INSTDIR\uninst.exe"
? Delete "$INSTDIR\Upgrade.exe"
? Delete "$INSTDIR\Render.dll"
? Delete "$INSTDIR\readme.txt"
? Delete "$INSTDIR\qwindows.dll"
? Delete "$INSTDIR\QtQuick.2\qtquick2plugin.dll"


? Delete "$INSTDIR\imageformats\qjpeg.dll"
? Delete "$INSTDIR\imageformats\qgif.dll"
? Delete "$INSTDIR\icuuc52.dll"
? Delete "$INSTDIR\icuin52.dll"
? Delete "$INSTDIR\icudt52.dll"
? Delete "$INSTDIR\glew32.dll"
? Delete "$INSTDIR\FreeImage.dll"
? Delete "$INSTDIR\Enginio.dll"
? Delete "$INSTDIR\Core.dll"
? Delete "$INSTDIR\config.xml"




? SetShellVarContext all
? Delete "$SMPROGRAMS\XXSof\Uninstall.lnk"
? Delete "$SMPROGRAMS\XXSof\Website.lnk"
? Delete "$DESKTOP\XXSof.lnk"
? Delete "$SMPROGRAMS\XXSof\XXSof.lnk"


? RMDir "$SMPROGRAMS\XXSof"
? RMDir "$INSTDIR\QtQuick\XmlListModel"
? RMDir "$INSTDIR\QtQuick\Window.2"
? RMDir "$INSTDIR\QtQuick\PrivateWidgets"
? RMDir "$INSTDIR\QtQuick\Particles.2"
? RMDir "$INSTDIR\QtQuick\LocalStorage"
? RMDir "$INSTDIR\QtQuick\Layouts"
? RMDir "$INSTDIR\QtQuick\Dialogs\qml"
? RMDir "$INSTDIR\QtQuick\Controls\Private"
? RMDir "$INSTDIR\QtQuick\Controls"
? RMDir "$INSTDIR\QtQuick.2"
? RMDir "$INSTDIR\platforms"
? RMDir "$INSTDIR\imageformats"
? RMDir "$INSTDIR"
??
? RMDIR /r /REBOOTOK "$INSTDIR"
? RMDIR /r /REBOOTOK "$LOCALAPPDATA\XXSof"
??
? DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
? DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
? SetAutoClose true
SectionEnd



Var UNINSTALL_PROG
Var OLD_VER
Var OLD_PATH
Function .onInit


FindProcDLL::FindProc "${PRODUCT_NAME}.exe"
? ?Pop $R0
? ?IntCmp $R0 1 0 no_run
? ?MessageBox MB_ICONSTOP "安裝程序檢測到 ${PRODUCT_NAME} 正在運行,請退出程序后重試"
? ?Quit
? ?no_run:


;FunctionEnd




;Function .onInit
? ClearErrors
? ReadRegStr $UNINSTALL_PROG ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} "UninstallString"
? IfErrors ?done


? ReadRegStr $OLD_VER ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} "DisplayVersion"
? MessageBox MB_YESNOCANCEL|MB_ICONQUESTION \
? ? "檢測到本機已經安裝了 ${PRODUCT_NAME} $OLD_VER。\
? ? $\n$\n是否先卸載已安裝的版本?" \
? ? ? /SD IDYES \
? ? ? IDYES uninstall \
? ? ? IDNO done
? Abort


uninstall:
? StrCpy $OLD_PATH $UNINSTALL_PROG -10


? ExecWait '"$UNINSTALL_PROG" /S _?=$OLD_PATH' $0
? DetailPrint "uninst.exe returned $0"
? Delete "$UNINSTALL_PROG"
? RMDir $OLD_PATH


done:


FunctionEnd



更改NSIS的安裝過程圖片_百度知道 http://t.cn/RLsjaVQ

總結

以上是生活随笔為你收集整理的使用 NSIS 制作软件安装包的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美人与性禽动交精品 | 亚洲13p| 草草影院在线播放 | 国产美女毛片 | 韩国伦理电影免费在线 | 欧美日韩一区二区三区四区 | 欧美成人手机在线视频 | 久久久久久久久免费看无码 | 最新黄色av网址 | 中文字幕在线看 | 日韩三级一区 | 日韩一区二区三区在线播放 | 中文字幕成人一区 | 99色图| 国产精品一品二区三区的使用体验 | 亚洲欧美制服丝袜 | 就操在线| 日韩视频精品在线 | 天天舔夜夜操 | 欧洲亚洲视频 | 在线观看视频91 | 性涩av| 久久偷看各类女兵18女厕嘘嘘 | 午夜影院在线观看免费 | 日本午夜免费 | 亚洲欧洲日韩国产 | 国产一区二区三区四区五区 | 免费黄色入口 | 一二三四区视频 | 美女被猛网站 | 国产精品一区二区三区免费 | 免费欧美一级 | 91精品国产综合久久国产大片 | 在线高清免费观看 | 日韩高清在线观看一区 | 自拍一区在线 | 最近2018年手机中文字幕版 | 99免费视频 | 国产麻豆精品久久一二三 | 丰满少妇被猛烈进入无码 | 国产精品v欧美精品v日韩精品 | 久久久久久久伊人 | 亚洲乱码国产乱码精品精大量 | 国产91久 | 九九夜| 成人在线激情视频 | 国产老妇视频 | 成人一区二区三区视频 | 中文字幕无码毛片免费看 | 乌克兰极品av女神 | 97人人澡人人爽人人模亚洲 | 日韩视频成人 | 99这里| 久久大综合 | 久久人人爱| 黑花全肉高h湿play短篇 | 纯爱无遮挡h肉动漫在线播放 | 午夜影剧院 | 精品久久一区二区 | 久草婷婷| 亚洲免费影视 | 久久久久五月天 | 人妻无码一区二区三区 | av网在线| 黄色精品网站 | 一区二区三区四区免费视频 | 朋友人妻少妇精品系列 | 欧美日韩国产一区二区在线观看 | 狼性av懂色av禁果av | 97成人在线观看 | 亚州av网站| 国产精品一区二区三区线羞羞网站 | 中国黄色录像 | 日韩爱爱爱| 男女搞鸡网站 | 国产一二三精品 | 精品综合 | 天天操天天干天天爱 | 久久久久亚洲av片无码下载蜜桃 | 美女三区 | 午夜影院体验区 | www.久久| 北条麻妃一区二区三区在线观看 | 国产呦小j女精品视频 | 懂色av一区二区 | 成人在线免费小视频 | 免费在线h | 亚洲免费国产 | 久久精品国产亚洲av麻豆蜜芽 | 亚洲国产成人在线视频 | 久久综合桃花网 | 全程偷拍露脸中年夫妇 | 对白刺激国产子与伦 | 毛毛毛片 | 黄色网页在线播放 | 黄色福利社| 中出一区| 四虎av影视| 亚洲午夜无码久久久久 |