NSIS檢測並卸載已有版本,靜默卸載隱藏MessageBox

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u012896330/article/details/55517461

接觸到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

分析下以上代碼:

聲明幾個變量,在安裝初始化回調方法中,清除錯誤標記,讀取註冊表

ReadRegStr 用戶變量(輸出) 根鍵 子鍵 項

上文讀取卸載路徑字符串並輸出到用戶變量$UNINSTALL_PROG,彈出MessageBox執行各操作,我看看下IDYES,執行卸載方法

 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

我們拿到的變量UNINSTALLPROG是帶有uninst.exe的,-10 拿到所謂的安裝路徑,輸出到變量$OLDPATH,然後執行ExecWait 執行uninst.exe

/S(區分大小寫)表示靜默卸載,

_?= 指定 $INSTDIR 這也會阻止卸載程序把它自己複製到臨時文件夾再運行。這將可以使用 ExecWait 來運行卸載程序並等待它完成。這個參數必須是最後一個參數並且不能帶任何引號即使路徑帶有空格。把&0作爲返回代碼

這地方或許會遇到一個問題,但我們執行uninst.exe的時候,我們是執行的卸載,我們執行卸載肯定會調用un.onInit un.onUninstSuccess回調函數,以及卸載過程中的用戶函數,我當時就遇到MessageBox彈出的問題,嚴重影響使用,這個時候我們可以使用 /SD 來指定一個上面列出的返回值當在卸載或安裝程序靜默卸載或安裝時作爲返回值

舉個例子:卸載初始化的時候,提示是否卸載,

MessageBox MB_YESNO "確定要移除 $(^Name) ?" /SD IDYES IDYES +2

格式爲:

 MessageBox MB_XX text [/SD IDXX] [IDXX target1] [IDXX target2] ...

這樣就可以完成檢測並卸載的過程了,當卸載過程結束我們再執行安裝過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章