2014-06-12 98 views
0

在我的Inno Setup安裝期間,abc.msi文件被複制到安裝目錄中,然後正確安裝。 但是在卸載過程中,abc.msi未卸載。 在卸載日誌中進行調查後,我明白了原因。以下是對數,其中i替換日期/小時與一些更清晰的一部分:Innosetup在仍然需要時刪除abc.msi

0. [deleting all the files... INCLUDING abc.msi!] 
1. Uninstallation process succeeded. 
2. Removed all? Yes 
3. Need to restart Windows? No 
4. INFO: Execute command: msiexec.exe /x "C:\Program Files (x86)\InstallationDir\abc\abc.msi" /QUIET /NORESTART 
5. ERROR: Command failed. Error code: 1619 

該錯誤是由於這樣的事實,在步驟4中的命令被稱爲太晚(在刪除後abc.msi的,見步驟0),所以我們在5

有錯誤現在,卸載命令放在如下:

procedure CurUninstallStepChanged(...) 
[code...] 
begin 
    if (CurUninstallStep = usUninstall) then 
    begin 
    [code...] 
    ExecCommand('msiexec.exe', ' /x "' + pathTo_abc.msi + '" /QUIET /NORESTART'); 
    [code...] 
    end 
end 

所以我的問題是在哪裏調用命令被執行在刪除abc.msi而不是CurUninstallStepChanged之前,或者安裝的是正確的一步使用,而不是usUninstall。我也嘗試了usPostUninstall,沒有任何區別。

+0

聽起來很奇怪。看看[運行代碼](https://github.com/jrsoftware/issrc/blob/is-5_5_4/Projects/Uninstall.pas#L643)。首先使用'usUninstall'步驟觸發'CurUninstallStepChanged'事件方法,然後在日誌示例中處理卸載並記錄第2步。簡而言之,在卸載(刪除)任何內容之前,啓動帶'usUninstall'步驟的'CurUninstallStepChanged'事件。它應該以這種方式工作。 – TLama

+0

你的意思是說我做對了嗎? – fresko

+0

是的。在卸載任何東西之前,應該執行「usUninstall」步驟塊中的內容。我想到的一件事是,你是否同步運行這個命令,你是否在等待它完成? – TLama

回答

0

使用此sintax - > {{guid}雙{是一個轉義字符,因此它告訴inno setup這是字面值而不是像{sys}那樣不變。對不起我的英語不好。

您應該使用產品代碼而不是msi文件。爲什麼?產品代碼始終可用,並且是唯一的。該文件可以被刪除或更改,您的卸載將失敗。

我創建了一個我稱之爲通用卸載程序的解決方案。它在註冊表HKLM或HKLM32的顯示名稱字符串值中搜索特定的字符串,並在找到它時讀取卸載字符串。如果它包含msiexec,它會忽略它,並使用與後綴/ qn相同的產品報價來輸入密鑰名稱。如果它不是msi,它將使用卸載字符串。如果我知道卸載程序,則在調用該函數時添加必要的參數以保持沉默。爲什麼我這樣做?我使用inno setup作爲安裝和配置其他安裝程序的引導程序。當我收到新版本時,我不必更改inno安裝腳本並重新編譯。我只是用相同的名稱覆蓋舊的安裝程序。

希望這對你有所幫助。

+0

我是否需要雙人{也當我關閉字符串或只有當我打開? (謝謝,不用擔心英文,我也不太好。) – fresko

+0

只有當你打開。 – JPB