root/branches/0_1_3/default.iss

Revision 123, 20.8 kB (checked in by sagrer, 1 year ago)
  1. Написана документация для релиза 0.1.0
  2. Добавлены екзамплы.
  3. Добавлен ChangeLog?
  4. Поправлен дефолтный инсталляционный скрипт - теперь будет показывать ChangeLog?.
  • Property svnmailer:content-charset set to cp1251
Line 
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;;               Это iss-скрипт по умолчанию             ;;
3 ;;               для скармливания IssBuilder.            ;;
4 ;;                                                       ;;
5 ;;              Copyright (C) 2007 Gipat Group           ;;
6 ;;              Распространяется на условиях             ;;
7 ;;                      LGPL v2.1                        ;;
8 ;;                                                       ;;
9 ;;                  www.gipatgroup.org                   ;;
10 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11
12 ;;К работе над данным файлом приложили руки, ноги.... короче аффтары:
13 ;; 1) Sagrer (sagrer@yandex.ru)
14
15 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
16
17 ;; Файл для сборки GGBuildTools
18
19 [Setup]
20 InternalCompressLevel=ultra
21 OutputBaseFilename=GGBuildTools_0_0_0_0
22 SolidCompression=true
23 Compression=lzma/ultra
24 OutputDir=.\
25 SourceDir=.\
26 VersionInfoVersion=0.0.0.0
27 VersionInfoTextVersion=GGBuildTools 0.0.0.0
28 VersionInfoCompany=Gipat Group
29 VersionInfoDescription=GGBuildTools 0.0.0.0
30 ShowLanguageDialog=no
31 AppName={code:ConstAppName}
32 AppVerName=GGBuildTools 1.0.1.40
33 DefaultDirName={code:ConstInstallPath}
34 UsePreviousAppDir=false
35 DefaultGroupName={code:ConstDeveloperName}\{code:ConstAppName}\
36 DisableStartupPrompt=true
37 FlatComponentsList=true
38 AppendDefaultDirName=false
39 UsePreviousSetupType=false
40 AppCopyright=Copyright © 2007 Gipat Group
41 RestartIfNeededByRun=false
42 WizardImageFile=compiler:wizmodernimage-is.bmp
43 WizardSmallImageFile=compiler:wizmodernsmallimage-is.bmp
44 VersionInfoCopyright=Copyright © 2007 Gipat Group
45 LicenseFile=GG_opened_EI-editor-utility_license.txt
46 InfoBeforeFile=ChangeLog.txt
47 [_ISTool]
48 UseAbsolutePaths=false
49 [Languages]
50 Name: Russian; MessagesFile: compiler:Languages\Russian.isl
51 Name: English; MessagesFile: compiler:Default.isl
52 [Components]
53 Name: CurrVersion_Main; Description: Основные файлы полной версии; Flags: fixed; Check: CheckDoNewInstall; Types: StandardInstall
54 Name: AlwaysInstall; Description: Обязательные файлы; Flags: fixed; Types: StandardInstall
55 [Icons]
56 Name: {group}\readme.txt; Filename: {app}\readme.txt; Components: CurrVersion_Main
57 Name: {group}\Деинсталлировать; Filename: {uninstallexe}; Components: CurrVersion_Main
58 [Types]
59 Name: StandardInstall; Description: Обыкновенная установка; Languages:
60 [Run]
61 Filename: {app}\Installer.exe; Parameters: -s; WorkingDir: {app}; StatusMsg: Running application's Installer.exe; Components: AlwaysInstall; Flags: runhidden
62 [Registry]
63 Root: HKCU; Subkey: Software\{code:ConstDeveloperName}\{code:ConstAppName}\; Flags: createvalueifdoesntexist uninsdeletekey; Components: AlwaysInstall
64 [Code]
65 const
66   AppName = 'GGBuildTools';   //Типа имя апликашона
67   AppVer = '0.0.0.0';
68   NoFullInstall = false;   //Запрет\разрешение полной установки
69   NoUpdate = true;       //Запрет\разрешение апдейта
70   UpdateFrom = '0.0.0.0;0.0.0.1';     //Версии, с которых можно обновлять.
71   DeveloperName = 'Gipat Group';    //Имя девелопера - часть пути в реестре.
72
73 var
74   InstallPath, CurrentVer : string;
75   DoNewInstall, DoUpdate : boolean;
76
77 Function Parse (Str, Separator : string; Var Parsed : string) : string;
78 var
79   I, StrLength : integer;
80 begin
81   //Функа для парсинга строк. Кривая, но как умею :(.
82   I := 0;
83   StrLength := Length(Str);
84   if StrLength > 0 then begin
85     Parsed := '';
86
87     repeat
88       I := I+1;
89       If Str[I] <> Separator then begin
90         //Если сепаратор не встретился - запомнить символ.
91         Parsed := Parsed+Str[I];
92       end;
93     until (I = StrLength) or (Str[I] = Separator);
94
95     Result := Str;
96     Delete(Result,1,I);
97   end
98   else begin
99     Parsed := Str;
100     Result := '';
101   end;
102 end;
103
104 Function IsNumericStr (Str : string) : boolean;
105 var
106   I, StrLength : integer;
107   FindedChar : boolean;
108 begin
109   //А эта функа должна определять, состоит ли строка только из цифр.
110
111   Result := true;  //Умолчальный результат.
112
113   StrLength := Length(Str);
114   If StrLength > 0 then begin
115     //Если в строке чета есть то можно приступать.
116     For I := 1 to StrLength do begin
117       FindedChar := true;
118       If Str[I] = '1' then FindedChar := false;  //Достаточно выполнится 1 проверке - и чар будет не найден :)
119       If Str[I] = '2' then FindedChar := false;
120       If Str[I] = '3' then FindedChar := false;
121       If Str[I] = '4' then FindedChar := false;
122       If Str[I] = '5' then FindedChar := false;
123       If Str[I] = '6' then FindedChar := false;
124       If Str[I] = '7' then FindedChar := false;
125       If Str[I] = '8' then FindedChar := false;
126       If Str[I] = '9' then FindedChar := false;
127       If Str[I] = '0' then FindedChar := false;
128
129       //И если был обнаружен символ-не цифра - обломить все нафиг.
130       If FindedChar = true then Result := false;
131     end;
132   end
133   else begin
134     Result := false;  //Типа строка пустая.
135   end;
136 end;
137
138 Function IsVersionStr (Str : string) : boolean;
139 var
140   I, StrLength : integer;
141   FindedChar, WasPoint : boolean;
142 begin
143   //А эта функа должна определять, состоит ли строка только из цифр.
144
145   Result := true;  //Умолчальный результат.
146
147   StrLength := Length(Str);
148   If StrLength > 0 then begin
149     //Если в строке чета есть то можно приступать.
150     WasPoint := false;
151     For I := 1 to StrLength do begin
152       FindedChar := true;
153       If Str[I] = '1' then begin
154         FindedChar := false;
155         WasPoint := false;
156       end;
157       If Str[I] = '2' then begin
158         FindedChar := false;
159         WasPoint := false;
160       end;
161       If Str[I] = '3' then begin
162         FindedChar := false;
163         WasPoint := false;
164       end;
165       If Str[I] = '4' then begin
166         FindedChar := false;
167         WasPoint := false;
168       end;
169       If Str[I] = '5' then begin
170         FindedChar := false;
171         WasPoint := false;
172       end;
173       If Str[I] = '6' then begin
174         FindedChar := false;
175         WasPoint := false;
176       end;
177       If Str[I] = '7' then begin
178         FindedChar := false;
179         WasPoint := false;
180       end;
181       If Str[I] = '8' then begin
182         FindedChar := false;
183         WasPoint := false;
184       end;
185       If Str[I] = '9' then begin
186         FindedChar := false;
187         WasPoint := false;
188       end;
189       If Str[I] = '0' then begin
190         FindedChar := false;
191         WasPoint := false;
192       end;
193       If Str[I] = '.' then begin
194         FindedChar := false;
195         If WasPoint = true then begin
196           //Если до этого уже была точка - то аблооом.
197           FindedChar := true;
198         end;
199         WasPoint := true;
200       end;
201
202       //И если был обнаружен символ-не цифра и не точка - обломить все нафиг.
203       If FindedChar = true then Result := false;
204     end;
205   end
206   else begin
207     Result := false;  //Типа строка пустая.
208   end;
209 end;
210
211 Function IsNewVersion(InstalledVer, CurrentVer : string) : boolean;
212 var
213   CurrVerLevels, I,
214   InstalledVerLevels, MaxLevel : integer;
215   TempStr, TempStr2,
216   InstalledVerTemp, CurrentVerTemp : string;
217 begin
218   //Функа должна проверять, является ли ентот инсталл более новой версией.
219
220   Result := false;  //Типа умолчальное значение.
221   InstalledVerTemp := InstalledVer;
222   CurrentVerTemp := CurrentVer;
223
224
225   If (IsVersionStr(InstalledVer) = true) and (IsVersionStr(CurrentVer) = true) then begin
226     //Только если в обоих строках - версии.
227
228     //Для начала - посмотреть сколько уровней версии в текущей версии.
229     TempStr := CurrentVerTemp;
230     CurrVerLevels := 1;  //Есть как минимум 1 уровень.
231     repeat
232       If Pos('.',TempStr) <> 0 then begin
233         CurrVerLevels := CurrVerLevels + 1;   //Есть минимум еще 1 уровень.
234         TempStr := Parse(TempStr,'.',TempStr2);
235       end;
236     until Pos('.',TempStr) = 0;
237
238     //И в проинсталенной.
239     TempStr := InstalledVerTemp;
240     InstalledVerLevels := 1;  //Есть как минимум 1 уровень.
241     repeat
242       If Pos('.',TempStr) <> 0 then begin
243         InstalledVerLevels := InstalledVerLevels + 1;   //Есть минимум еще 1 уровень.
244         TempStr := Parse(TempStr,'.',TempStr2);
245       end;
246     until Pos('.',TempStr) = 0;
247
248     //Теперь вычислить максимальный уровень.
249     If CurrVerLevels > InstalledVerLevels then begin
250       MaxLevel := CurrVerLevels;
251     end
252     else begin
253       MaxLevel := InstalledVerLevels;
254     end;
255
256     //Теперь - к той версии что самая малоуровневая - добавить нулей.
257     If CurrVerLevels < MaxLevel then begin
258       For I := 1 to MaxLevel - CurrVerLevels do begin
259         CurrentVerTemp := CurrentVerTemp+'.0';
260       end;
261     end;
262     If InstalledVerLevels < MaxLevel then begin
263       For I := 1 to MaxLevel - InstalledVerLevels do begin
264         InstalledVerTemp := InstalledVerTemp+'.0';
265       end;
266     end;
267
268     //Ну а теперь - собсно сравнение наконецто.
269     I := 0;
270     repeat
271       I := I+1;
272       InstalledVerTemp := Parse(InstalledVerTemp,'.',TempStr);
273       CurrentVerTemp := Parse(CurrentVerTemp,'.',TempStr2);
274       If StrToInt(TempStr2) > StrToInt(TempStr) then Result := true;
275     until (I = MaxLevel) or (Result = true);
276   end;
277 end;
278
279 Function VersionIsUpdatable(Version : string) : boolean;
280 //Проверить - есть ли эта версия в списке версий пригодных для обновления
281 var
282   ParsedStr, CheckableVer : string;
283 begin
284   //Инициализация
285   Result := false;
286
287   //Собсно проверяем.
288   ParsedStr := UpdateFrom;
289   repeat
290     ParsedStr := Parse(ParsedStr,';',CheckableVer);
291     if CheckableVer <> '' then begin
292       if CheckableVer = Version then begin
293         //Ага, нашли, есть оно в списке.
294         Result := true;
295       end;
296     end;
297   until (ParsedStr = '') or (Result = true);
298
299 end;
300
301 Function InitializeSetup() : boolean;
302 var
303   AllOk, TempBool : boolean;
304   TempStr, TempVersionsStr, CheckableVer : string;
305   ResultCode : integer;
306
307 begin
308   //Ну типа, скрипт! :))))
309   //MsgBox('Старт установки',mbError,MB_OK);
310
311   AllOk := true;  //Типа индикатор того что все в порядке.
312
313   DoNewInstall := false;
314   DoUpdate := false;
315   CurrentVer := '';
316
317   //Есть ли запись в реестре?
318   If RegValueExists(HKEY_CURRENT_USER,'Software\'+DeveloperName+'\'+AppName,'ver') = true then begin
319     //Если уже стоит какая-то версия
320     //Смотрим - не та же самая ли эта версия которая в пакете?
321     //Получить номер текущей версии.
322     RegQueryStringValue(HKEY_CURRENT_USER,'Software\'+DeveloperName+'\'+AppName,'ver',TempStr);
323     if TempStr = AppVer then begin
324       //Та же версия. Спрашиваем у юзверя - продолжать ли установку?
325       if MsgBox('Версия, содержащаяся в данном пакете ('+AppVer+') судя по всему уже установлена. Если вы продолжите установку - то по-видимому потребуется деинсталлировать уже установленную версию. Продолжить установку?',mbConfirmation,MB_YESNO) = IDNO then begin
326         //Юзверь отказался продолжать установку.
327         AllOk := false;
328       end;
329     end;
330
331     If (NoUpdate = false) and (AllOk = true) then begin
332       //Если апдейт разрешен
333
334       //И проверить - входит ли эта версия в список апдейтабельных версий.
335       TempVersionsStr := UpdateFrom;
336       TempBool := false;    //Индикатор - подходит ли версия для апдейта.
337       repeat
338         TempVersionsStr := Parse(TempVersionsStr,';',CheckableVer);
339         if CheckableVer <> '' then begin
340           if CheckableVer = TempStr then begin
341             //Подходит.
342             TempBool := true;
343           end;
344         end;
345       until (TempVersionsStr = '') or (TempBool = true);
346
347       if TempBool = true then begin
348         //Если подходит - разрешаем апдейт.
349         DoUpdate := true;  //Разрешить апдейт.
350         RegQueryStringValue(HKEY_CURRENT_USER,'Software\'+DeveloperName+'\'+AppName,'path',TempStr);
351         InstallPath := TempStr;
352         CurrentVer := CheckableVer;
353       end
354       else begin
355         //Версия апдейту не подлежит. Можно разве что предварительно запустить деинсталлер уже установленной
356         //версии. Это будет сделано ниже.
357       end;
358     end
359     else begin
360       //Уже стоит какая-то версия, но апдейт запрещен.
361       //В таком случае, опять же, будет предложено запустить деинсталляцию после чего
362       //продолжить по сценарию новой установки.
363     end;
364   end;
365
366   //Нужен ли сценарий полной установки?
367   If (AllOk = true) and ((RegValueExists(HKEY_CURRENT_USER,'Software\'+DeveloperName+'\'+AppName,'ver') = false) or (DoUpdate = false)) and (NoFullInstall = false) then begin
368     //Вроде нужно.
369     DoNewInstall := true;
370     //Посмотрим - нужно ли избавиться от старой версии проги?
371     if RegValueExists(HKEY_CURRENT_USER,'Software\'+DeveloperName+'\'+AppName,'ver') = true then begin
372       //О как. Запись в реестре есть, а апдейт оказывается не запущен. Значит установленная версия апдейту
373       //не подлежит. Тут все зависит от того, существует ли директория с прогой на венте, а также
374       //есть ли там экзейник деинсталлёра. Для начала проверим наличие директории с прогой.
375       RegQueryStringValue(HKEY_CURRENT_USER,'Software\'+DeveloperName+'\'+AppName,'path',TempStr);
376       If DirExists(TempStr) = true then begin
377         //О как. Есть такое дело.
378         //Теперь попробуем нарыть в реестре путь к деинсталлеру.
379         TempStr := '';
380         if RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+AppName+'_is1','UninstallString') = true then begin
381           //Выдернуть путь из реестра.
382           RegQueryStringValue(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+AppName+'_is1','UninstallString',TempStr);
383           //Если нужно - убрать '"' по краям.
384           TempStr := RemoveQuotes(TempStr);
385         end;
386         //Собсно проверяем - существует ли экзейник деинсталлера.
387         if FileExists(TempStr) = true then begin
388           //Файлег существует и надо предложить его запустить.
389           if MsgBox('Обнаружена уже установленная версия. Чтобы установить данную версию - надо деинсталлировать уже установленную. Деинсталлятор обнаружен. Запустить деинсталлятор?',mbConfirmation,MB_YESNO) = IDYES then begin
390             //Усе ок, юзверь запустил деинсталляцию.
391             Exec(TempStr,'','',SW_SHOW,ewWaitUntilTerminated,ResultCode);
392             //И "поспать" 5 секунд чтобы файлеги успели удалиться.
393             Sleep(5000);
394             //Если файлик деинсталлера до сих пор на месте - вывести окошк с кнопкой чтоб юзверь сам нажмал на него
395             //когда деинсталл завершится. Ибо там всякое бывает, отследить момент реального завершения деинсталла сложно.
396             if FileExists(TempStr) = true then begin
397               MsgBox('По завершению деинсталляции - нажмите кнопку ОК. НЕ НАЖИМАЙТЕ кнопку Ок до завершения деинсталляции!!!',mbError,MB_OK);
398             end;
399             //Деинсталл завершена Проверить, так ли это...
400             if FileExists(TempStr) = false then begin
401               //Можно запускать нормальную установку. Оставляем все как есть, оно само пойдет по стандартному
402               //сценарию.
403             end
404             else begin
405               MsgBox('Деинсталляция не выполнена по неизвестной причине. Выполните деинсталляцию вручную, либо вручную удалите каталог '+ExtractFilePath(TempStr)+' после чего запустите эту установку заново.',mbError,MB_OK);
406               DoNewInstall := false;
407             end;
408           end
409           else begin
410             //Юзверь отказался выполнять деинсталляцию.
411             //Отмена установки.
412             MsgBox('Деинсталляция не выполнена. Выполните деинсталляцию вручную, либо вручную удалите каталог '+ExtractFilePath(TempStr)+' после чего запустите эту установку заново.',mbError,MB_OK);
413             DoNewInstall := false;
414           end;
415         end
416         else begin
417           //Файлега не существует, таким образом остается только спросить у юзверя - продолжать ли
418           //установку невзирая на возможные глюканы.
419           //Надо еще выдрать каталог с прогой.
420           RegQueryStringValue(HKEY_CURRENT_USER,'Software\'+DeveloperName+'\'+AppName,'path',TempStr);
421           if MsgBox('Обнаружена уже установленная версия, но деинсталлятор отсутствует. Рекомендуется прекратить установку и вручную удалить каталог '+TempStr+' после чего запустить эту установку заново. Но вы все-же можете и продолжить процесс установки (это может привести к ошибкам). Продолжить установку?',mbConfirmation,MB_YESNO) = IDYES then begin
422             //Юзверь таки решил продолжать установку... Не делаем ничего - оно дальше пойдет по нормальному сценарию.
423           end
424           else begin
425             //Юзверь отменил установку.
426             DoNewInstall := false;
427           end;
428         end;
429       end
430       else begin
431         //Нету проги на венте. А это значит что запись в реестре - по-видимому не более чем запись в реестре,
432         //а значит можно безболезненно действовать по обычному сценарию для новой установки.
433       end;
434     end;
435
436     //Запуск установки по стандартному сценарию.
437     If DoNewInstall = true then begin
438       //Получить путь для инсталляции.
439       if RegValueExists(HKEY_CURRENT_USER,'Software\'+DeveloperName+'\'+AppName,'path') = true then begin
440         //Если в реестре сохранилась запись о пути - воспользуемся ей.
441         RegQueryStringValue(HKEY_CURRENT_USER,'Software\'+DeveloperName+'\'+AppName,'path',InstallPath);
442       end
443       else begin
444         //Не удалось добыть такой информации - кидаем в ProgramFiles.
445         InstallPath := AddBackslash(ExpandConstant('{pf}'))+'\'+DeveloperName+'\'+AppName;
446       end;
447       DoNewInstall:= true;
448     end
449     else begin
450       //По пути был какой-то облом.
451       AllOk := false;
452     end;
453   end
454   else begin
455     //Нельзя ставиться с нуля. В принципе. Если апдейт не запущен - значит инсталлер не нашел такую версию,
456     //которую он может обновить.
457     if (DoUpdate = false) and (AllOk = true) then begin
458       MsgBox('Инсталлятору не удалось найти на компьютере версий, которые он мог бы обновить. О том, какие версии в принципе могут быть обновлены - см. по имени файла пакета. Данный пакет не предназначен для установки с нуля, им можно только обновить одну из определенных уже установленных версий - поэтому установка отменена.',mbError,MB_OK);
459       AllOk := false;
460     end;
461   end;
462
463   If AllOk = true then begin
464     //Можно начинать установку.
465     Result := true;
466   end
467   else begin
468     //Облом с установкой. Вот так вот :(.
469     //MsgBox('Установка отменена :(',mbError,MB_OK);
470     Result := false;
471   end;
472 end;
473
474
475 Function ConstInstallPath(Default : string) : string;
476 begin
477   Result := InstallPath;
478 end;
479
480 Function ConstAppVer(Default : string) : string;
481 begin
482   Result := AppVer;
483 end;
484
485 Function ConstAppName(Default : string) : string;
486 begin
487   Result := AppName;
488 end;
489
490 Function ConstUninstallExe(Default : string) : string;
491 begin
492   Result := '';
493   if RegValueExists(HKEY_LOCAL_MACHINE,'\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'+AppName+'_is1','UninstallString') = true then begin
494     RegQueryStringValue(HKEY_LOCAL_MACHINE,'\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'+AppName+'_is1','UninstallString',Result);
495     Result := RemoveQuotes(Result);
496   end;
497 end;
498
499 Function ConstAppVerName(Default : string) : string;
500 begin
501   Result := AppName+' '+AppVer;
502 end;
503
504 Function ConstDeveloperName(Default : string) : string;
505 begin
506   Result := DeveloperName;
507 end;
508
509 Function CheckDoNewInstall() : boolean;
510 begin
511   Result := DoNewInstall;
512 end;
513
514 Function CheckDoUpdate() : boolean;
515 begin
516   Result := DoUpdate;
517 end;
518
519 //Function CheckUpdate_0_0_0_1() : boolean;
520 ////Функция-екзампл - по которой будет собсно проверяться - запускать ли апдейт именно с этой версии.
521 //begin
522 //  Result := VersionIsUpdatable('0.0.0.1');
523 //end;
524
525 Function ShouldSkipPage(CurPage: Integer) : boolean;
526 begin
527   //Разные пропуски разных "страниц".
528   Result := false;
529   //MsgBox(IntToStr(CurPage),mbError,MB_OK);
530   If DoUpdate = true then begin
531     //MsgBox('It is update!',mbError,MB_OK);
532     //Если это апдейт
533     If CurPage = 2 then begin
534       //Если это страница лицензии - то показывать не нужно - оно было принято при прошлой установке.
535       Result := true;
536     end;
537     If CurPage = 6 then begin
538       //Если это страница выбора пути.
539       If DirExists(InstallPath) = true then begin
540         //Если папка уже существует
541         //То можно окно выбора пути не показывать.
542         Result := true;
543       end;
544     end;
545     If CurPage = 7 then begin
546       //Если это страница выбора типа установки - он в этом случае всегда "обновление".
547       Result := true;
548     end;
549     If CurPage = 8 then begin
550       //Если это страница выбора папки в меню Пуск
551       Result := true;
552     end;
553   end;
554   If DoNewInstall = true then begin
555     //Если это новая установка.
556     If CurPage = 7 then begin
557       //Если это страница выбора типа установки - он в этом случае всегда "полная".
558       Result := true;
559     end;
560   end;
561 end;
562
563 [UninstallRun]
564 Filename: {app}\UnInstaller.exe; Parameters: -s; WorkingDir: {app}; StatusMsg: Running application's Installer.exe; Components: AlwaysInstall; Flags: runhidden
Note: See TracBrowser for help on using the browser.