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
permet de redémarrer l'ordinateur à la fin de l'installation --> voir l'aide.
AppCopyright=Copyright© 2015 Artemus
c'est le copyright qui sera visible dans les propriétés du setup --> voir l'aide.
DirExistsWarning=no
permet de vérifier l'existence du répertoire d'installation --> voir l'aide.
MinVersion=6.0
lors 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
vous devez être administrateur pour procéder à l'installation --> voir l'aide.
ShowLanguageDialog=yes
on affiche la boîte de dialogue des langues -- voir l'aide.
Ainsi, au démarrage de l'installation, vous obtiendrez cette fenêtre :
VersionInfoVersion={#VERSION}.1
c'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
c'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 :
WizardSmallImageFile=Doc\Photo_2.bmp
c'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 :
#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 :
la version 32 bits qui sera toujours accessible.
la 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 :
32 Bits Complet Version
64 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 :
l'exécutable 'unzip.exe' pour décompresser les fichiers 'zip'.
le répertoire 'wamp' qui est notre répertoire d'installation.
et 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 :
une chaîne de caractères fixe comme la constante 'no' ou le langue 'french'.
le résultat d'une fonction, par exemple 'GetBrowser()'.
le contenu d'une directive provenant de la main '[Setup]', comme 'AppName' et 'AppVersion'.
et 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 :
le répertoire '/php/courant'.
le 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 :
la saisie des paramètres pour configurer le serveur mail.
la saisie du nom du navigateur. par défaut, c'est 'Google Chrome'.
la saisie de nom de l'éditeur de texte, c'est 'notepade++'.
l'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 :
httpd.conf pour Apache.
param.conf pour Apache.
php.ini pour Php.
my.ini pour MySql.
config.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 :
le fichier 'Wamp.ini' créé dans la main '[Ini]' que nous renommons en 'WampManager.conf'.
le 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.