1. 程式人生 > >NSIS檢測並解除安裝已有版本,靜默解除安裝隱藏MessageBox

NSIS檢測並解除安裝已有版本,靜默解除安裝隱藏MessageBox

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

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