[Tuto] InnoSetup: Packager ensemble appli 32 et 64 bits

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

[Tuto] InnoSetup: Packager ensemble appli 32 et 64 bits

Message par Marc56 »

Voici comment packager en un seul fichier les deux versions d'un programme Windows (32 et 64 bits)
avec le programme InnoSetup (Freeware Windows)

InnoSetup va en une seule opération:
  • Compacter l'ensemble des fichiers
  • Générer un dialogue dans plusieurs langues
  • Installer la bonne version selon l'OS (32 ou 64 bits)
  • Créer un groupe et un raccourci (au choix de l'utilisateur)
  • Créer le programme de désinstallation (avec une entrée dans le panneau de configuration)
Dans le gestionnaire de projet PB, créer deux cibles (x86 et x64) ayant soit un nom d'EXE différent (conseillé),
soit sauvegardés dans des répertoires différents.

:arrow: Lancer InnoSetup et utiliser l'assistant (Create New Script Using the Script Wizard)
:arrow: Ne s'occuper que de la version 32 bits.

Une fois que le script est généré, éditer le fichier comme ceci:
Dans la section [Setup] Ajouter

Code : Tout sélectionner

[Setup]
ArchitecturesInstallIn64BitMode=x64
Ensuite, il suffit d'aiguiller les fichiers selon la version
Dans la section Files, on ajoute la version 64 bits et on indique que la version 32 bits n'est pas à installer sur la version 64 bits
Le mot-clé est: not Is64BitInstallMode
Exemple:

Code : Tout sélectionner

[Files]
Source: "ACME_Viewer_32.exe"; DestDir: "{app}"; DestName: {#MyAppExeName}; Check: not Is64BitInstallMode; Flags: solidbreak
Source: "ACME_Viewer_64.exe"; DestDir: "{app}"; DestName: {#MyAppExeName}; Check:     Is64BitInstallMode; Flags: solidbreak
Le nom de l'EXE final est défini au début (#define MyAppExeName "ACME_Viewer.exe") donc pas de soucis pour ensuite faire appel à celui-ci dans le programme, qu'il soit sur x68 ou x64

Conseil: Sauvegarder le fichier .iss dans le répertoire source du projet.

:wink:
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: [Tuto] InnoSetup: Packager ensemble appli 32 et 64 bits

Message par Marc56 »

Les données du programme.

Pour que le programme puisse écrire ces données (ex: son fichier .INI) on utilise le répertoire %AppData% (on y créé un sous-répertoire)
Ce répertoire reste accessible à l'utilisateur en écriture contrairement à ProgramFiles
En le mettant là on évite aussi de "polluer" le répertoire MesDocuments
Pour voir à quoi correspond ce répertoire, taper SET dans une fenêtre "DOS"

On va donc ici s'en servir pour fournir un fichier INI de base, mais qui est accessible en écriture.
Il ne sera pas visible par l'utilisateur directement, car %AppData% est un répertoire caché.

Section [Files], ajout d'un fichier INI qui sera par défaut conservé après désinstallation.

Code : Tout sélectionner

; Pour que les données du programme soient accessibles en écriture, on les met dans %AppData%
; Ex: installation d'un fichier ini exemple 
; Le répertoire %AppData%\MonAppli_Datas sera créé automatiquement
; Ce répertoire correspond à roaming\..., c'est à dire qu'il est accessible en écriture à l'utilisateur
; Il le suivra même s'il se connecte en réseau local
; Tout fichier peut être renommé pendant l'installation
Source: "\Mon_INI_sample.ini"; DestDir: "{userappdata}\MonAppli_Datas"; DestName: "MonINI.ini"; Flags: uninsneveruninstall confirmoverwrite
; Ce fichier ne sera pas supprimé lors de la désinstallation
; Lors d'une réinstallation il y aura demande de confirmation
Ici, on a ajouté deux Flags:
uninsneveruninstall = Ne pas supprimer ce fichier lors de la désinstallation
confirmoverwrite = Confirmer avant de remplacer lors de la réinstallation (si existe)

Comme Ce répertoire n'est pas supprimé par défaut, on peut ajouter un bout de script pour demander à l'utilisateur s'il veut le supprimer.

Code : Tout sélectionner

; Par défaut, le programme de désinstallation supprimera tout ce qu'il a installé
; sauf les fichiers dont le flag est: uninsneveruninstall
; On peut ajouter des commandes pour supprimer d'autres fichiers
; Pour supprimer (avec confirmation le dossier des données (INI) %Appdata%\MonApplication on ajoute ce code en fin de script
[Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usPostUninstall then
  begin
    if MsgBox('Voulez-vous supprimer le répertoire des données ?', mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = IDYES then
    begin
        DelTree(ExpandConstant('{userappdata}\MonAppli_Datas'), True, True, True);
    end;
  end;
end;
:wink:
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: [Tuto] InnoSetup: Packager ensemble appli 32 et 64 bits

Message par Marc56 »

Un dernier pour la déco:
Il est possible de personnaliser l'image du programme de setup.
(Exemple)

Deux images:
Celle de gauche de la page d'accueil (164x214 en 256 couleurs)
l'icône de chaque page (55x58)

Dans la section initiale [Setup]

Code : Tout sélectionner

WizardImageFile=<fichier>.bmp 
WizardSmallImageFile=<fichier>.bmp
Globalement, un package InnoSetup occupe environ 250Ko en plus des programmes qu'il embarque (compressés automatiquement)
(contre 50 pour un .Zip auto, mais qui peut faire moins de choses).
C'est donc très rentable de packager pour simplifier l'usage de l'utilisateur final (débutant ou pressé), même si on a juste un seul EXE.

:wink:
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: [Tuto] InnoSetup: Packager ensemble appli 32 et 64 bits

Message par Marc56 »

Voici une mise à jour du tuto pour ceux qui souhaitent pouvoir installer un programme sans privilège administrateur.

Dans la section [Setup] on remplace {commonpf} par {autopf} (ligne DefaultDirName)
puis on ajoute
PrivilegesRequired=lowest
Sans cette ligne il utilise par défaut
PrivilegesRequired=admin

Pour avoir les icônes sur le bureau de l'utilisateur
[Icons]
{userdesktop} à la place de {commondesktop}

Voilà, c'est tout.

Un programme installé ainsi n'est accessible qu'à l'utilisateur l'ayant installé (et à l'admin)
Au niveau PB, le programme est accessible dans GetEnvironmentVariable("LOCALAPPDATA")

Attention: si vous changez de mode d'installation (admin -> user) et que vous faites une mise à jour: dans ce cas il faut désinstaller en mode admin (pour remplacer les fichiers).
Le mode mise à jour d'une application se fait automatiquement quand le numéro d'identification application (AppId=) dans [Setup] ne change pas.

Bon, tout cela est dans la doc d'InnoSetup.

:wink:
Répondre