日韩性视频-久久久蜜桃-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 制作软件安装包的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 红桃视频91 | 国产经典久久久 | 爱插视频 | 欧美 亚洲 | 京香julia在线观看 | 性爱免费在线视频 | 台湾三级伦理片 | 中文字幕码精品视频网站 | 99热在线观看免费 | 欧美卡一卡二卡三 | 中文字幕成人 | 神马久久久久久久 | 国产偷自拍视频 | 伊人蕉久影院 | 嫩草一区 | 丰满人妻一区二区三区免费视频棣 | 极品女神无套呻吟啪啪 | 久久人精品 | 成年网站 | 国产成人精品123区免费视频 | 欧美日韩中文字幕一区二区三区 | 亚洲xx在线 | 奇米精品一区二区三区四区 | missav|免费高清av在线看 | 亚欧洲精品视频在线观看 | 美女高潮黄又色高清视频免费 | www国产www| 韩国伦理中文字幕 | 国产精品久久久久久吹潮 | 国产福利在线观看视频 | 亚洲午夜18毛片在线看 | 欧美日韩国产一区二区三区在线观看 | 天天射一射 | 欧美色图3p | 永久国产| 日本黄区免费视频观看 | 国产亚洲色婷婷久久99精品91 | 91麻豆国产 | 无码人妻精品一区二区50 | 琪琪色网 | 蜜桃视频一区二区三区 | 日产久久久久久 | 影音先锋亚洲成aⅴ人在 | aaa特级毛片 | 受虐m奴xxx在线观看 | www日韩在线观看 | 午夜一级大片 | 亚洲天堂激情 | 成年网站免费在线观看 | 98超碰在线 | 特级毛片av | 国产精品国产三级国产专区53 | 狠狠影院| 日本女人hd | 性囗交免费视频观看 | 亚洲天堂二区 | 农村妇女毛片精品久久久 | 凹凸日日摸日日碰夜夜 | 欧美日韩国产成人在线 | 日本黄色网址大全 | 日本少妇全体裸体洗澡 | 又黄又色 | 特黄aaaaaaaaa毛片免 | av不卡影院| a∨视频 | 中文字幕一级二级三级 | 91操人视频 | 精品一久久| 婷婷激情综合 | 日韩黄色片免费看 | 亚洲永久免费网站 | 国产免费一区二区三区免费视频 | 无码人妻丰满熟妇区毛片18 | 亚洲天堂免费观看 | 久久福利电影 | av色欲无码人妻中文字幕 | 黄频网站在线观看 | 国产免费成人在线视频 | 91漂亮少妇露脸在线播放 | 日韩在线导航 | 午夜影院在线观看 | 国产午夜精品一区二区三区视频 | 久久亚洲精品国产精品黑人v | www.日韩在线 | 久久国产精品久久久久久 | 国产激情无码一区二区三区 | 亚洲色图50p | 黑白配在线观看免费观看 | 国产精品99| 草草草在线视频 | 久久国产精品免费观看 | 国产成人福利视频 | 五月婷婷伊人网 | 日日碰日日摸 | 欧美精品一区二区免费看 | 欧美另类z0zx974| 久久精品一区二区三区不卡牛牛 | 狠狠干很很操 | 男人天堂手机在线观看 |