Skip to content

Commit 1b9b4dc

Browse files
committed
Merge pull request weecology#189 from ethanwhite/add-path-win
Windows installer now adds Retriever to path
2 parents 6ba4c73 + 9e01aca commit 1b9b4dc

File tree

2 files changed

+233
-0
lines changed

2 files changed

+233
-0
lines changed

modpath.iss

+219
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
// ----------------------------------------------------------------------------
2+
//
3+
// Inno Setup Ver: 5.4.2
4+
// Script Version: 1.4.2
5+
// Author: Jared Breland <[email protected]>
6+
// Homepage: http://www.legroom.net/software
7+
// License: GNU Lesser General Public License (LGPL), version 3
8+
// http://www.gnu.org/licenses/lgpl.html
9+
//
10+
// Script Function:
11+
// Allow modification of environmental path directly from Inno Setup installers
12+
//
13+
// Instructions:
14+
// Copy modpath.iss to the same directory as your setup script
15+
//
16+
// Add this statement to your [Setup] section
17+
// ChangesEnvironment=true
18+
//
19+
// Add this statement to your [Tasks] section
20+
// You can change the Description or Flags
21+
// You can change the Name, but it must match the ModPathName setting below
22+
// Name: modifypath; Description: &Add application directory to your environmental path; Flags: unchecked
23+
//
24+
// Add the following to the end of your [Code] section
25+
// ModPathName defines the name of the task defined above
26+
// ModPathType defines whether the 'user' or 'system' path will be modified;
27+
// this will default to user if anything other than system is set
28+
// setArrayLength must specify the total number of dirs to be added
29+
// Result[0] contains first directory, Result[1] contains second, etc.
30+
// const
31+
// ModPathName = 'modifypath';
32+
// ModPathType = 'user';
33+
//
34+
// function ModPathDir(): TArrayOfString;
35+
// begin
36+
// setArrayLength(Result, 1);
37+
// Result[0] := ExpandConstant('{app}');
38+
// end;
39+
// #include "modpath.iss"
40+
// ----------------------------------------------------------------------------
41+
42+
procedure ModPath();
43+
var
44+
oldpath: String;
45+
newpath: String;
46+
updatepath: Boolean;
47+
pathArr: TArrayOfString;
48+
aExecFile: String;
49+
aExecArr: TArrayOfString;
50+
i, d: Integer;
51+
pathdir: TArrayOfString;
52+
regroot: Integer;
53+
regpath: String;
54+
55+
begin
56+
// Get constants from main script and adjust behavior accordingly
57+
// ModPathType MUST be 'system' or 'user'; force 'user' if invalid
58+
if ModPathType = 'system' then begin
59+
regroot := HKEY_LOCAL_MACHINE;
60+
regpath := 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment';
61+
end else begin
62+
regroot := HKEY_CURRENT_USER;
63+
regpath := 'Environment';
64+
end;
65+
66+
// Get array of new directories and act on each individually
67+
pathdir := ModPathDir();
68+
for d := 0 to GetArrayLength(pathdir)-1 do begin
69+
updatepath := true;
70+
71+
// Modify WinNT path
72+
if UsingWinNT() = true then begin
73+
74+
// Get current path, split into an array
75+
RegQueryStringValue(regroot, regpath, 'Path', oldpath);
76+
oldpath := oldpath + ';';
77+
i := 0;
78+
79+
while (Pos(';', oldpath) > 0) do begin
80+
SetArrayLength(pathArr, i+1);
81+
pathArr[i] := Copy(oldpath, 0, Pos(';', oldpath)-1);
82+
oldpath := Copy(oldpath, Pos(';', oldpath)+1, Length(oldpath));
83+
i := i + 1;
84+
85+
// Check if current directory matches app dir
86+
if pathdir[d] = pathArr[i-1] then begin
87+
// if uninstalling, remove dir from path
88+
if IsUninstaller() = true then begin
89+
continue;
90+
// if installing, flag that dir already exists in path
91+
end else begin
92+
updatepath := false;
93+
end;
94+
end;
95+
96+
// Add current directory to new path
97+
if i = 1 then begin
98+
newpath := pathArr[i-1];
99+
end else begin
100+
newpath := newpath + ';' + pathArr[i-1];
101+
end;
102+
end;
103+
104+
// Append app dir to path if not already included
105+
if (IsUninstaller() = false) AND (updatepath = true) then
106+
newpath := newpath + ';' + pathdir[d];
107+
108+
// Write new path
109+
RegWriteStringValue(regroot, regpath, 'Path', newpath);
110+
111+
// Modify Win9x path
112+
end else begin
113+
114+
// Convert to shortened dirname
115+
pathdir[d] := GetShortName(pathdir[d]);
116+
117+
// If autoexec.bat exists, check if app dir already exists in path
118+
aExecFile := 'C:\AUTOEXEC.BAT';
119+
if FileExists(aExecFile) then begin
120+
LoadStringsFromFile(aExecFile, aExecArr);
121+
for i := 0 to GetArrayLength(aExecArr)-1 do begin
122+
if IsUninstaller() = false then begin
123+
// If app dir already exists while installing, skip add
124+
if (Pos(pathdir[d], aExecArr[i]) > 0) then
125+
updatepath := false;
126+
break;
127+
end else begin
128+
// If app dir exists and = what we originally set, then delete at uninstall
129+
if aExecArr[i] = 'SET PATH=%PATH%;' + pathdir[d] then
130+
aExecArr[i] := '';
131+
end;
132+
end;
133+
end;
134+
135+
// If app dir not found, or autoexec.bat didn't exist, then (create and) append to current path
136+
if (IsUninstaller() = false) AND (updatepath = true) then begin
137+
SaveStringToFile(aExecFile, #13#10 + 'SET PATH=%PATH%;' + pathdir[d], True);
138+
139+
// If uninstalling, write the full autoexec out
140+
end else begin
141+
SaveStringsToFile(aExecFile, aExecArr, False);
142+
end;
143+
end;
144+
end;
145+
end;
146+
147+
// Split a string into an array using passed delimeter
148+
procedure MPExplode(var Dest: TArrayOfString; Text: String; Separator: String);
149+
var
150+
i: Integer;
151+
begin
152+
i := 0;
153+
repeat
154+
SetArrayLength(Dest, i+1);
155+
if Pos(Separator,Text) > 0 then begin
156+
Dest[i] := Copy(Text, 1, Pos(Separator, Text)-1);
157+
Text := Copy(Text, Pos(Separator,Text) + Length(Separator), Length(Text));
158+
i := i + 1;
159+
end else begin
160+
Dest[i] := Text;
161+
Text := '';
162+
end;
163+
until Length(Text)=0;
164+
end;
165+
166+
167+
procedure CurStepChanged(CurStep: TSetupStep);
168+
var
169+
taskname: String;
170+
begin
171+
taskname := ModPathName;
172+
if CurStep = ssPostInstall then
173+
if IsTaskSelected(taskname) then
174+
ModPath();
175+
end;
176+
177+
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
178+
var
179+
aSelectedTasks: TArrayOfString;
180+
i: Integer;
181+
taskname: String;
182+
regpath: String;
183+
regstring: String;
184+
appid: String;
185+
begin
186+
// only run during actual uninstall
187+
if CurUninstallStep = usUninstall then begin
188+
// get list of selected tasks saved in registry at install time
189+
appid := '{#emit SetupSetting("AppId")}';
190+
if appid = '' then appid := '{#emit SetupSetting("AppName")}';
191+
regpath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\'+appid+'_is1');
192+
RegQueryStringValue(HKLM, regpath, 'Inno Setup: Selected Tasks', regstring);
193+
if regstring = '' then RegQueryStringValue(HKCU, regpath, 'Inno Setup: Selected Tasks', regstring);
194+
195+
// check each task; if matches modpath taskname, trigger patch removal
196+
if regstring <> '' then begin
197+
taskname := ModPathName;
198+
MPExplode(aSelectedTasks, regstring, ',');
199+
if GetArrayLength(aSelectedTasks) > 0 then begin
200+
for i := 0 to GetArrayLength(aSelectedTasks)-1 do begin
201+
if comparetext(aSelectedTasks[i], taskname) = 0 then
202+
ModPath();
203+
end;
204+
end;
205+
end;
206+
end;
207+
end;
208+
209+
function NeedRestart(): Boolean;
210+
var
211+
taskname: String;
212+
begin
213+
taskname := ModPathName;
214+
if IsTaskSelected(taskname) and not UsingWinNT() then begin
215+
Result := True;
216+
end else begin
217+
Result := False;
218+
end;
219+
end;

retriever_installer.iss

+14
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ DefaultGroupName=EcoData Retriever
1818
OutputBaseFilename=RetrieverSetup
1919
Compression=lzma
2020
SolidCompression=yes
21+
ChangesEnvironment=true
2122

2223
[Languages]
2324
Name: "english"; MessagesFile: "compiler:Default.isl"
2425

2526
[Tasks]
2627
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
28+
Name: modifypath; Description: Add application directory to your environmental path; Flags: checked
2729

2830
[Files]
2931
Source: "dist\retriever.exe"; DestDir: "{app}"; Flags: ignoreversion
@@ -35,5 +37,17 @@ Name: "{group}\EcoData Retriever"; Filename: "{app}\retriever.exe"
3537
Name: "{group}\{cm:UninstallProgram,EcoData Retriever}"; Filename: "{uninstallexe}"
3638
Name: "{commondesktop}\EcoData Retriever"; Filename: "{app}\retriever.exe"; Tasks: desktopicon
3739

40+
[Code]
41+
const
42+
ModPathName = 'modifypath';
43+
ModPathType = 'user';
44+
45+
function ModPathDir(): TArrayOfString;
46+
begin
47+
setArrayLength(Result, 1)
48+
Result[0] := ExpandConstant('{app}');
49+
end;
50+
#include "modpath.iss"
51+
3852
[Run]
3953
Filename: "{app}\retriever.exe"; Description: "{cm:LaunchProgram,EcoData Retriever}"; Flags: nowait postinstall skipifsilent

0 commit comments

Comments
 (0)