Exemple d'installation avec Inno Setup

Rédigé en février 2015.

1) Introduction !

La meilleure façon d'expliquer une installation avec l'utilitaire Inno Setup, c'est de travailler sur un exemple concret. Pour ce faire, nous procéderons à l'installation de WampServer.

Ce didacticiel va se décomposer en trois parties qui sont :

flechela configuration de base par les différentes fenêtres d'Inno Setup.

flechele scripts final et plus particulièrement la main '[Code]' avec l'usage du langage Pascal Delphi.

flecheet pour terminer quelques remarques autour de l'installation de WampServer.

2) Où trouver Inno Setup !

Pour la dernière version (la 5.5), vous la trouverez dans ce lien. Si vous désirez une version plus ancienne, cliquez sur ce lien.

Pour réaliser cette configuration, j'utilisé la version 'Unicode' car je dois manipuler des chaînes de caractères 'UTF-8'.

3) Installer Inno Download Pugin !

Pour télécharger des fichiers 'zip' se trouvant sur les sites officiels, Inno setup, dans sa version de base, ne sait pas faire cela. Nous avons besoin d'un 'Plugin' qui sera inséré dans le script d'Inno Setup.

Pour télécharger ce plugin, vous le trouverez dans ce lien. À la date de la rédaction de ce didacticiel, j'ai installé la version "1.5.0 (14 Jan 2015 13:07)".

4) Premier partie : démarrage d'Inno Setup !

Nous allons dans le répertoire d'installation d'Inno Setup 'C:\Program Files (x86)\Inno Setup 5' et nous cliquons sur 'Compil32.exe'. Une fenêtre s'affiche avec un contenu vide.

Afin d'utiliser le mode de création basique de l'installation, nous devons cliquer sur l'onglet 'file' puis sur 'new'. Nous obtenons alors l'écran de bienvenue suivant :


Ecran 01 Inno Setup

Nous laissons la case 'Create a new empty script file' décochée. En la cochant nous revenons à l'étape précédente, à savoir un écran vide. Nous poursuivons en cliquant sur 'Next>'.


Ecran 02 Inno Setup

Quatre zones sont à saisir. Voici leur signification et comment les renseigner :

flecheApplication Name : le nom de l'application que je renseigne par 'WampServer'.

flecheApplication Version : le numéro de la version de WampServer. Actuellement, nous sommes en 2.5.

flecheApplication Publisher : l'auteur de la publication, c'est-à-dire moi, enfin 'Artemus'.

flecheApplication WebSite : le site d'information. Je mets mon site 'www.jcz.fr' qui pointe vers le didacticiel consacré à l'installation de 'WampServer'.

Ne vous inquittez pas si vous ne savez pas quoi mettre. On pourra, dans la deuxième partie modifier ces informations.


Ecran 03 Inno Setup

flecheApplication Destination Base Folder : nous avons le choix entre 'Program Files folder' et '(custom)'. Nous personnalisons le nom du répertoire d'installation de WampServer. À la ligne suivante, je mets 'C:\' comme valeur par défaut.

flecheApplication Folder Name : j'indique 'Wamp'. L'association de ces deux informations (le nom de la partition et le répertoire) va nous donner le répertoire par défaut : 'C:\Wamp'.

flecheAllow user to change the application Folder : on coche cette case, qui autorise l'utilisateur à modifier le répertoire par défaut.

flecheThe application doesn't need a folder : on ne coche pas cette case car nous avons besoin d'un répertoire d'installation.

À cette fenêtre, nous venons de définir le répertoire d'installation par défaut de l'application 'WampServer'. Celui-ci pourra être modifié par l'utilisateur.


Ecran 04 Inno Setup

Nous devons indiquer l'exécutable qui sera lancé à la fin de l'installation. Il s'agit de l'application 'WampManager.exe' qui va gérer l'icône WampServer dans la zone de notification.

flecheApplication main executable file : nous indiquons le chemin vers 'wampmanager.exe'.

flecheAllow user to start the application after Setup has finished : permet de démarrer l'application après la fin de l'installation (on coche).

flecheThe application doesn't have a main executable file : l'application n'a pas d'exécutable (on décoche).

flecheOther application file : nous ne mettons rien.

Dans la deuxième partie, nous retrendrons ce paramétrage, en détaillant un peu plus la configuration des sources et de l'exécutable qui sera lancé à la fin de l'installation.


Ecran 05 Inno Setup

Cette fenêtre renseigne la création du répertoire dans le menu démarrer.

flecheApplication Start Menu folder name : nous indiquons le nom du répertoire.

flecheAllow user to change the Start Menu folder name : permet le changement du nom du répertoire.

flecheAllow user to disable the Start Menu folder creation : permet de désactiver la création du répertoire (on décoche).

flecheCreate an internet shortcut in the Start Menu folder : création d'un raccourci internet.

flecheCreate an uninstall icon in the Start Menu folder : création d'une icône de désinstallation (On coche).

flecheOther main executable icons : autres icônes exécutables.

flecheAllow user to create a desktop icon : création d'une icône sur le bureau (On coche).

flecheAllow user to create a Quick Launch icon : création d'une icône de lancement rapide (On coche).


Ecran 06 Inno Setup

Dans ces trois champs, nous renseignons le chemin vers un fichier texte descrivant :

flecheLicense file : la licence d'utilisation de WampServer.

flecheInformation file show before installation : des explications avant l'installation.

flecheInformation file show after installation : ce qui reste à faire après l'installation.


Ecran 07 Inno Setup

Nous cochons la langue anglaise et le français. les autres langues ne nous intéressent pas.


Ecran 08 Inno Setup

Nous indiquons quelques paramètres pour la compilation.

flecheCustom compiler output folder : nous mettons 'output' comme répertoire de réceptio du résultat de la compilation.

flecheCompiler output base file name: c'est le nom de l'exécutable d'installation WampServer.

flecheCustom Setup icon file : nous indiquons le chemin vers l'icône de WampServer.

flecheSetup password : nous n'indiquons aucun mot de passe.


Ecran 09 Inno Setup

Nous décochons la case radio, car nous n'acceptons pas ces directives de compilation.


Ecran 10 Inno Setup

En cliquant sur le bouton 'Finish', nous allons produire le script d'installation que nous allons voir ci-après.


Ecran 11 Inno Setup

On nous demande si nous désirons faire une compilation. Nous acceptons.


Ecran 12 Inno Setup

Mais avant de faire la compilation, Inno Setup nous demande si nous désirons faire une sauvegarde. Ce que nous acceptons aussi.

À l'issu de cette première partie, nous avons compilé le script, mais nous n'avons pas terminé la construction de la procédure d'installation.

5) Le script d'installation de base !

Voici le script produit par le paramétrage des fenêtres que nous venons de détailler :

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{8C2C14D3-5A30-41B0-AE50-8240EBB25309}
AppName=WampServer
AppVersion=2.5
;AppVerName=WampServer 2.5
AppPublisher=Artemus
AppPublisherURL=http://www.jcz.fr/wampserver
AppSupportURL=http://www.jcz.fr/wampserver
AppUpdatesURL=http://www.jcz.fr/wampserver
DefaultDirName=C:\Wamp
DefaultGroupName=WampServer
LicenseFile=Doc\Licence.txt
InfoBeforeFile=Doc\Prologue.txt
InfoAfterFile=Doc\Epilogue.txt
OutputDir=Output
OutputBaseFilename=setup
SetupIconFile=F:\Wamp\menu\barimage.bmp
Compression=lzma
SolidCompression=yes

[Languages]
Name: "en"; MessagesFile: "compiler:Default.isl"
Name: "fr"; MessagesFile: "compiler:Languages\French.isl"

[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: "F:\Wamp\menu\wampmanager.exe"; DestDir: "{app}"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\WampServer"; Filename: "{app}\wampmanager.exe"
Name: "{group}\{cm:ProgramOnTheWeb,WampServer}"; Filename: "http://www.jcz.fr/WampServer"
Name: "{group}\{cm:UninstallProgram,WampServer}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\WampServer"; Filename: "{app}\wampmanager.exe"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\WampServer"; Filename: "{app}\wampmanager.exe";
 Tasks: quicklaunchicon

[Run]
Filename: "{app}\wampmanager.exe"; Description: "{cm:LaunchProgram,WampServer}"; Flags: nowait postinstall skipifsilent
		

Mais cela ne répond pas entièrement à notre attente. Ci-dessus, en rouge, c'est ce qui ne nous convient pas. Avant de passer à la suite, nous allons corriger ces trois problèmes :

flecheNous supprimons la directive 'AppID' qui ne nous sert à rien.

flecheNous supprimons entièrement le paragraphe '[Files]'.

flecheNous indiquons le chemin correcte vers 'wampmanager.exe'. Voir ci-après la modification en rouge :

[Run]
Filename: "{app}\menu\wampmanager.exe"; Description: "{cm:LaunchProgram,WampServer}"; Flags: nowait postinstall skipifsilent
			

6) Deuxième partie : intervention dans le script inno setup !

Tout l'intérêt de ce didacticiel repose sur l'introduction de nouvelles fonctionnalités qui ne sont pas accessibles directement par la première partie que nous venons de voir.

Avant d'aborder la question des paramétrages dans Inno Setup, nous traiterons de l'environnement que nous avons créé pour procéder à la construction de l'installation.

Dans une partition de notre ordinateur, destiné à l'installation de WampServer, nous définissons le répertoire suivant :

flecheE:\Wamp

Nous mettons la totalité des répertoires constituant l'infrastructure de WampServer sauf '/Wamp/bin' qui sera créé au moment de l'instllation.

flecheE:\InnoSetup

Nous y plaçons les deux sous-répertoires, que voiçi :

flecheE:\InnoSetup\Output

flecheE:\InnoSetup\Doc

Le premier sous-répertoire ('Output') sert à la compilation et contiendra l'exécutable. Il est défini par la directive suivante :

OutputDir=Output
			

Le second répertoire ('Doc') contient tous les fichiers suivants que nous utilisons dans le setup :

flechela licence (Licence.txt).

flechel'affichage d'un text avant l'installation (Prologue.txt).

flechel'affichage d'un text après l'installation (Epilogue.txt).

flechel'image de la partie gauche du setup (Photo_1.bmp).

flechel'icône wampserver dans la partie haute et droite du setup (Photo_2.bmp).

flechel'exécutable 'unzip.exe' servant à décompresser les fichiers 'zip'.

7) Le script final !

Nous allons commenter les différentes parties de ce setup qui va servir à l'installation de 'WampServer'.

Je ne détaillerai pas trop car le langage DElphi est suffisamment explicite pour être compris par un débutant.

#pragma include __INCLUDE__ + ";" + "C:\Program Files (x86)\Inno Download Plugin"
			

Ceci permet de faire le lien avec le répertoire de notre Plugin 'Inno Download Plugin' qui va nous servir à télécharger des fichiers 'zip'.

#define SPHERE     'rouge'
#define APACHE     '2.4.12'
#define PHP        '5.6.5'
#define PHP2       '5.5.21'
#define MYSQL      '5.6.22'
#define PHPMYADMIN '4.3.8'
#define PHPSYSINFO '3.2.0'

#define VERSION    GetDateTimeString('yyyy/mm/dd', '.', '');
			

Nous utilisons des variables du préprocesseurs Inno setup, à l'identique du langage 'C'. Voici le lien de l'aide sur le 'Define'.

Ci-après un exemple d'utilisation avec la variable 'VERSION' donnant la version d'installation en 32 ou 64 bits.

#define VERSION    64
			

En rouge, la variable 'VERSION' est ajouté dans le nom du 'setup' d'installation :

OutputBaseFilename=SetUp_{#VERSION}Bits
			

Chaque variable est accessible en la plaçant entre accolade et en la préfixant par un dièse ('#'). Il est impératif de respecter la casse de la variable. J'ai fait le choix de mettre le nom en majuscule afin de les distinguer des autres variables dans le script Inno Setup.

Autre exemple. Pour sélectionner la version 32 ou 64 bits, nous devons utiliser l'instruction 'if' comme ci-après :

#if VERSION == 32
...
#else
...
#endif
			

Il faut utiliser le double égale pour tester l'égalité. Voici le lien de l'aide sur le 'IF'.

[Setup]
AppName=WampServer
AppVersion=2.5
AppPublisher=Artemus
AppPublisherURL=http://www.jcz.fr/wampserver
AppSupportURL=http://www.jcz.fr/wampserver
AppUpdatesURL=http://www.jcz.fr/wampserver
DefaultDirName=C:\Wamp
DefaultGroupName=WampServer
LicenseFile=Doc\Licence.txt
InfoBeforeFile=Doc\Prologue.txt
InfoAfterFile=Doc\Epilogue.txt
OutputDir=Output
OutputBaseFilename=setup_wampserver
SetupIconFile=E:\Wamp\www\favicon.ico
Compression=lzma
SolidCompression=yes
			

Nous nous trouvons dans la main '[Setup]'. Nous retrouvons à l'identique ce que nous avons obtenu lors de notre première partie.

Ci-après de nouvelles directives venant compléter la main '[Setup]'.

; ajout
AlwaysRestart=yes
			

flechepermet de redémarrer l'ordinateur à la fin de l'installation --> voir l'aide.

AppCopyright=Copyright© 2015 Artemus
			

flechec'est le copyright qui sera visible dans les propriétés du setup --> voir l'aide.

DirExistsWarning=no
			

flechepermet de vérifier l'existence du répertoire d'installation --> voir l'aide.

MinVersion=6.0
			

flechelors de l'installation de WampServer, on vérifie que Windows est au minimum 'VISTA' --> voir l'aide.

En effet, la version WampServer n'est plus compatible avec windows XP.

PrivilegesRequired=admin
			

flechevous devez être administrateur pour procéder à l'installation --> voir l'aide.

ShowLanguageDialog=yes
			

flecheon affiche la boîte de dialogue des langues -- voir l'aide.

Ainsi, au démarrage de l'installation, vous obtiendrez cette fenêtre :


choix de la langue
VersionInfoVersion={#VERSION}.1
			

flechec'est le numéro de la version que nous utilisons. --> voir l'aide.

Lorsque nous faisons une mise à jour du seutp, nous introduisons comme numéro de version, la date système du jour. La première version date du '01 février 2015'.

WizardImageFile=Doc\Photo_1.bmp
			

flechec'est l'image qui se vera dans la parti gauche du setup de la fenêtre de bienvenue --> voir l'aide.

Sa dimension est '164 X 314' et son type est 'bmp'. Nous sommes allés au plus simple en mettant l'icône caractéristique de WampServer, ainsi que le titre de l'application et l'auteur de ce setup. Voici cette grande image :


Grande Image
WizardSmallImageFile=Doc\Photo_2.bmp
			

flechec'est l'icône qui apparait dans chaque fenêtre, en haut et à droite --> voir l'aide.

Sa dimension est '55 X 55' et son type est aussi 'bmp'. Voici cette petite image :


Grande Image
#include <idp.iss>
#include <idplang\default.iss>
#include <idplang\french.iss>

			

Par un 'include', nous introduisons toutes les fonctionnalités de 'Inno Download Plugin'. De même, nous introduisons l'anglais (par défaut) ainsi que le français

[Languages]
Name: "fr";  MessagesFile: "compiler:Languages\French.isl"
Name: "en"; MessagesFile: "compiler:Default.isl"
			

C'est la main '[Languages]'. Nous avons reporté à l'identique ce que nous avons obtenu lors de notre première partie.

Afin de respecter compatible avec le plugin, nous ne pouvons pas mettre 'english' ni 'french' mais la forme abrégée.

[CustomMessages]
en.Mess01=WampServer already exists !
en.Mess02=Would you like to uninstall the old version ?
en.Mess03=Error : 
en.Mess04=Your system requires an update supplied by Microsoft.
en.Mess05=would you like download update?
en.Mess06=The installation directory already exists!
en.Mess07=Do you want destroy?

en.Mess20=PHP mail parameters
en.Mess21=Please specify the Smtp server and the address mail to be used by PHP when using
en.Mess22=the function mail(). If you are not sure, just leave the default values.
en.Mess30=Choose your Browser
en.Mess31=Where is Browser located?
en.Mess32=Please choose your default Browser. If you are not sure, just click next.
en.Mess33=Location of Browser:
en.Mess40=Select Notepad Location
en.Mess41=Where is Notepad located?
en.Mess42=Select where Notepad is located, then click Next.
en.Mess43=Location of Notepad:

en.Mess50=Completion of Installation
en.Mess51=Starting Finalization
en.Mess52=Start Unzip
en.Mess53=Removed File
en.Mess54=Change Directory Name
en.Mess55=Delete Directory
en.Mess56=Create symlink to File
en.Mess57=Create symlink to Directory
en.Mess58=Copy File
en.Mess59=Service's Creation
en.Mess60=Stop Finalization

fr.Mess01=WampServer existe déjà !
fr.Mess02=Souhaitez-vous désinstaller l'ancienne version ?
fr.Mess03=Erreur : 
fr.Mess04=Votre système nécessite une mise à jour fournie par Microsoft.
fr.Mess05=Voulez-vous télécharger la mise à jour ?
fr.Mess06=Le répertoire d'installation existe déjà !
fr.Mess07=Voulez-vous le détruire ?

fr.Mess20=Paramètres PHP messagerie
fr.Mess21=Spécifiez votre serveur Smtp et votre adresse email dans php lors de l'utilisation
fr.Mess22=de la fonction mail(). Si vous n'êtes pas sûr, laissez les valeurs par défaut.
fr.Mess30=Choisissez votre navigateur
fr.Mess31=Où se trouve votre navigateur?
fr.Mess32=Choisissez votre navigateur par défaut. Si vous n'êtes pas sûr, cliquez sur Next.
fr.Mess33=Emplacement de votre navigateur:
fr.Mess40=Sélectionnez l'emplacement du bloc-note.
fr.Mess41=Où se trouve le bloc-notes?
fr.Mess42=Sélectionnez l'emplacement du bloc-note, puis cliquez sur Next.
fr.Mess43=Emplacement du bloc-note:

fr.Mess50=Finalisation de l'installation
fr.Mess51=Démarrage de la finalisation
fr.Mess52=Démarrage de la décompression
fr.Mess53=Suppresion du fichier
fr.Mess54=Changement du nom du répertoire
fr.Mess55=Suppression du répertoire
fr.Mess56=Création lien symbolique vers fichier
fr.Mess57=Création lien symbolique vers répertoire
fr.Mess58=Copie du fichier
fr.Mess59=Création du services
fr.Mess60=Arrêt de la finalisation
			

C'est la main '[CustomMessages]', c'est-à-dire la personnalisation des messages en fonction des langues.

Chaque message se retrouve en double, un fois pour l'anglais (en) et une fois pour le français (fr).

Dans le script, nous appellerons nos messages, en utilisant la fonction suivante :

ExpandConstant('{cm:Mess03}')
			

Inno setup sera capable de choisir la langue que vous avez sélectionné lors du démarrage de l'installation.

			
[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
			

C'est la main '[Tasks]'. Nous avons reporté à l'identique ce que nous avons obtenu lors de notre première partie.

[Types]
Name: "V32Bits"; Description: "32 Bits Complet Version";
Name: "V64Bits"; Description: "64 Bits Complet Version"; Check: IsWin64;

[Components]
Name: "V32"; Description: "32 Bits Complet Version"; Types: V32Bits; Flags: disablenouninstallwarning
Name: "V64"; Description: "64 Bits Complet Version"; Types: V64Bits; Flags: disablenouninstallwarning
			

La main '[Types]' et la main '[Components]' fonctionnent ensembles. Nous avons défini deux types d'installations :

flechela version 32 bits qui sera toujours accessible.

flechela version 64 bits seulement pour le système d'exploitation Windows (IsWin64) le supportant.

Vous aurez dans le setup deux sélections possibles comme ci-après :

fleche32 Bits Complet Version

fleche64 Bits Complet Version

Dans le script, nous utiliserons les identifiants 'V32' ou 'V64' pour tester l'installation. soit à partir de la fonction suivante issue de 'Inno Download Plugin' :

IsComponentSelected('V32')
			

ou en ajoutant ce qui est en rouge dans la main '[Files]' sur un source à installer, mais nous le le faisons pas :

Source: "Doc\unzip.EXE";          DestDir: "{tmp}"; Components: V32 Flags: deleteafterinstall
			
[Files]
Source: "Doc\unzip.EXE";          DestDir: "{tmp}"; Flags: deleteafterinstall
Source: "E:\Wamp\*";              DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "{tmp}\apache.zip";       DestDir: "{app}"; Flags: external deleteafterinstall
Source: "{tmp}\php.zip";          DestDir: "{app}"; Flags: external deleteafterinstall
Source: "{tmp}\php2.zip";         DestDir: "{app}"; Flags: external deleteafterinstall
Source: "{tmp}\mysql.zip";        DestDir: "{app}"; Flags: external deleteafterinstall
Source: "{tmp}\phpmyadmin.zip";   DestDir: "{app}"; Flags: external deleteafterinstall
Source: "{tmp}\phpsysinfo.zip";   DestDir: "{app}"; Flags: external deleteafterinstall
			

La main '[Files]' est consitituée de l'ensemble des fichiers ou répertoires que nous installons. Il s'agit d'une première étape. On retrouve :

flechel'exécutable 'unzip.exe' pour décompresser les fichiers 'zip'.

flechele répertoire 'wamp' qui est notre répertoire d'installation.

flecheet la recopie de six fichiers compressés qui seront par la suite décompressés et installés dans leur répertoires respectifs.

[Dirs]
Name: "{app}\apps"
Name: "{app}\bin"
Name: "{app}\bin\apache"
Name: "{app}\bin\php"
Name: "{app}\bin\php\courant"
Name: "{app}\bin\php\php{#PHP2}"
Name: "{app}\bin\mysql"
Name: "{app}\tmp"
			

Nous créons des répertoires qui ne sont pas présents à l'origine. Ils vont nous servir à décompresser nos cinq fichiers 'zip'.

[Icons]
Name: "{group}\WampServer";                                                Filename: "{app}\menu\wampmanager.exe"
Name: "{group}\{cm:ProgramOnTheWeb,WampServer}";                           Filename: "{#SetupSetting("AppSupportURL")}"
Name: "{group}\{cm:UninstallProgram,WampServer}";                          Filename: "{uninstallexe}"
Name: "{commondesktop}\WampServer";                                        Filename: "{app}\menu\wampmanager.exe";
 Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\WampServer"; Filename: "{app}\menu\wampmanager.exe";
 Tasks: quicklaunchicon
			

C'est la main '[Icons]'. Nous avons reporté à l'identique ce que nous avons obtenu lors de notre première partie.

[INI]
Filename: {app}\Wamp.ini; main: main;       Key: display;           String: """no""";
                                   Flags: createkeyifdoesntexist
Filename: {app}\Wamp.ini; main: main;       Key: navigator;         String: """<browser>""";
                                   Flags: createkeyifdoesntexist
Filename: {app}\Wamp.ini; main: main;       Key: notepad;           String: """<notepad>""";
                                   Flags: createkeyifdoesntexist
Filename: {app}\Wamp.ini; main: wamp;       Key: wampVersion;       String: """{#SetupSetting("AppName")}
 {#SetupSetting("AppVersion")}"""; Flags: createkeyifdoesntexist
Filename: {app}\Wamp.ini; main: language;   Key: languageDefault;   String: """english""";
                                   Flags: createkeyifdoesntexist
Filename: {app}\Wamp.ini; main: language;   Key: language;          String: """french""";
               Languages: fr;      Flags: createkeyifdoesntexist
Filename: {app}\Wamp.ini; main: language;   Key: language;          String: """english""";
               Languages: en;      Flags: createkeyifdoesntexist
                                   Flags: createkeyifdoesntexist
Filename: {app}\Wamp.ini; main: sphere;     Key: sphereVersion;     String: """{#SPHERE}""";
                                   Flags: createkeyifdoesntexist
Filename: {app}\Wamp.ini; main: apache;     Key: apacheVersion;     String: """{#APACHE}""";
                                   Flags: createkeyifdoesntexist
Filename: {app}\Wamp.ini; main: mysql;      Key: mysqlVersion;      String: """{#MYSQL}""";
                                   Flags: createkeyifdoesntexist
Filename: {app}\Wamp.ini; main: php;        Key: phpVersion;        String: """{#PHP}""";
                                   Flags: createkeyifdoesntexist
Filename: {app}\Wamp.ini; main: phpmyadmin; Key: phpmyadminVersion; String: """{#PHPMYADMIN}""";
                                   Flags: createkeyifdoesntexist
			

La main '[Ini]' va nous servir à créer le fichier final 'wampmanager.conf'. Mais en ce point de l'installation, nous créons un fichier intermédiaire 'wamp.ini' qui sera renommer et déplacer dans le répertoire '/menu'.

Nous avons qautre sortes de paramétrages dans cette main :

flecheune chaîne de caractères fixe comme la constante 'no' ou le langue 'french'.

flechele résultat d'une fonction, par exemple 'GetBrowser()'.

flechele contenu d'une directive provenant de la main '[Setup]', comme 'AppName' et 'AppVersion'.

flecheet une variable provenant du préprocessuer, comme 'Apache'.

[Registry]
Root: HKLM; SubKey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment\"; ValueType: expandsz; ValueName: "Path";
  ValueData: "{reg:HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\,Path};{app}\bin\php\courant\ext";
  Flags: preservestringtype noerror;
Root: HKLM; SubKey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment\"; ValueType: expandsz; ValueName: "Path";
  ValueData: "{reg:HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\,Path};{app}\bin\php\courant";
  Flags: preservestringtype noerror;
			

La main '[Registry]' va nous permettre de modifier la variable d'environnement 'PATH', en venant ajouter deux chemins vers :

flechele répertoire '/php/courant'.

flechele répertoire '/php/courant/ext'.

[Run]
			

la main '[Run]' doit normalemennt contenir les différents traitement de finalisation de l'installation.

Nous avons préféré introduire une page personnalisée présentant une barre de progression, afin de ne pas se retrouver devant une page inerte.

Filename: "{app}\menu\wampmanager.exe"; Description: "{cm:LaunchProgram,WampServer}"; Flags: nowait postinstall skipifsilent
			

Et à la fin de l'installation, l'icône WampServer sera lancée. Il y a juste un petit problème. Puisque nous devons redémarrer l'ordinateur à la fin de cette installation, cela ne se fera pas.

[UninstallDelete]
Type: filesandordirs; Name: "{app}"

[UninstallRun]
Filename: {sys}\sc.exe; Parameters: "stop   wampapache"; Flags: runhidden waituntilterminated
Filename: {sys}\sc.exe; Parameters: "stop   wampmysqld"; Flags: runhidden waituntilterminated
Filename: {sys}\sc.exe; Parameters: "delete wampapache"; Flags: runhidden waituntilterminated
Filename: {sys}\sc.exe; Parameters: "delete wampmysqld"; Flags: runhidden waituntilterminated
			

Nous sommes dans les mains consacrées à la désinstallation. Nous supprimons entièrement le répertoire /wamp' et nous stoppons et supprimons les services 'wampapache' et 'wampmysqld'.

Ci-après, nous entrons dans la main '[Code]' qui est relatif au langage Delphi. Nous ne détaillerons pas trop le code, car il est suffisamment clair, même pour un débutant.

[Code]
var
  Smtp, Sendmail: TNewEdit;
  Notepad, Browser: TInputFileWizardPage;
  ProgressPage: TOutputProgressWizardPage;
			

Nous definissons les variables globales. Elles serons accessibles par toutes les fonctions de ce script.

//*========================*
//* Passage d'informations *
//*========================*

function GetVersion(const none: String): String;
begin
  if IsComponentSelected('V32') then
       Result := 'win32'
  else Result := 'winx64';
end;
			

Nous avons une fonction faisant le lien avec les différentes section du script. Le Delphi ne nous autorise pas à créer une fonction sans paramètre.

Le passage de l'information se fait en mettant la référence à la fonction de la façon suivante :

{code:GetVersion}
			

Comme il s'agit d'un passage de chaine de caractères, il est logique de définir le résultat en tant que 'String'. Il semble exister une différence entre 'String' et 'AnsiString', mais comme je n'utilise que des caractères ASCII, cela ne devrait poser aucun problème.

//*================*
//* Création Pages *
//*================*

procedure InitializeWizard();
var
  Page3: TWizardPage;
  Lab1, Lab2,Lab3, Lab4: TLabel;

begin
  idpSetOption('DetailedMode', 'yes');
  idpSetOption('DetailsButton','no');

  idpDownloadAfter(wpReady);
			

Dans cette procédure, nous définissons la préparation des pages personnelles. Ci-dessus, nous avons supprimé le bouton 'détails' de la page 'Downloading Additional Files' qui traite le téléchargement des fichiers 'zip'. De même, nous avons fait en sorte de cliquer sur ce bouton afin d'avoir les deux barres de progressions à l'affichage.

La page 'Downloading Additional Files' va s'afficher après la page 'Ready' d'Inno Setup.

  //*------------------------------*
  //* Saisie 'Php mail parameters' *
  //*------------------------------*

  Page3 := CreateCustomPage(wpInstalling, ExpandConstant('{cm:Mess20}'), '');

  Lab1          := TLabel.Create(WizardForm);
  Lab1.Caption  := ExpandConstant('{cm:Mess21}');
  Lab1.AutoSize := False;
  Lab1.Parent   := Page3.Surface;

  Lab2          := TLabel.Create(WizardForm);
  Lab2.Left     := Lab1.Left;
  Lab2.Top      := Lab1.Top + Lab1.Height;
  Lab2.Caption  := ExpandConstant('{cm:Mess22}');
  Lab2.AutoSize := False;
  Lab2.Parent   := Page3.Surface;

  Lab3          := TLabel.Create(WizardForm);
  Lab3.Left     := Lab2.Left;
  Lab3.Top      := Lab2.Top + Lab2.Height + ScaleY(12);
  Lab3.Caption  := 'Smtp:';
  Lab3.AutoSize := False;
  Lab3.Parent   := Page3.Surface;

  Smtp        := TNewEdit.Create(WizardForm);
  Smtp.Left   := Lab3.Left;
  Smtp.Top    := Lab3.Top + Lab3.Height + ScaleY(2);
  Smtp.Width  := Page3.SurfaceWidth;
  Smtp.Text   := 'localhost';
  Smtp.Parent := Page3.Surface;

  Lab4          := TLabel.Create(WizardForm);
  Lab4.Left     := Smtp.Left;
  Lab4.Top      := Smtp.Top + Smtp.Height + ScaleY(14);
  Lab4.Caption  := 'Email:';
  Lab4.AutoSize := False;
  Lab4.Parent   := Page3.Surface;

  Sendmail        := TNewEdit.Create(WizardForm);
  Sendmail.Left   := Lab4.Left;
  Sendmail.Top    := Lab4.Top + Lab4.Height + ScaleY(2);
  Sendmail.Width  := Page3.SurfaceWidth;
  Sendmail.Text   := 'you@yourdomain';
  Sendmail.Parent := Page3.Surface;

  //*-------------------------*
  //* on récupère 'Navigator' *
  //*-------------------------*

  Browser := CreateInputFilePage(wpInstalling, ExpandConstant('{cm:Mess30}'),ExpandConstant('{cm:Mess31}'),
        ExpandConstant('{cm:Mess32}'));
  Browser.Add(ExpandConstant('{cm:Mess33}'),'Executable files|*.exe|All files|*.*','.exe');
  Browser.Values[0] := ExpandConstant('{pf}\Google\Chrome\Application\chrome.exe');

  //*---------------------------------*
  //* on récupère un éditeur de texte *
  //*---------------------------------*

  Notepad := CreateInputFilePage(wpInstalling, ExpandConstant('{cm:Mess40}'), ExpandConstant('{cm:Mess41}'),
        ExpandConstant('{cm:Mess42}'));
  Notepad.Add(ExpandConstant('{cm:Mess43}'),'Executable files|*.exe|All files|*.*','.exe');
  Notepad.Values[0] := ExpandConstant('{pf}\Notepad++\notepad++.exe');

  //*----------------------*
  //* Barre de Progression *
  //*----------------------*

  ProgressPage := CreateOutputProgressPage(ExpandConstant('{cm:Mess50}'),'');
end;
			

Nous avons quatre pages personnelles, concernant la saisie :

flechela saisie des paramètres pour configurer le serveur mail.

flechela saisie du nom du navigateur. par défaut, c'est 'Google Chrome'.

flechela saisie de nom de l'éditeur de texte, c'est 'notepade++'.

flechel'affichage de la barre de progression.

Ce sont les seuls paramétrages que l'utilisateur va devoir entrer pour personnaliser son WampServer.

//*============================================*
//* Suppression processus en cours d'exécution *
//*============================================*

function PrepareToInstall(var NeedsRestart: Boolean): String;
var
  CodErr: Integer;

begin
  ShellExec('open', 'taskkill.exe', '/f /im httpd.exe','',      SW_HIDE, ewNoWait, CodErr);
  ShellExec('open', 'taskkill.exe', '/f /im mysqld.exe','',     SW_HIDE, ewNoWait, CodErr);
  ShellExec('open', 'taskkill.exe', '/f /im wampmanager.exe','',SW_HIDE, ewNoWait, CodErr);
end;
			

Avant d'installer WampServer, nous supprimons les tâches d'arrière plan concernant le serveur 'wampapache' (httpd.exe) et le serveur 'wampmysqld' (mysqld.exe), ainsi que l'icône WampServer (wampmanager.exe).'

//*=================================*
//* Vérification après avoir cliqué *
//*=================================*

function NextButtonClick(CurPageID: Integer): Boolean;
var
  Clef, Desinstaller, DirName: String;
  ErrCode: Integer;

begin
  Result := True;

  //*---------------------------------*
  //* Test Existence Ancienne Version *
  //*---------------------------------*

  if CurPageID = wpWelcome then
  begin
    Clef :=  'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WampServer_is1';

    if RegQueryStringValue(HKLM, Clef, 'UninstallString', Desinstaller) then
    begin
      If Desinstaller <> '' then
      begin
        Desinstaller := RemoveQuotes(Desinstaller);

        if MsgBox(ExpandConstant('{cm:Mess01}')+#13+ExpandConstant('{cm:Mess02}'), mbConfirmation, MB_YESNO) = idYes then
        begin
          if not Exec(Desinstaller, '/silent', '', SW_SHOW, ewWaitUntilTerminated, ErrCode) then
          begin
            MsgBox(ExpandConstant('{cm:Mess03}')+SysErrorMessage(ErrCode) + '.', mbError, MB_OK);
            Result := False;
          end;
        end
        else
          Result := False;
      end;
    end;
  end;
			

Nous testons s'il existe une ancienne installation de WampServer sur l'ordinateur.

Une boîte de dialogue va s'afficher pour vous demander d'effectuer la désinstallation de cette ancienne version.

  //*------------------------------------------------------------*
  //* test Microsoft Visual C++ 2012 Redistributable (X86 & X64) *
  //*------------------------------------------------------------*

  if CurPageID = wpInfoBefore then
  begin
    if not RegKeyExists(HKEY_CLASSES_ROOT, 'Installer\Dependencies\{3bcf8c72-b231-4d28-9f39-3405c22d8b5a}') then
    begin
      if MsgBox(ExpandConstant('{cm:Mess04}')+#13+ExpandConstant('{cm:Mess05}'), mbConfirmation, MB_YESNO) = IDYES then
      begin
        ShellExec('open', 'http://www.microsoft.com/fr-fr/download/details.aspx?id=30679', '', '', SW_SHOW,
             ewWaitUntilTerminated, ErrCode);
      end;
    end;
  end;
			

Nous vérifions que la DLL 'Microsoft Visual C++ 2012 Redistributable version 32 ou 64 bits, nécessaire au fonctionnement de WampServer, est présente sur l'ordinateur. Si ce n'est pas le cas alors il faut installer ces DLL.

  //*--------------------------------------------------*
  //* test de l'existence du répertoire d'installation *
  //*--------------------------------------------------*

  if CurPageID = wpSelectdir then
  begin
    DirName := expandConstant('{app}');

    if DirExists(DirName) then
    begin
      if MsgBox(ExpandConstant('{cm:Mess06}')+#13+ExpandConstant('{cm:Mess07}'), mbConfirmation, MB_YESNO) = IDYES then
      begin
          if not Exec('cmd', '/C rmdir /S /Q '+DirName, '', SW_HIDE, ewWaitUntilTerminated, ErrCode) then
          begin
            MsgBox(ExpandConstant('{cm:Mess03}')+SysErrorMessage(ErrCode) + '.', mbError, MB_OK);
            Result := False;
          end;
      end
      else
        Result := False;
    end;
  end;
end;
			

Nous vérifions si le répertoire d'installation '/wamp' existe. Si c'est le cas, on le supprime.

//*===================================*
//*                                   *
//*===================================*

procedure CurPageChanged(CurPageID: Integer);
var
  CodErr, z: Integer;

begin
//*-----------------------------------*
//* Téléchargement des fichiers 'zip' *
//*-----------------------------------*

  if CurPageID = wpReady then
  begin
    idpClearFiles;

    if IsComponentSelected('V32') then
    begin
      idpAddFile('http://www.apachelounge.com/download/VC11/binaries/httpd-{#APACHE}-win32-VC11.zip',
           ExpandConstant('{tmp}\apache.zip'));
      idpAddFile('http://windows.php.net/downloads/releases/php-{#PHP}-Win32-VC11-x86.zip',
	       ExpandConstant('{tmp}\php.zip'));
      idpAddFile('http://windows.php.net/downloads/releases/php-{#PHP2}-Win32-VC11-x86.zip',
	       ExpandConstant('{tmp}\php2.zip'));
      idpAddFile('http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-{#MYSQL}-win32.zip',
	       ExpandConstant('{tmp}\mysql.zip'));
    end
    else
    begin
      idpAddFile('http://www.apachelounge.com/download/VC11/binaries/httpd-{#APACHE}-win64-VC11.zip',
	       ExpandConstant('{tmp}\apache.zip'));
      idpAddFile('http://windows.php.net/downloads/releases/php-{#PHP}-Win32-VC11-x64.zip',
	       ExpandConstant('{tmp}\php.zip'));
      idpAddFile('http://windows.php.net/downloads/releases/php-{#PHP2}-Win32-VC11-x64.zip',
	       ExpandConstant('{tmp}\php2.zip'));
      idpAddFile('http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-{#MYSQL}-winx64.zip',
	       ExpandConstant('{tmp}\mysql.zip'));
    end;

    idpAddFile('http://sourceforge.net/projects/phpmyadmin/files/phpMyAdmin/{#PHPMYADMIN}/
	       phpMyAdmin-{#PHPMYADMIN}-all-languages.zip/download',
		   ExpandConstant('{tmp}\phpmyadmin.zip'));
	idpAddFile('https://github.com/phpsysinfo/phpsysinfo/archive/v3.2.0.zip',
	       ExpandConstant('{tmp}\phpsysinfo.zip'));

  end;
end;
			

Cette procédure lance l'installation des fichiers 'zip' dans le répertoire '/temp' de votre session windows. Ce téléchargement est visible dans la page 'Downloading Additional Files' sous la forme d'une barre de progression.

Le nom du fichier est renommé afin d'être simplifié dans le traitement de l'installation.

//*=====================================================================*
//* Modification de la variable environnement PATH à la désinstallation *
//*=====================================================================*

procedure ModifierChemin(var Path: string; Rep: string);
var
  DirName: String;
  Index: Integer;

begin
      DirName := ExpandConstant('{app}'+Rep);
      Index := Pos(DirName, Path);
      Delete(Path, Index-1, Length(DirName)+1);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  Path: string;

begin
  if CurUninstallStep = usUninstall then
  begin
    if RegQueryStringValue(HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Control\Session Manager\Environment\','Path',Path) then
    begin
      ModifierChemin(Path, '\bin\php\courant\ext');
      ModifierChemin(Path, '\bin\php\courant');

      RegWriteStringValue(HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Control\Session Manager\Environment\','Path',Path);
    end;
  end;
end;
			

Lors de la désinstallation de WampServer, nous supprimons des deux chemins que nous avons placé dans la variable d'environnment 'PATH', par l'intermédiaire de la main '[Registry]'.

//*=======================*
//* Fin de l'installation *
//*=======================*

procedure ModifierChaine(AppDir: String; Chaine: String; Rep: String);
var
  FileContentAnsi: AnsiString;
  FileName, FileContentString: String;

begin
    FileName := ExpandConstant('{app}'+Rep);

    if FileExists(FileName) then                                                                               
    begin
      LoadStringFromFile(FileName, FileContentAnsi);
      FileContentString := string(FileContentAnsi);

      if StringChangeEx(FileContentString, Chaine, AppDir, True) >0 then
         SaveStringToFile(FileName, AnsiString(FileContentString), False);
    end;
end;
			

Cette procédure permet de modifier des chaines de caractères qui servent de paramètres à l'installation de WampServer.

Ci-après, nous gérons une page personnalisée affichant une barre de progression. Normalement toute cette partie se trouvait dans la main '[Run]'.

procedure CurStepChanged(CurStep: TSetupStep);
var
  Debut, Path1, Path2: String;
  AppDir: String;

begin
  //*--------------------------------*
  //* Finalisation de l'installation *
  //*--------------------------------*

  if CurStep = ssPostInstall then
  begin
    ProgressPage.SetText('0.'+ExpandConstant('{cm:Mess51}'), '');
    ProgressPage.Show;
    try
      for z := 0 to 36 do
      begin
        ProgressPage.SetProgress(z, 36);

        Case z of
        //*----------------------------------*
        //* Décompression des fichiers 'zip' *
        //*----------------------------------*

         1: begin
              ProgressPage.SetText('1.'+ExpandConstant('{cm:Mess52}'), 'MySql.zip');
              Exec(ExpandConstant('{tmp}\unzip.exe'),
                   ExpandConstant('{app}\mysql.zip -d {app}\bin\mysql'),
                   '', SW_SHOW, ewWaitUntilTerminated, CodErr);
            end;
         2: begin
              ProgressPage.SetText('2.'+ExpandConstant('{cm:Mess52}'), 'Php.zip');
              Exec(ExpandConstant('{tmp}\unzip.exe'),
                   ExpandConstant('{app}\php.zip -d {app}\bin\php\courant'),
                   '', SW_SHOW, ewWaitUntilTerminated, CodErr);
            end;
         3: begin
              ProgressPage.SetText('3.'+ExpandConstant('{cm:Mess52}'), 'Php2.zip');
              Exec(ExpandConstant('{tmp}\unzip.exe'),
                   ExpandConstant('{app}\php2.zip -d {app}\bin\php\php{#PHP2}'),
                   '', SW_SHOW, ewWaitUntilTerminated, CodErr);
            end;
         4: begin
              ProgressPage.SetText('4.'+ExpandConstant('{cm:Mess52}'), 'Apache.zip');
              Exec(ExpandConstant('{tmp}\unzip.exe'),
                   ExpandConstant('{app}\apache.zip -d {app}\bin\apache'),
                   '', SW_SHOW, ewWaitUntilTerminated, CodErr);
            end;
         5: begin
              ProgressPage.SetText('5.'+ExpandConstant('{cm:Mess52}'), 'PhpMyAdmin.zip');
              Exec(ExpandConstant('{tmp}\unzip.exe'),
                   ExpandConstant('{app}\phpmyadmin.zip -d {app}\apps'),
                   '', SW_SHOW, ewWaitUntilTerminated, CodErr);
            end;
         6: begin
              ProgressPage.SetText('6.'+ExpandConstant('{cm:Mess52}'), 'PhpSysInfo.zip');
              Exec(ExpandConstant('{tmp}\unzip.exe'),
                   ExpandConstant('{app}\phpsysinfo.zip -d {app}\apps'),
                   '', SW_SHOW, ewWaitUntilTerminated, CodErr);
            end;
			

Ici, nous décompressons les fichiers 'zip' qui sont au nombre de six. La décompression est fort longue, surtout celle de 'MySql'.

Nous avons fait le choix d'installer deux php, dont l'un est de la branche 5.6 et l'autre, la branche 5.5, qui sont compatible avec apache.

Nous installons en plus, un utilitaire de nom 'phpSysInfo'.

        //*--------------------------------*
        //* Suppression des fichiers 'zip' *
        //*--------------------------------*

         7: begin
              ProgressPage.SetText('7.'+ExpandConstant('{cm:Mess53}'), 'MySql.zip');
              DeleteFile(ExpandConstant('{app}\mysql.zip'));
              sleep(100);
            end;
         8: begin
              ProgressPage.SetText('8.'+ExpandConstant('{cm:Mess53}'), 'Php.zip');
              DeleteFile(ExpandConstant('{app}\php.zip'));
              sleep(100);
            end;
         9: begin
              ProgressPage.SetText('9.'+ExpandConstant('{cm:Mess53}'), 'Php2.zip');
              DeleteFile(ExpandConstant('{app}\php2.zip'));
              sleep(100);
            end;
        10: begin
              ProgressPage.SetText('10.'+ExpandConstant('{cm:Mess53}'), 'Apache.zip');
              DeleteFile(ExpandConstant('{app}\apache.zip'));
              sleep(100);
            end;
        11: begin
              ProgressPage.SetText('11.'+ExpandConstant('{cm:Mess53}'), 'PhpMyAdmin.zip');
              DeleteFile(ExpandConstant('{app}\phpmyadmin.zip'));
              sleep(100);
            end;
        12: begin
              ProgressPage.SetText('12.'+ExpandConstant('{cm:Mess53}'), 'PhpSysInfo.zip');
              DeleteFile(ExpandConstant('{app}\phpsysinfo.zip'));
              sleep(100);
            end;
			

À la fin de la décompression, nous supprimons tous les fichiers 'zip'.

        //*-----------------------------------*
        //* Changement de nom des répertoires *
        //*-----------------------------------*

        13: begin
              ProgressPage.SetText('13.'+ExpandConstant('{cm:Mess54}'), 'Apache');
              RenameFile(ExpandConstant('{app}\bin\apache\Apache24'),
                         ExpandConstant('{app}\bin\apache\apache{#APACHE}'));
              sleep(100);
            end;
        14: begin
              ProgressPage.SetText('14.'+ExpandConstant('{cm:Mess54}'), 'MySql');
              RenameFile(ExpandConstant('{app}\bin\mysql\mysql-{#MYSQL}-{code:GetVersion}'),
                         ExpandConstant('{app}\bin\mysql\mysql{#MYSQL}'));
              sleep(100);
            end;
        15: begin
              ProgressPage.SetText('15.'+ExpandConstant('{cm:Mess54}'), 'PhpMyAdmin');
              RenameFile(ExpandConstant('{app}\apps\phpMyAdmin-{#PHPMYADMIN}-all-languages'),
                         ExpandConstant('{app}\apps\phpmyadmin{#PHPMYADMIN}'));
              sleep(100);
            end;
        16: begin
              ProgressPage.SetText('16.'+ExpandConstant('{cm:Mess54}'), 'PhpSysInfo');
              RenameFile(ExpandConstant('{app}\apps\phpsysinfo-{#PHPSYSINFO}'),
                         ExpandConstant('{app}\apps\phpsysinfo{#PHPSYSINFO}'));
              sleep(100);
            end;
 			

Nous normalisons les noms des répertoires d'Apache, de MySql, de PhpMyAdmin et de PhpSysInfo.

Nous avons juste un léger problème avec le nom du répetoire 'MySql' car celui possède dans son nom, la version installée, à savoir 'win32' ou 'winx64'. C'est le rôle jouée par la fonction 'GetVersion()'.

        //*-------------------------------------------*
        //* Suppression des fichiers de configuration *
        //*-------------------------------------------*

        17: begin
              ProgressPage.SetText('17.'+ExpandConstant('{cm:Mess53}'), 'Httpd.conf');
              DeleteFile(ExpandConstant('{app}\bin\apache\apache{#APACHE}\conf\httpd.conf'));
              sleep(100);
            end;
        18: begin
              ProgressPage.SetText('18.'+ExpandConstant('{cm:Mess53}'), 'Param.conf');
              DeleteFile(ExpandConstant('{app}\bin\apache\apache{#APACHE}\conf\param.conf'));
              sleep(100);
            end;
        19: begin
              ProgressPage.SetText('19.'+ExpandConstant('{cm:Mess53}'), 'Php.ini (1)');
              DeleteFile(ExpandConstant('{app}\bin\php\courant\php.ini'));
              sleep(100);
            end;
        20: begin
              ProgressPage.SetText('20.'+ExpandConstant('{cm:Mess53}'), 'Php.ini (2)');
              DeleteFile(ExpandConstant('{app}\bin\php\php{#PHP2}\php.ini'));
              sleep(100);
            end;
        21: begin
              ProgressPage.SetText('21.'+ExpandConstant('{cm:Mess53}'), 'My.ini');
              DeleteFile(ExpandConstant('{app}\bin\mysql\mysql{#MYSQL}\my.ini'));
              sleep(100);
            end;
        22: begin
              ProgressPage.SetText('22.'+ExpandConstant('{cm:Mess53}'), 'Config.inc.php');
              DeleteFile(ExpandConstant('{app}\apps\phpmyadmin{#PHPMYADMIN}\config.inc.php'));
              sleep(100);
            end;
        23: begin
              ProgressPage.SetText('23.'+ExpandConstant('{cm:Mess53}'), 'Wampmanager.conf');
              DeleteFile(ExpandConstant('{app}\menu\wampmanager.conf'));
              sleep(100);
            end;
        24: begin
              ProgressPage.SetText('24.'+ExpandConstant('{cm:Mess55}'), 'Alias');
              DelTree(ExpandConstant('{app}\alias'), True, True, True);
              sleep(100);
            end;
			

Nous supprimons tous les fichiers de configuration présents lors de l'installation d'Apache, de Php, de MySql, de PhpMyAdmin, ainsi que le fichier 'wampmanager.conf' du répertoire '/menu'.

Les fichiers de configurations sont au nombre de cinq :

flechehttpd.conf pour Apache.

flecheparam.conf pour Apache.

flechephp.ini pour Php.

flechemy.ini pour MySql.

flecheconfig.inc.php pour PhpMyAdmin.

        //*--------------------------------*
        //* Création des liens symboliques *
        //*--------------------------------*

        25: begin
              ProgressPage.SetText('25.'+ExpandConstant('{cm:Mess56}'), 'Httpd.conf');
              Exec(ExpandConstant('{cmd}'),
                   ExpandConstant('/c mklink {app}\bin\apache\apache{#APACHE}\conf\httpd.conf {app}\sphere\{#SPHERE}\httpd.conf'),
                   '', SW_HIDE, ewWaitUntilTerminated, CodErr);
              sleep(100);
            end;
        26: begin
              ProgressPage.SetText('26.'+ExpandConstant('{cm:Mess56}'), 'Param.conf');
              Exec(ExpandConstant('{cmd}'),
                   ExpandConstant('/c mklink {app}\bin\apache\apache{#APACHE}\conf\param.conf {app}\sphere\{#SPHERE}\param.conf'),
                   '', SW_HIDE, ewWaitUntilTerminated, CodErr);
              sleep(100);
            end;
        27: begin
              ProgressPage.SetText('27.'+ExpandConstant('{cm:Mess56}'), 'Php.ini (1)');
              Exec(ExpandConstant('{cmd}'),
                   ExpandConstant('/c mklink {app}\bin\php\courant\php.ini {app}\sphere\{#SPHERE}\php.ini'),
                   '', SW_HIDE, ewWaitUntilTerminated, CodErr);
              sleep(100);
            end;
        28: begin
              ProgressPage.SetText('28.'+ExpandConstant('{cm:Mess56}'), 'Php.ini (2)');
              Exec(ExpandConstant('{cmd}'),
                   ExpandConstant('/c mklink {app}\bin\php\php{#PHP2}\php.ini {app}\sphere\{#SPHERE}\php.ini'),
                   '', SW_HIDE, ewWaitUntilTerminated, CodErr);
              sleep(100);
            end;
        29: begin
              ProgressPage.SetText('29.'+ExpandConstant('{cm:Mess56}'), 'My.ini');
              Exec(ExpandConstant('{cmd}'),
                   ExpandConstant('/c mklink {app}\bin\mysql\mysql{#MYSQL}\my.ini {app}\sphere\{#SPHERE}\my.ini'),
                   '', SW_HIDE, ewWaitUntilTerminated, CodErr);
              sleep(100);
            end;
        30: begin
              ProgressPage.SetText('30.'+ExpandConstant('{cm:Mess56}'), 'Config.inc.php');
              Exec(ExpandConstant('{cmd}'),
                   ExpandConstant('/c mklink {app}\apps\phpmyadmin{#PHPMYADMIN}\config.inc.php {app}\sphere\{#SPHERE}\config.inc.php'),
                   '', SW_HIDE, ewWaitUntilTerminated, CodErr);
              sleep(100);
            end;
        31: begin
              ProgressPage.SetText('31.'+ExpandConstant('{cm:Mess57}'), 'Alias');
              Exec(ExpandConstant('{cmd}'),
                   ExpandConstant('/c mklink /D {app}\alias {app}\sphere\{#SPHERE}\alias'),
                   '', SW_HIDE, ewWaitUntilTerminated, CodErr);
              sleep(100);
            end;
			

Ici, nous créons les liens symboliques par rapport au contenu du sous-répertoire de couleu 'rouge' dans le répertoire '/sphere'.


        //*--------------------------*
        //* Déplacement d'un fichier *
        //*--------------------------*

        32: begin
              ProgressPage.SetText('32.'+ExpandConstant('{cm:Mess58}'), 'WampManager.conf');
              RenameFile(ExpandConstant('{app}\wamp.ini'), ExpandConstant('{app}\menu\wampmanager.conf'));
              sleep(100);
            end;
        33: begin
              ProgressPage.SetText('33.'+ExpandConstant('{cm:Mess58}'), 'PhpSysInfo.ini');
              RenameFile(ExpandConstant('{app}\phpsysinfo.ini'), ExpandConstant('{app}\alias\phpsysinfo\phpsysinfo.ini'));
              sleep(100);
            end;
			

Nous déplaçons deux fichiers dans les bons répertoires :

flechele fichier 'Wamp.ini' créé dans la main '[Ini]' que nous renommons en 'WampManager.conf'.

flechele fichier 'PhpSysInfo.ini' qui manque dans cet utilitaire afin qu'il puisse fonctionner correctement.

        //*-----------------------*
        //* Création des Services *
        //*-----------------------*

        34: begin
              ProgressPage.SetText('34.'+ExpandConstant('{cm:Mess59}'), 'WampApache');
              Exec(ExpandConstant('{sys}\sc.exe'),
                   ExpandConstant('create "wampapache" start= "auto"
				   binPath= "{app}\bin\apache\apache{#APACHE}\bin\httpd.exe -k runservice" depend= "Tcpip/Afd"'),
                   '', SW_HIDE, ewWaitUntilTerminated, CodErr);
              sleep(100);
            end;
        35: begin
              ProgressPage.SetText('35.'+ExpandConstant('{cm:Mess59}'), 'WampMysqld');
              Exec(ExpandConstant('{sys}\sc.exe'),
                   ExpandConstant('create "wampmysqld" start= "auto"
				   binPath= "{app}\bin\mysql\mysql{#MYSQL}\bin\mysqld.exe wampmysqld"'),
                   '', SW_HIDE, ewWaitUntilTerminated, CodErr);
              sleep(100);
            end;
			

Nous créons les services 'wampapache' et 'wampmysqld'.

        36: begin
              ProgressPage.SetText('36.'+ExpandConstant('{cm:Mess60}'), '');
              sleep(100);
            end;
        end;
			

Et enfin, la finalisation se termine !

      end;
      finally;
        ProgressPage.Hide;
    end;
  end;

  //*----------------------------------------*
  //* Substitution des chaines de caractères *
  //*----------------------------------------*

  if CurStep = ssDone then
  begin
    AppDir := ExpandConstant('{app}');
    StringChangeEx(AppDir, '\', '/', True);

    ModifierChaine(AppDir,            '<repertoire>', '\scripts\parameters.php');

    ModifierChaine('{#APACHE}',       '<apache>',     '\scripts\wamp.php');
    ModifierChaine('{#PHP}',          '<php>',        '\scripts\wamp.php');
    ModifierChaine('{#PHP2}',         '<php2>',       '\scripts\wamp.php');
    ModifierChaine('{#MYSQL}',        '<mysql>',      '\scripts\wamp.php');
    ModifierChaine('{#PHPMYADMIN}',   '<phpmyadmin>', '\scripts\wamp.php');

    ModifierChaine(Browser.Values[0], '<browser>',    '\menu\wampmanager.conf');
    ModifierChaine(Notepad.Values[0], '<notepad>',    '\menu\wampmanager.conf');

    ModifierChaine(AppDir,            '<repertoire>', '\menu\wampmanager.ini');
    ModifierChaine(Browser.Values[0], '<browser>',    '\menu\wampmanager.ini');
    ModifierChaine(Notepad.Values[0], '<notepad>',    '\menu\wampmanager.ini');
    ModifierChaine('{#APACHE}',       '<apache>',     '\menu\wampmanager.ini');
    ModifierChaine('{#PHP}',          '<php>',        '\menu\wampmanager.ini');
    ModifierChaine('{#PHP2}',         '<php2>',       '\menu\wampmanager.ini');
    ModifierChaine('{#MYSQL}',        '<mysql>',      '\menu\wampmanager.ini');
    ModifierChaine('{#PHPMYADMIN}',   '<phpmyadmin>', '\menu\wampmanager.ini');

    ModifierChaine(AppDir,            '<repertoire>', '\sphere\{#SPHERE}\my.ini');
    ModifierChaine('{#MYSQL}',        '<mysql>',      '\sphere\{#SPHERE}\my.ini');

    ModifierChaine(AppDir,            '<repertoire>', '\sphere\{#SPHERE}\param.conf');
    ModifierChaine('{#APACHE}',       '<apache>',     '\sphere\{#SPHERE}\param.conf');
    ModifierChaine('{#PHPMYADMIN}',   '<phpmyadmin>', '\sphere\{#SPHERE}\param.conf');

    ModifierChaine(AppDir,            '<repertoire>', '\sphere\{#SPHERE}\php.ini');
    ModifierChaine(Smtp.Text,         '<smtp>',       '\sphere\{#SPHERE}\php.ini');
    ModifierChaine(Sendmail.Text,     '<sendmail>',   '\sphere\{#SPHERE}\php.ini');

    ModifierChaine(AppDir,            '<repertoire>', '\sphere\{#SPHERE}\alias\phpmyadmin.conf');
    ModifierChaine('{#PHPMYADMIN}',   '<phpmyadmin>', '\sphere\{#SPHERE}\alias\phpmyadmin.conf');

    ModifierChaine(AppDir,            '<repertoire>', '\sphere\{#SPHERE}\alias\phpsysinfo.conf');
    ModifierChaine('{#PHPSYSINFO}',   '<phpsysinfo>', '\sphere\{#SPHERE}\alias\phpsysinfo.conf');
  end;
end;
			

Et pour terminer, nous venons modifier dans plusieurs fichiers de type 'text', les noms des différentes versions que nous venons d'installer. Nous utilisons une balise, comme en HTML, pour identifier la chaine de caractères à substituer.

8) Troisième partie : les remarques !

Embarcadero Delphi, plus connu sous le nom de 'Delphi', implémente une version orientée objet du langage Pascal.

La plupart des fonctions utilisées sont ceux développées par et pour Inno Setup. Le téléchargement des fichiers 'zip' a nécessité l'ajout de 'Inno Download Plugin'.

8-A) La philosophie de ce setup !

À l'inverse du setup d'installation de la version officielle de WampServer, mon setup ne contient pas les composants Apache, Php, MySql et PhpMyAdmin. Il les télécharge directement sur les sites officiels. De cela, la volumétrie de mon setup est considérablement réduit, à peine 1,429 Mo contre environ 42,489 Mo.

J'ai aussi ajouté plusieurs vérifications, voire paragraphe suivant, que ne savait pas faire le setup de la version officielle.

8-B) Installation de WampServer !

Il y a quelques points importants que vous devez connaitre afin d'effectuer une bonne installation de WampServer :

flecheil faut être en mode administrateur.

flechele système d'exploitation windows doit être au minimum 'VISTA'. Pour Windows XP, vous devez installer WampServer version officielle.

flechel'installation nécessite environ 2 Go d'espace disque.

flechel'installation est assez longue, environ 1/4 d'heure.

flechele setup effectue les téléchargements à partir des sites officiels d'Apache, de Php, de MySql et de PhpMyAdmin.

flechevous avez la possibilité, dans le setup, d'installer la version 32 ou 64 bits.

flechel'installation ne doit pas s'effectuer sur une ancienne version. Il faut obligatoirement la désinstaller.

flechemême remarque pour le répertoire d'installation. Il devra être supprimé.

flecheWampServer nécessite 'Microsoft Visual C++ 2012 Redistributable' version 32 ou 64 bits. Il faut le ou les installer.

flecheAestan Tray Menu nécessite 'Microsoft Visual C++ 2008 Redistributable'. Normalement ce DLL est déjà présent dans Windows 7.

flechepour le bon fonctionnement de ce WampServer, vous devez installer qu'une seule version de WampServer.

flecheWampServer utilise les services 'WampApache' et 'WampMysqld'.

flechele setup modifie la variable d'environnement 'PATH' pour introduire le chemin vers '/php' et vers les extensions.

8-C) Démarrage de WampServer !

Cette version fonctionne dès que l'installation a été faite (plug and play). Elle nécessite juste le rédémarrage de l'ordinateur. Mais si vous rencontrez un quelconque problème, je vous conseille vivement de lire mon didacticiel sur l'installation et le paramétrage de WampServer.

9) Conclusion !

Si cela vous intéresse, vous pouvez télécharger le script de l'installation de WampServer.

Si vous avez des questions à me poser, je suis disponible sur le forum wampserver.