2013-03-26 88 views
14

我想爲我的軟件(這是一個C#軟件)配置Inno安裝程序。 我打算髮布我的軟件的很多版本,如果我的應用程序的舊版本已經安裝在計算機上,我想更改inno setup安裝程序界面。 在這種情況下,用戶不應該能夠更改安裝目錄。創建一個安裝程序,將執行更新,如果已經安裝了舊版本

有四種情況:

第一種情況:這是我的產品的第一次安裝,Inno Setup的程序正常進行。

第二種情況:該產品已經安裝完畢且安裝程序包含更新的版本。用戶不能選擇目標文件夾。他可以運行更新。

第三種情況:如果安裝程序包含的版本比安裝的版本舊,則更新將被禁用,並且應顯示消息。

第四種情況:安裝程序版本與安裝版本相同。如果需要,用戶可以修復他的執行版本。

InnoSetup可以做到嗎?

回答

6

如果您的AppID在應用程序的生命週期中保持不變,Inno Setup會自動處理案例1,2和4。
您還可以使用以下[Setup]指令隱藏的目錄和組頁:

DisableDirPage=auto 
DisableGroupPage=auto 

有關詳細信息,請參閱本ISXKB article。對於案例3,假設您的文件版本正確,Inno不會降級任何內容,但它實際上不會對用戶發出警告。要做到這一點,您需要添加代碼來檢查這一點,很可能在InitializeSetup()事件函數中。

+2

其實,如果你使用腳本嚮導來創建自己的腳本,然後應用程序文件的默認是添加'ignoreversion'標誌,在這種情況下,降級實際上將降級的所有文件。爲了確認用戶確實想要這麼做,添加一條警告消息可能是一個好主意,但是否則應該可以正常工作 - 假設您的應用程序本身可以應付降級(例如,數據兼容性問題)。如果沒有,那麼你應該添加一個錯誤,而不是一個警告。 – Miral 2013-03-27 19:51:00

+1

@病毒我沒有注意到。感謝您的高舉。 – Deanna 2013-03-28 09:30:35

+0

用於檢查'InitializeSetup'的示例邏輯將非常棒...我假設已經有一些定義已經出現在inno中... – Assimilater 2017-06-19 19:08:38

8

如果你想對用戶有一些反饋,你可以嘗試類似的東西。 首先,您的更新應該與您的主應用程序具有相同的AppId名稱。 然後您可以設置一些檢查,即顯示消息以通知用戶有關狀態。

#define MyAppVersion "1.2.2.7570" 
#define MyAppName "MyApp Update" 

[Setup] 
AppId=MyApp 
AppName={#MyAppName} 
AppVersion={#MyAppVersion} 
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1,InstallLocation} 
DisableDirPage=True 

[CustomMessages] 
MyAppOld=The Setup detected application version 
MyAppRequired=The installation of {#MyAppName} requires MyApp to be installed.%nInstall MyApp before installing this update.%n%n 
MyAppTerminated=The setup of update will be terminated. 

[Code] 
var 
InstallLocation: String; 

function GetInstallString(): String; 
var 
InstPath: String; 
InstallString: String; 
begin 
InstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1'); 
InstallString := ''; 
if not RegQueryStringValue(HKLM, InstPath, 'InstallLocation', InstallString) then 
RegQueryStringValue(HKCU, InstPath, 'InstallLocation', InstallString); 
Result := InstallString; 
InstallLocation := InstallString; 
end; 

function InitializeSetup: Boolean; 
var 
V: Integer; 
sUnInstallString: String; 
Version: String; 
begin 
    if RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1', 'UninstallString') then begin 
     RegQueryStringValue(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1', 'DisplayVersion', Version); 
     if Version =< ExpandConstant('{#MyAppVersion}') then begin 
      Result := True; 
      GetInstallString(); 
     end 
     else begin 
MsgBox(ExpandConstant('{cm:MyAppOld}'+Version+'.'+#13#10#13#10+'{cm:MyAppRequired}'+'{cm:MyAppTerminated}'), mbInformation, MB_OK); 
     Result := False; 
    end; 
end 
else begin 
    MsgBox(ExpandConstant('{cm:MyAppRequired}'+'{cm:MyAppTerminated}'), mbInformation, MB_OK); 
    Result := False; 
end; 
end; 
+0

1.檢查是否安裝了應用程序; 2.檢查應用程序版本; 3.比較App版本和更新版本; 3A。如果更新更新然後安裝; 3B。如果更新較舊,則不要安裝; 3C。如果應用程序不存在,則不安裝 – RobeN 2013-03-26 14:15:33

+0

Inno已自動記住安裝目錄,使您的'DefaultDirName'代碼冗餘。您也不會爲第一次安裝指定默認值。 – Deanna 2013-03-26 15:04:19

+0

這只是更新代碼,不是基本應用程序... – RobeN 2013-03-26 15:10:25

相關問題