Lekce 14 - Tvorba instalátoru - Inno Setup
Na úvod bych měl zmínit, že instalátor z nějakého mě neznámého důvodu nedělám ve VisualStudiu, ale navyknul jsem si jej dělat v InnoSetup. Ve VS lze přidat nový projekt tuším že v Development & Setup a vybrat Setup. Poté by se měl objevit průvodce, kde se jen kliká. Stejně je to i v InnoSetup. Já se tu odkážu na fešáka sdraca nebo jak říká Vodáček zmijozeláka, který již InnoSetup nastínil: http://www.itnetwork.cz/…tup-compiler
Zde jen přidám pár informací.
VersionInfoVersion
- nastavuje verzi souboru (ve vlastnostech
souboru) AppMutex
- náš mutex nastavený v aplikaci - slouží
pro kontrolu běhu aplikace - instalátor vypíše upozornění, pokud aplikace
běží
[Setup] AppId={{AE67302E-F4EC-4F2E-ACF9-52F649F090AC} AppName=ISIM messenger AppVersion=1.20 AppVerName=ISIM messenger 1.20 VersionInfoVersion=1.20 AppPublisher=IslandSoftware AppPublisherURL=http://www.itnetwork.cz/ AppSupportURL=http://www.itnetwork.cz/csharp/pokrocile/isim AppUpdatesURL=http://www.itnetwork.cz/csharp/pokrocile/isim/isim-devbook-cz-instant-messenger DefaultDirName={pf}\ISIM messenger DefaultGroupName=ISIM messenger AllowNoIcons=yes OutputDir=C:\..\Setup OutputBaseFilename=isim_messenger_setup SetupIconFile=C:\..\ISIM - open source messenger\isim_icon.ico Compression=lzma SolidCompression=yes AppMutex=ISIM messenger,Global\ISIM messenger AppCopyright=sczdavos [David Jančík], www.devbook.cz
Uživateli dovolíme vybrat si jazyk instalátoru, který se pak nastaví i pro aplikaci:
[Languages] Name: "english"; MessagesFile: "compiler:Default.isl" Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl"
Nastavíme ikonci a cesty k souborům (šéfí průvodce).
[Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1 [Files] Source: "C:\..\ISIM - open source messenger\ISIM - open source messenger.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "C:\..\ISIM - open source messenger\ISIM - open source messenger.exe.config"; DestDir: "{app}"; Flags: ignoreversion Source: "C:\..\ISIM - open source messenger\isim_icon.ico"; DestDir: "{app}"; Flags: ignoreversion Source: "C:\..\ISIM - open source messenger\graphics\*"; DestDir: "{app}\graphics"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "C:\..\ISIM - open source messenger\plugins\*"; DestDir: "{app}\plugins"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "C:\..\ISIM - open source messenger\sounds\*"; DestDir: "{app}\sounds"; Flags: ignoreversion recursesubdirs createallsubdirs [Icons] Name: "{group}\ISIM messenger"; Filename: "{app}\ISIM - open source messenger.exe" Name: "{group}\{cm:ProgramOnTheWeb,ISIM messenger}"; Filename: "http://www.itnetwork.cz/csharp/pokrocile/isim/isim-devbook-cz-instant-messenger" Name: "{commondesktop}\ISIM messenger"; Filename: "{app}\ISIM - open source messenger.exe"; Tasks: desktopicon Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\ISIM messenger"; Filename: "{app}\ISIM - open source messenger.exe"; Tasks: quicklaunchicon [Run] Filename: "{app}\ISIM - open source messenger.exe"; Description: "{cm:LaunchProgram,ISIM messenger}"; Flags: nowait postinstall skipifsilent
Tak a teď konečně to zajmavé. Kontrola přístupnosti požadované verze .NET FW a nastavení jazyku pro aplikaci.
[Code] function InitializeSetup(): Boolean; var keyExists: boolean; SPversion: Cardinal; Result1: boolean; ErrorCode: integer; begin
Result
je proměnná, která určuje, zda bude instalátor
pokračovat nebo zda se ukončí. Záleží na její hodnotě (true/false) na
konci metody InitializeSetup()
.
Result := true;
Z registrů se vybere klíč SP v dané cestě. Ten obsahuje service pack verzi .NET FW verze 3.5. Pokud je null (keyExists == false) nebo je roven 0 (není nainstalován SP 1) tak se vypíše chybová hláška o nepřítomnosti potřebné verze .NET FW nabídne se jeho stažení a instalátor nepokračuje:
keyExists := RegQueryDWordValue(HKLM,'SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5', 'SP', SPversion); if ((keyExists = false) or (SPversion = 0)) then begin Result := false; if((ExpandConstant('{language}')) = 'czech') then begin Result1 := MsgBox('Aplikace vyžaduje .NET Framework min. v.3.5 SP1, který ve vašem počítači nebyl nalezen. Přejete si jej nyní stánout? (bez něj aplikaci nelze spustit)', mbConfirmation, MB_YESNO) = idYes; end else begin Result1 := MsgBox('This application needs .NET Framework min. v.3.5 SP1, which is not installed on your computer. Would you like to download it? (you cannot run this app without it)', mbConfirmation, MB_YESNO) = idYes; end; if (Result1 = true) then begin ShellExec('open', 'http://www.microsoft.com/download/en/details.aspx?id=22', '','',SW_SHOWNORMAL,ewNoWait,ErrorCode); end; end; end;
Po provedení těchto náležitostí se vždy při změně stavu instlátoru
volá CurStepChanged
. Zde si odchytím PostIsnstall
tedy poinstalační období a zapíšu jazykové nastavní pro aplikaci.
procedure CurStepChanged(CurStep: TSetupStep); var lang : String; begin if CurStep = ssPostInstall then begin lang := 'en-GB'; if((ExpandConstant('{language}')) = 'czech') then begin lang := 'cs-CZ'; end; SaveStringToFile(ExpandConstant('{userappdata}\ISIM messenger\lang.ini'), ExpandConstant(lang), False); end; end;
A páč sme hodní, při případné odinstalaci mrkneme do registrů jestli tam nezůstal klíč spouštění po startu a smažeme jej.
[Registry] Root: HKCU; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "ISIM messenger"; Flags: dontcreatekey uninsdeletevalue