Bonjour,
Après plusieurs jours de recherche et n'arrivant pas à faire fonctionner les différentes solutions trouvées, je m'adresse à vous.
J'ai deux problèmes avec Inno Setup, pour créer un installer d'une application VB.Net. Je ne souhaite pas utiliser la méthode de publication de Visual Studio qui ne fonctionne pas comme je le souhaite dans mon cas.
1er problème : Installation du Framework 4.
Avec le code ci-dessous, j'arrive bien à installer le .NET Framework 4 et à détecter si le Framework est déjà installé, malheureusement je n'arrive pas à combiner ces 2 techniques. la méthode InitializeSetup me renvoie bien la bonne valeur, mais je ne sais pas comment l'exploiter dans la partie [Run]. Je ne sais pas comment récupérer la valeur de retour d'une fonction.
L'installation du .NET Framework étant (assez) longue, j'aimerais éviter de devoir la faire à chaque fois, comme actuellement.
J'aurais aussi aimé savoir la progression de l'installation, mais je n'ai pas trouvé avec la version 4.
2nd problème : Exécution conditionnelle.
Ayant une application multilingue, je souhaiterais réutiliser le choix de la langue à l'installation pour lancer mon application directement dans la bonne langue. J'ai pour cela rajouté un argument à mon exécutable (FR/EN/DE), mais comment savoir quelle langue à été choisie au début de l'installation ?
Voici un extrait de mon script ISS
Version ISS utilisée : 5.4.2 (a)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 [...] [Languages] Name: english; MessagesFile: compiler:Default.isl Name: french; MessagesFile: compiler:Languages\French.isl Name: german; MessagesFile: compiler:Languages\German.isl [...] [Run] ;#define res {code:IsDotNetDetected|'v4\Full', 0} ;#if res == true ;Filename: {tmp}\dotNetFx40_Full_setup.exe; WorkingDir: {tmp}; StatusMsg: Installation en cours de .NET Framework 4.0, cette opération peut prendre quelques minutes... ;#endif ;#if french Filename: {app}\Mon_Appli.exe; Parameters: "FR"; Description: {cm:LaunchProgram,Mon_Appli}; Flags: nowait postinstall skipifsilent ;#elseif english ;Filename: {app}\Mon_Appli.exe; Parameters: "EN"; Description: {cm:LaunchProgram,Mon_Appli}; Flags: nowait postinstall skipifsilent ;#elseif german ;Filename: {app}\Mon_Appli.exe; Description: {cm:LaunchProgram,Mon_Appli}; Flags: nowait postinstall skipifsilent ;#endif [Code ; ] supprimé à cause de la balise code function IsDotNetDetected(version: string; service: cardinal): boolean; // Indicates whether the specified version and service pack of the .NET Framework is installed. // // version -- Specify one of these strings for the required .NET Framework version: // 'v1.1.4322' .NET Framework 1.1 // 'v2.0.50727' .NET Framework 2.0 // 'v3.0' .NET Framework 3.0 // 'v3.5' .NET Framework 3.5 // 'v4\Client' .NET Framework 4.0 Client Profile // 'v4\Full' .NET Framework 4.0 Full Installation // // service -- Specify any non-negative integer for the required service pack level: // 0 No service packs required // 1, 2, etc. Service pack 1, 2, etc. required var key: string; install, serviceCount: cardinal; success: boolean; begin key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + version; // .NET 3.0 uses value InstallSuccess in subkey Setup if Pos('v3.0', version) = 1 then begin success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install); end else begin success := RegQueryDWordValue(HKLM, key, 'Install', install); end; // .NET 4.0 uses value Servicing instead of SP if Pos('v4', version) = 1 then begin success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount); end else begin success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount); end; result := success and (install = 1) and (serviceCount >= service); end; function InitializeSetup(): Boolean; begin if not IsDotNetDetected('v4\Full', 0) then begin result := false; end else result := true; end;
Merci d'avance,
Mathieu
1er problème résolu. Il suffisait de rajouter un Check
J'ai rajouté la fonction verifDotNet car je n'ai pas trouvé comment passer le paramètre de IsDotNetDetected depuis le script.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 [Run] Filename: {tmp}\dotNetFx40_Full_x86_x64.exe; Parameters: "/q"; WorkingDir: {tmp}; StatusMsg: Installation en cours de .NET Framework 4.0, cette opération peut prendre quelques minutes...; Check: NOT verifDotNet [Code ] function verifDotNet(): Boolean; begin result := IsDotNetDetected('v4\Full', 0); end;
Plus que mon problème d'exécution en fonction de la langue d'installation.
2ème problème résolu. Même type de solution que pour mon 1er problème, suffisait de rajouter une instruction sur ma ligne de lancement :
Plus qu'un "problème" secondaire : la progression de l'install du Framework.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 [Run] Filename: {app}\Mon_Appli.exe; Parameters: "FR"; Description: {cm:LaunchProgram,Mon_Appli}; Flags: nowait postinstall skipifsilent; Languages: french Filename: {app}\Mon_Appli.exe; Parameters: "EN"; Description: {cm:LaunchProgram,Mon_Appli}; Flags: nowait postinstall skipifsilent; Languages: english Filename: {app}\Mon_Appli.exe; Parameters: "DE"; Description: {cm:LaunchProgram,Mon_Appli}; Flags: nowait postinstall skipifsilent; Languages: german
Voilà, solutions trouvées tout seul après près de 2 semaines, mais en se penchant dessus sérieusement on trouve plus vite, faut juste trouver le temps. En espérant que ça puisse servir à d'autres.
Je vous laisse mon script en pièce jointe (renommé en .txt pour l'up).
@+
Mathieu
Partager