簡體   English   中英

Inno Setup:在安裝過程中調用卸載程序 - 這是一種正確的回滾方式嗎?

[英]Inno Setup: Calling uninstaller while in setup - is that a proper way to rollback?

我有一個任務是解決我們的產品安裝程序的問題,並最終走到了死胡同,沒有任何想法。

安裝過程如下:

  1. 安裝文件
  2. [Run]部分配置一些服務
  3. 運行我們的自定義產品配置程序
  4. 如果步驟3成功(配置程序返回了良好的退出代碼),則啟動這些服務
  5. 其他回滾安裝

所以這個問題是Shroedinger的問題 - 在某些機器上,在配置器中取消安裝后出現意外重啟,沒有任何問題。 當然那令人惱火的用戶。

我無法弄清楚機器決定重啟的標准,但我偶然發現了這件事:

[Run]部分

Filename: "stub.exe"; Flags: runhidden skipifdoesntexist; BeforeInstall: ConfigureService

然后在[Code] ,如果配置程序返回錯誤的退出代碼,則ConfigureService調用InstallationAbort proc。

接下來,在InstallationAbort

Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT /noinstancecheck', '', SW_HIDE,
     ewWaitUntilTerminated, ErrorCode);

因此,作者在安裝程序中要求卸載程序。 使用我確定的日志,安裝程序在卸載程序完成工作后不會結束! 它正在進入下一步(安裝完成)! 之后我可以在日志中看到

需要重啟嗎?

注意:如果沒有取消配置器,系統永遠不會重新啟動,即安裝完成正確。

所以我嘗試了:

  • /NORESTART添加到卸載程序Exec調用。 沒有幫助。 我認為這是因為它是安裝程序,誰決定重新啟動。
  • 添加WizardForm.CancelButton.OnClick(WizardForm.CancelButton); 調用卸載程序后調用退出設置。 沒有幫助。
  • 重寫NeedRestart函數以在取消時返回false

正如我試圖理解的那樣,作者因為需要刪除已安裝的服務而調用卸載程序(即使用特殊參數在UninstallRun調用它們)

所以,我的主要問題:從[Run]部分調用的代碼調用卸載程序,撤消[Run]更改是否正常?

[Run]部分調用的代碼調用卸載程序,撤消在[Run]更改是否正常?

一般來說,這不是一種常見的做法。 不應該在Run部分中止安裝。 Inno Setup不是為處理它而設計的。

但如果你需要,別無他法。 您擁有的代碼很可能基於此:
當Run命令失敗時,如何強制Inno Setup設置失敗?

但這並不意味着安裝程序應該需要重啟。 安裝程序和卸載程序之間存在一些沖突。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM