Переглянути джерело

Merge pull request #1 from jrsoftware/main

Getting changes from origin
Jens Brand 5 роки тому
батько
коміт
7375e5c942
100 змінених файлів з 5708 додано та 1906 видалено
  1. 1 1
      .github/FUNDING.yml
  2. 8 8
      CONTRIBUTING.md
  3. 32 29
      Components/NewTabSet.pas
  4. 11 176
      Components/ScintStylerInnoSetup.pas
  5. 1 1
      Components/UniPs
  6. 2 0
      Examples/AllPagesExample.iss
  7. 2 1
      Examples/CodeAutomation.iss
  8. 2 2
      Examples/CodeAutomation2.iss
  9. 13 10
      Examples/CodeClasses.iss
  10. 63 0
      Examples/CodeDownloadFiles.iss
  11. 1 1
      Examples/ISPPExample1.iss
  12. BIN
      Examples/MyDll.dll
  13. BIN
      Examples/MyProg-ARM64.exe
  14. BIN
      Examples/MyProg-x64.exe
  15. BIN
      Examples/MyProg.exe
  16. 2 3
      Files/.gitignore
  17. 24 4
      Files/Default.isl
  18. 56 117
      Files/ISPPBuiltins.iss
  19. 31 5
      Files/Languages/Catalan.isl
  20. 43 21
      Files/Languages/Corsican.isl
  21. 25 5
      Files/Languages/Danish.isl
  22. 23 3
      Files/Languages/Dutch.isl
  23. 26 5
      Files/Languages/French.isl
  24. 41 41
      Files/Languages/German.isl
  25. 30 7
      Files/Languages/Hebrew.isl
  26. 28 5
      Files/Languages/Icelandic.isl
  27. 25 5
      Files/Languages/Italian.isl
  28. 23 3
      Files/Languages/Japanese.isl
  29. 28 5
      Files/Languages/Norwegian.isl
  30. 43 24
      Files/Languages/Polish.isl
  31. 23 3
      Files/Languages/Portuguese.isl
  32. 27 4
      Files/Languages/Russian.isl
  33. 23 5
      Files/Languages/Slovenian.isl
  34. 30 5
      Files/Languages/Spanish.isl
  35. 26 6
      Files/Languages/Turkish.isl
  36. 106 103
      Files/Languages/Unofficial/Croatian.isl
  37. 364 0
      Files/Languages/Unofficial/Georgian.isl
  38. 0 317
      Files/Languages/Unofficial/Georgian.islu
  39. 6 3
      Files/Languages/Unofficial/Greek.isl
  40. 5 5
      Files/Languages/Unofficial/Hungarian.isl
  41. 36 15
      Files/Languages/Unofficial/Lithuanian.isl
  42. 34 8
      Files/Languages/Unofficial/SerbianCyrillic.isl
  43. 42 14
      Files/Languages/Unofficial/SerbianLatin.isl
  44. BIN
      Files/isbunzip.dll
  45. BIN
      Files/isbzip.dll
  46. BIN
      Files/islzma.dll
  47. BIN
      Files/islzma32.exe
  48. BIN
      Files/islzma64.exe
  49. BIN
      Files/isscint.dll
  50. BIN
      Files/isunzlib.dll
  51. BIN
      Files/iszlib.dll
  52. 2 4
      ISHelp/Staging/contents.js
  53. 3 5
      ISHelp/Staging/topic.js
  54. 3 0
      ISHelp/compile.bat
  55. 79 57
      ISHelp/isetup.xml
  56. 1 1
      ISHelp/isxclasses.header2
  57. 11 2
      ISHelp/isxclasses.pas
  58. 282 100
      ISHelp/isxfunc.xml
  59. 2 4
      ISHelp/isxfunc.xsl
  60. 1 1
      Projects/CompFileAssoc.pas
  61. 17 8
      Projects/CompForm.dfm
  62. 149 58
      Projects/CompForm.pas
  63. 62 0
      Projects/CompInputQueryCombo.dfm
  64. 86 0
      Projects/CompInputQueryCombo.pas
  65. 725 0
      Projects/CompMessageBoxDesigner.dfm
  66. 1259 0
      Projects/CompMessageBoxDesigner.pas
  67. 5 2
      Projects/CompMsgs.pas
  68. 18 12
      Projects/CompResUpdate.pas
  69. 3 6
      Projects/CompSignTools.pas
  70. 225 3
      Projects/CompStartup.dfm
  71. 18 7
      Projects/CompStartup.pas
  72. 3 1
      Projects/Compil32.dpr
  73. 6 0
      Projects/Compil32.dproj
  74. BIN
      Projects/Compil32.res
  75. 72 212
      Projects/Compile.pas
  76. 288 0
      Projects/DotNet.pas
  77. 34 13
      Projects/ISCC.dpr
  78. BIN
      Projects/ISCC.res
  79. BIN
      Projects/ISCmplr.res
  80. 1 1
      Projects/ISPP/Help/Staging/contents-template.htm
  81. 2 4
      Projects/ISPP/Help/Staging/contents.js
  82. 3 5
      Projects/ISPP/Help/Staging/topic.js
  83. 6 0
      Projects/ISPP/Help/compile.bat
  84. 242 78
      Projects/ISPP/Help/ispp.xml
  85. 7 6
      Projects/ISPP/Help/ispp.xsl
  86. 6 1
      Projects/ISPP/IsppBase.pas
  87. 147 23
      Projects/ISPP/IsppFuncs.pas
  88. 9 4
      Projects/ISPP/IsppIdentMan.pas
  89. 8 4
      Projects/ISPP/IsppIntf.pas
  90. 15 10
      Projects/ISPP/IsppParser.pas
  91. 10 10
      Projects/ISPP/IsppTranslate.pas
  92. 8 4
      Projects/ISPP/IsppVarUtils.pas
  93. 28 3
      Projects/InstFnc2.pas
  94. 61 6
      Projects/InstFunc.pas
  95. 358 62
      Projects/Install.pas
  96. 32 0
      Projects/LangOptionsSectionDirectives.pas
  97. 0 170
      Projects/LibFusion.pas
  98. 66 46
      Projects/Main.pas
  99. 21 3
      Projects/MsgIDs.pas
  100. 18 0
      Projects/ScriptClasses_C.pas

+ 1 - 1
.github/FUNDING.yml

@@ -1 +1 @@
-custom: ['http://www.jrsoftware.org/isdonate.php']
+custom: ['https://jrsoftware.org/isdonate.php']

+ 8 - 8
CONTRIBUTING.md

@@ -1,14 +1,14 @@
 Inno Setup
 ==========
 
-Copyright (C) 1997-2018 Jordan Russell. All rights reserved.  
-Portions Copyright (C) 2000-2018 Martijn Laan. All rights reserved.  
+Copyright (C) 1997-2020 Jordan Russell. All rights reserved.  
+Portions Copyright (C) 2000-2020 Martijn Laan. All rights reserved.  
 For conditions of distribution and use, see LICENSE.TXT.
 
 Contributing issues
 -------------------
 
-To report bugs or request new features use the [newsgroups](http://www.jrsoftware.org/newsgroups.php) (web-based interface available).
+To report bugs or request new features use the [forum](https://jrsoftware.org/forums.php).
 
 Contributing new code or documentation updates
 ----------------------------------------------
@@ -17,14 +17,14 @@ To contribute new code or documentation updates to Inno Setup clone your own
 fork instead of cloning the main Inno Setup repository, commit your work on topic
 branches and make pull requests. In detail:
 
-1. [Fork](http://help.github.com/fork-a-repo/) the project.
+1. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the project.
 
 2. Clone your fork (`git clone https://github.com/<your-username>/issrc.git`).
 
 3. Add an `upstream` remote (`git remote add upstream
    https://github.com/jrsoftware/issrc.git`).
 
-4. Get the latest changes from upstream (e.g. `git pull upstream master`).
+4. Get the latest changes from upstream (e.g. `git pull upstream main`).
 
 5. Create a new topic branch to contain your feature, change, or fix (`git
    checkout -b <topic-branch-name>`).
@@ -41,7 +41,7 @@ branches and make pull requests. In detail:
 8. Push your topic branch up to your fork (`git push origin
    <topic-branch-name>`).
 
-9. [Open a Pull Request](http://help.github.com/send-pull-requests/) with a
+9. [Open a Pull Request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests) with a
     clear title and description. Please include your name and email address if
 	  you are contributing a translation.
 
@@ -49,12 +49,12 @@ branches and make pull requests. In detail:
 
 If you don't have the Git client (`git`), get it from:
 
-http://git-scm.com/
+https://git-scm.com/
 
 Contributing translations
 -------------------------
 
-To contribute translations please see http://jrsoftware.org/files/istrans/send.php.
+To contribute translations please see https://jrsoftware.org/files/istrans/send.php.
 
 Please do NOT use GitHub's web editor to edit ANSI translations and create pull
 requests. This editor doesn't work since it automatically turns ANSI files into

+ 32 - 29
Components/NewTabSet.pas

@@ -2,22 +2,22 @@ unit NewTabSet;
 
 {
   Inno Setup
-  Copyright (C) 1997-2018 Jordan Russell
+  Copyright (C) 1997-2020 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
-  TNewTabSet - modern VS-style tabs
+  TNewTabSet - modern VS-style tabs with theme support
 }
 
 interface
 
 uses
-  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms;
+  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, ModernColors;
 
 type
   TNewTabSet = class(TCustomControl)
   private
-    FFlat: Boolean;
+    FTheme: TTheme;
     FTabs: TStrings;
     FTabIndex: Integer;
     function GetTabRect(Index: Integer): TRect;
@@ -25,6 +25,7 @@ type
     procedure ListChanged(Sender: TObject);
     procedure SetTabs(Value: TStrings);
     procedure SetTabIndex(Value: Integer);
+    procedure SetTheme(Value: TTheme);
   protected
     procedure CreateParams(var Params: TCreateParams); override;
     procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
@@ -32,9 +33,9 @@ type
   public
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
+    property Theme: TTheme read FTheme write SetTheme;
   published
     property Align;
-    property Flat: Boolean read FFlat write FFlat default True;
     property Font;
     property ParentFont;
     property TabIndex: Integer read FTabIndex write SetTabIndex;
@@ -132,7 +133,6 @@ begin
   FTabs := TStringList.Create;
   TStringList(FTabs).OnChange := ListChanged;
   ControlStyle := ControlStyle + [csOpaque];
-  FFlat := True;
   Width := 129;
   Height := 21;
 end;
@@ -215,23 +215,24 @@ var
       R := GetTabRect(I);
       if SelectedTab and (FTabIndex = I) then begin
         Dec(R.Right, TabSpacing);
-        Canvas.Brush.Color := clBtnFace;
+        if FTheme <> nil then
+          Canvas.Brush.Color := FTheme.Colors[tcBack]
+        else
+          Canvas.Brush.Color := clBtnFace;
         Canvas.FillRect(R);
-        if not FFlat then begin
-          Canvas.Pen.Color := clBtnHighlight;
-          Canvas.MoveTo(R.Left, R.Top);
-          Canvas.LineTo(R.Left, R.Bottom-1);
-          Canvas.Pen.Color := clBtnText;
-          Canvas.LineTo(R.Right-1, R.Bottom-1);
-          Canvas.LineTo(R.Right-1, R.Top-1);
-        end;
-        Canvas.Font.Color := clBtnText;
+        
+        if FTheme <> nil then
+          Canvas.Font.Color := FTheme.Colors[tcFore]
+        else
+          Canvas.Font.Color := clBtnText;
         Canvas.TextOut(R.Left + TabPaddingX, R.Top + TabPaddingY, FTabs[I]);
         ExcludeClipRect(Canvas.Handle, R.Left, R.Top, R.Right, R.Bottom);
         Break;
       end;
       if not SelectedTab and (FTabIndex <> I) then begin
-        if HighColorMode and (ColorToRGB(clBtnFace) <> clBlack) then
+        if FTheme <> nil then
+          Canvas.Font.Color := FTheme.Colors[tcMarginFore]
+        else if HighColorMode and (ColorToRGB(clBtnFace) <> clBlack) then
           Canvas.Font.Color := LightenColor(ColorToRGB(clBtnShadow), -43)
         else begin
           { If the button face color is black, or if running in low color mode,
@@ -239,14 +240,6 @@ var
           Canvas.Font.Color := clBtnHighlight;
         end;
         Canvas.TextOut(R.Left + TabPaddingX, R.Top + TabPaddingY, FTabs[I]);
-        if not FFlat then begin
-          if HighColorMode then
-            Canvas.Pen.Color := clBtnShadow
-          else
-            Canvas.Pen.Color := clBtnFace;
-          Canvas.MoveTo(R.Right, R.Top+3);
-          Canvas.LineTo(R.Right, R.Bottom-2);
-        end;
       end;
     end;
   end;
@@ -272,15 +265,17 @@ begin
   DrawTabs(True);
 
   { Top line }
-  if FFlat then
-    Canvas.Pen.Color := clBtnFace
+  if FTheme <> nil then
+    Canvas.Pen.Color := FTheme.Colors[tcBack]
   else
-    Canvas.Pen.Color := clBtnText;
+    Canvas.Pen.Color := clBtnFace;
   Canvas.MoveTo(0, 0);
   Canvas.LineTo(CR.Right, 0);
 
   { Background fill }
-  if HighColorMode then
+  if FTheme <> nil then
+    Canvas.Brush.Color := FTheme.Colors[tcMarginBack]
+  else if HighColorMode then
     Canvas.Brush.Color := LightenColor(ColorToRGB(clBtnFace), 35)
   else
     Canvas.Brush.Color := clBtnShadow;
@@ -306,4 +301,12 @@ begin
   FTabs.Assign(Value);
 end;
 
+procedure TNewTabSet.SetTheme(Value: TTheme);
+begin
+  if FTheme <> Value then begin
+    FTheme := Value;
+    Invalidate;
+  end;
+end;
+
 end.

+ 11 - 176
Components/ScintStylerInnoSetup.pas

@@ -2,11 +2,13 @@ unit ScintStylerInnoSetup;
 
 {
   Inno Setup
-  Copyright (C) 1997-2019 Jordan Russell
+  Copyright (C) 1997-2020 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
   TInnoSetupStyler: styler for Inno Setup scripts
+  
+  Requires LangOptions+SetupSectionDirectives and MsgIDs from the Inno Setup source code
 }
 
 interface
@@ -101,7 +103,7 @@ type
 implementation
 
 uses
-  TypInfo;
+  TypInfo, MsgIDs, SetupSectionDirectives, LangOptionsSectionDirectives;
 
 type
   TInnoSetupStylerLineState = record
@@ -110,178 +112,6 @@ type
     OpenCompilerDirectivesCount: ShortInt;
   end;
 
-  TSetupSectionDirective = (
-    ssAllowCancelDuringInstall,
-    ssAllowNetworkDrive,
-    ssAllowNoIcons,
-    ssAllowRootDirectory,
-    ssAllowUNCPath,
-    ssAlwaysRestart,
-    ssAlwaysShowComponentsList,
-    ssAlwaysShowDirOnReadyPage,
-    ssAlwaysShowGroupOnReadyPage,
-    ssAlwaysUsePersonalGroup,
-    ssAppCopyright,
-    ssAppendDefaultDirName,
-    ssAppendDefaultGroupName,
-    ssAppComments,
-    ssAppContact,
-    ssAppId,
-    ssAppModifyPath,
-    ssAppMutex,
-    ssAppName,
-    ssAppPublisher,
-    ssAppPublisherURL,
-    ssAppReadmeFile,
-    ssAppSupportPhone,
-    ssAppSupportURL,
-    ssAppUpdatesURL,
-    ssAppVerName,
-    ssAppVersion,
-    ssArchitecturesAllowed,
-    ssArchitecturesInstallIn64BitMode,
-    ssASLRCompatible,
-    ssBackColor,
-    ssBackColor2,
-    ssBackColorDirection,
-    ssBackSolid,
-    ssChangesAssociations,
-    ssChangesEnvironment,
-    ssCloseApplications,
-    ssCloseApplicationsFilter,
-    ssCompression,
-    ssCompressionThreads,
-    ssCreateAppDir,
-    ssCreateUninstallRegKey,
-    ssDefaultDialogFontName,
-    ssDefaultDirName,
-    ssDefaultGroupName,
-    ssDefaultUserInfoName,
-    ssDefaultUserInfoOrg,
-    ssDefaultUserInfoSerial,
-    ssDEPCompatible,
-    ssDirExistsWarning,
-    ssDisableDirPage,
-    ssDisableFinishedPage,
-    ssDisableProgramGroupPage,
-    ssDisableReadyMemo,
-    ssDisableReadyPage,
-    ssDisableStartupPrompt,
-    ssDisableWelcomePage,
-    ssDiskClusterSize,
-    ssDiskSliceSize,
-    ssDiskSpanning,
-    ssDontMergeDuplicateFiles,
-    ssEnableDirDoesntExistWarning,
-    ssEncryption,
-    ssExtraDiskSpaceRequired,
-    ssFlatComponentsList,
-    ssInfoAfterFile,
-    ssInfoBeforeFile,
-    ssInternalCompressLevel,
-    ssLanguageDetectionMethod,
-    ssLicenseFile,
-    ssLZMAAlgorithm,
-    ssLZMABlockSize,
-    ssLZMADictionarySize,
-    ssLZMAMatchFinder,
-    ssLZMANumBlockThreads,
-    ssLZMANumFastBytes,
-    ssLZMAUseSeparateProcess,
-    ssMergeDuplicateFiles,
-    ssMessagesFile,
-    ssMinVersion,
-    ssOnlyBelowVersion,
-    ssOutput,
-    ssOutputBaseFilename,
-    ssOutputDir,
-    ssOutputManifestFile,
-    ssPassword,
-    ssPrivilegesRequired,
-    ssPrivilegesRequiredOverridesAllowed,
-    ssReserveBytes,
-    ssRestartApplications,
-    ssRestartIfNeededByRun,
-    ssSetupIconFile,
-    ssSetupLogging,
-    ssSetupMutex,
-    ssShowComponentSizes,
-    ssShowLanguageDialog,
-    ssShowTasksTreeLines,
-    ssShowUndisplayableLanguages,
-    ssSignedUninstaller,
-    ssSignedUninstallerDir,
-    ssSignTool,
-    ssSignToolMinimumTimeBetween,
-    ssSignToolRetryCount,
-    ssSignToolRetryDelay,
-    ssSignToolRunMinimized,
-    ssSlicesPerDisk,
-    ssSolidCompression,
-    ssSourceDir,
-    ssTerminalServicesAware,
-    ssTimeStampRounding,
-    ssTimeStampsInUTC,
-    ssTouchDate,
-    ssTouchTime,
-    ssUpdateUninstallLogAppName,
-    ssUninstallable,
-    ssUninstallDisplayIcon,
-    ssUninstallDisplayName,
-    ssUninstallDisplaySize,
-    ssUninstallFilesDir,
-    ssUninstallIconFile,
-    ssUninstallLogMode,
-    ssUninstallRestartComputer,
-    ssUninstallStyle,
-    ssUsedUserAreasWarning,
-    ssUsePreviousAppDir,
-    ssUsePreviousGroup,
-    ssUsePreviousLanguage,
-    ssUsePreviousPrivileges,
-    ssUsePreviousSetupType,
-    ssUsePreviousTasks,
-    ssUsePreviousUserInfo,
-    ssUseSetupLdr,
-    ssUserInfoPage,
-    ssVersionInfoCompany,
-    ssVersionInfoCopyright,
-    ssVersionInfoDescription,
-    ssVersionInfoOriginalFileName,
-    ssVersionInfoProductName,
-    ssVersionInfoProductVersion,
-    ssVersionInfoProductTextVersion,
-    ssVersionInfoTextVersion,
-    ssVersionInfoVersion,
-    ssWindowResizable,
-    ssWindowShowCaption,
-    ssWindowStartMaximized,
-    ssWindowVisible,
-    ssWizardImageAlphaFormat,
-    ssWizardImageBackColor,
-    ssWizardImageFile,
-    ssWizardImageStretch,
-    ssWizardResizable,
-    ssWizardSmallImageBackColor,
-    ssWizardSmallImageFile,
-    ssWizardSizePercent,
-    ssWizardStyle);
-
-  TLangOptionsSectionDirective = (
-    lsCopyrightFontName,
-    lsCopyrightFontSize,
-    lsDialogFontName,
-    lsDialogFontSize,
-    lsDialogFontStandardHeight,
-    lsLanguageCodePage,
-    lsLanguageID,
-    lsLanguageName,
-    lsRightToLeft,
-    lsTitleFontName,
-    lsTitleFontSize,
-    lsWelcomeFontName,
-    lsWelcomeFontSize);
-
 const
   ComponentsSectionParameters: array[0..8] of TInnoSetupStylerParamInfo = (
     (Name: 'Check'),
@@ -341,9 +171,10 @@ const
     (Name: 'StrongAssemblyName'),
     (Name: 'Tasks'));
 
-  IconsSectionParameters: array[0..17] of TInnoSetupStylerParamInfo = (
+  IconsSectionParameters: array[0..18] of TInnoSetupStylerParamInfo = (
     (Name: 'AfterInstall'),
     (Name: 'AppUserModelID'),
+    (Name: 'AppUserModelToastActivatorCLSID'),
     (Name: 'BeforeInstall'),
     (Name: 'Check'),
     (Name: 'Comment'),
@@ -1205,8 +1036,12 @@ begin
   end;
 
   case Section of
+    scCustomMessages:
+      I := 0;
     scLangOptions:
       I := GetEnumValue(TypeInfo(TLangOptionsSectionDirective), 'ls' + S);
+    scMessages:
+      I := GetEnumValue(TypeInfo(TSetupMessageID), 'msg' + S);
     scSetup:
       I := GetEnumValue(TypeInfo(TSetupSectionDirective), 'ss' + S);
   else
@@ -1215,7 +1050,7 @@ begin
   if I <> -1 then
     CommitStyle(stKeyword)
   else begin
-    if Section in [scLangOptions, scSetup] then
+    if Section in [scLangOptions, scMessages, scSetup] then
       CommitStyleSqPending(stDefault)
     else
       CommitStyle(stDefault);

+ 1 - 1
Components/UniPs

@@ -1 +1 @@
-Subproject commit 1f846a56c81997b5cafe20d8dbd2234a88314a63
+Subproject commit d48b2cb5e9dadffe80f1bc8f13f33b9579ecc402

+ 2 - 0
Examples/AllPagesExample.iss

@@ -85,6 +85,8 @@ begin
 
   OutputProgressWizardPage := CreateOutputProgressPage('CreateOutputProgressPage', 'ADescription');
   OutputProgressWizardPageAfterID := AfterID;
+
+  { See CodeDownloadFiles.iss for a CreateDownloadPage example }
 end;
 
 function NextButtonClick(CurPageID: Integer): Boolean;

+ 2 - 1
Examples/CodeAutomation.iss

@@ -279,7 +279,7 @@ end;
 
 procedure CreateButton(ALeft, ATop: Integer; ACaption: String; ANotifyEvent: TNotifyEvent);
 begin
-  with TButton.Create(WizardForm) do begin
+  with TNewButton.Create(WizardForm) do begin
     Left := ALeft;
     Top := ATop;
     Width := WizardForm.CancelButton.Width;
@@ -300,6 +300,7 @@ begin
   Top := WizardForm.WelcomeLabel2.Top + WizardForm.WelcomeLabel2.Height - 4*TopInc;
 
   CreateButton(Left, Top, '&SQLDMO...', @SQLDMOButtonOnClick);
+  Top := Top + TopInc;
   CreateButton(Left + LeftInc, Top, '&Firewall...', @FirewallButtonOnClick);
   Top := Top + TopInc;
   CreateButton(Left, Top, '&IIS...', @IISButtonOnClick);

+ 2 - 2
Examples/CodeAutomation2.iss

@@ -82,7 +82,7 @@ begin
   PF := IPersistFile(Obj);
   OleCheck(PF.Save(ExpandConstant('{autodesktop}\CodeAutomation2 Test.lnk'), True));
 
-  MsgBox('Saved a shortcut named ''CodeAutomation2 Test'' on the common desktop.', mbInformation, mb_Ok);
+  MsgBox('Saved a shortcut named ''CodeAutomation2 Test'' on the desktop.', mbInformation, mb_Ok);
 end;
 
 {--- ITaskScheduler ---}
@@ -267,7 +267,7 @@ end;
 
 procedure CreateButton(ALeft, ATop: Integer; ACaption: String; ANotifyEvent: TNotifyEvent);
 begin
-  with TButton.Create(WizardForm) do begin
+  with TNewButton.Create(WizardForm) do begin
     Left := ALeft;
     Top := ATop;
     Width := (WizardForm.CancelButton.Width*3)/2;

+ 13 - 10
Examples/CodeClasses.iss

@@ -37,6 +37,7 @@ var
   Form: TSetupForm;
   Edit: TNewEdit;
   OKButton, CancelButton: TNewButton;
+  W: Integer;
 begin
   Form := CreateCustomForm();
   try
@@ -55,26 +56,28 @@ begin
 
     OKButton := TNewButton.Create(Form);
     OKButton.Parent := Form;
+    OKButton.Caption := 'OK';
     OKButton.Left := Form.ClientWidth - ScaleX(75 + 6 + 75 + 10);
     OKButton.Top := Form.ClientHeight - ScaleY(23 + 10);
-    OKButton.Width := ScaleX(75);
     OKButton.Height := ScaleY(23);
     OKButton.Anchors := [akRight, akBottom]
-    OKButton.Caption := 'OK';
     OKButton.ModalResult := mrOk;
     OKButton.Default := True;
 
     CancelButton := TNewButton.Create(Form);
     CancelButton.Parent := Form;
+    CancelButton.Caption := 'Cancel';
     CancelButton.Left := Form.ClientWidth - ScaleX(75 + 10);
     CancelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
-    CancelButton.Width := ScaleX(75);
     CancelButton.Height := ScaleY(23);
     CancelButton.Anchors := [akRight, akBottom]
-    CancelButton.Caption := 'Cancel';
     CancelButton.ModalResult := mrCancel;
     CancelButton.Cancel := True;
 
+    W := Form.CalculateButtonWidth([OKButton.Caption, CancelButton.Caption]);
+    OKButton.Width := W;
+    CancelButton.Width := W;
+
     Form.ActiveControl := Edit;
     { Keep the form from sizing vertically since we don't have any controls which can size vertically }
     Form.KeepSizeY := True;
@@ -126,9 +129,9 @@ begin
   Page := CreateCustomPage(wpWelcome, 'Custom wizard page controls', 'TButton and others');
 
   Button := TNewButton.Create(Page);
-  Button.Width := ScaleX(75);
-  Button.Height := ScaleY(23);
   Button.Caption := 'TNewButton';
+  Button.Width := WizardForm.CalculateButtonWidth([Button.Caption]);
+  Button.Height := ScaleY(23);
   Button.OnClick := @ButtonOnClick;
   Button.Parent := Page.Surface;
 
@@ -176,21 +179,21 @@ begin
   Memo.Parent := Page.Surface;
 
   FormButton := TNewButton.Create(Page);
+  FormButton.Caption := 'TSetupForm';
   FormButton.Top := Memo.Top + Memo.Height + ScaleY(8);
-  FormButton.Width := ScaleX(75);
+  FormButton.Width := WizardForm.CalculateButtonWidth([FormButton.Caption]);
   FormButton.Height := ScaleY(23);
   FormButton.Anchors := [akLeft, akBottom];
-  FormButton.Caption := 'TSetupForm';
   FormButton.OnClick := @FormButtonOnClick;
   FormButton.Parent := Page.Surface;
 
   TaskDialogButton := TNewButton.Create(Page);
+  TaskDialogButton.Caption := 'TaskDialogMsgBox';
   TaskDialogButton.Top := FormButton.Top;
   TaskDialogButton.Left := FormButton.Left + FormButton.Width + ScaleX(8);
-  TaskDialogButton.Width := ScaleX(110);
+  TaskDialogButton.Width := WizardForm.CalculateButtonWidth([TaskDialogButton.Caption]);
   TaskDialogButton.Height := ScaleY(23);
   TaskDialogButton.Anchors := [akLeft, akBottom];
-  TaskDialogButton.Caption := 'TaskDialogMsgBox';
   TaskDialogButton.OnClick := @TaskDialogButtonOnClick;
   TaskDialogButton.Parent := Page.Surface;
 

+ 63 - 0
Examples/CodeDownloadFiles.iss

@@ -0,0 +1,63 @@
+; -- CodeDownloadFiles.iss --
+;
+; This script shows how the CreateDownloadPage support function can be used to
+; download temporary files while showing the download progress to the user.
+
+[Setup]
+AppName=My Program
+AppVersion=1.5
+WizardStyle=modern
+DefaultDirName={autopf}\My Program
+DefaultGroupName=My Program
+UninstallDisplayIcon={app}\MyProg.exe
+OutputDir=userdocs:Inno Setup Examples Output
+
+[Files]
+; Place any regular files here
+Source: "MyProg.exe"; DestDir: "{app}";
+Source: "MyProg.chm"; DestDir: "{app}";
+Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme;
+; These files will be downloaded
+Source: "{tmp}\innosetup-latest.exe"; DestDir: "{app}"; Flags: external
+Source: "{tmp}\ISCrypt.dll"; DestDir: "{app}"; Flags: external
+
+[Icons]
+Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
+
+[Code]
+var
+  DownloadPage: TDownloadWizardPage;
+
+function OnDownloadProgress(const Url, FileName: String; const Progress, ProgressMax: Int64): Boolean;
+begin
+  if Progress = ProgressMax then
+    Log(Format('Successfully downloaded file to {tmp}: %s', [FileName]));
+  Result := True;
+end;
+
+procedure InitializeWizard;
+begin
+  DownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), @OnDownloadProgress);
+end;
+
+function NextButtonClick(CurPageID: Integer): Boolean;
+begin
+  if CurPageID = wpReady then begin
+    DownloadPage.Clear;
+    DownloadPage.Add('https://jrsoftware.org/download.php/is.exe', 'innosetup-latest.exe', '');
+    DownloadPage.Add('https://jrsoftware.org/download.php/iscrypt.dll', 'ISCrypt.dll', '2f6294f9aa09f59a574b5dcd33be54e16b39377984f3d5658cda44950fa0f8fc');
+    DownloadPage.Show;
+    try
+      try
+        DownloadPage.Download;
+        Result := True;
+      except
+        SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbCriticalError, MB_OK, IDOK);
+        Result := False;
+      end;
+    finally
+      DownloadPage.Hide;
+    end;
+  end else
+    Result := True;
+end;

+ 1 - 1
Examples/ISPPExample1.iss

@@ -16,7 +16,7 @@
   #define AppName "My Program"
 #endif
 
-#define AppVersion GetFileVersion(AddBackslash(SourcePath) + "MyProg.exe")
+#define AppVersion GetVersionNumbersString(AddBackslash(SourcePath) + "MyProg.exe")
 
 [Setup]
 AppName={#AppName}

BIN
Examples/MyDll.dll


BIN
Examples/MyProg-ARM64.exe


BIN
Examples/MyProg-x64.exe


BIN
Examples/MyProg.exe


+ 2 - 3
Files/.gitignore

@@ -1,6 +1,5 @@
-*.hlp
-*.cnt
-*.gid
+*.chm
+*.chw
 *.e32
 *.dll
 *.exe

+ 24 - 4
Files/Default.isl

@@ -1,7 +1,7 @@
-; *** Inno Setup version 6.0.3+ English messages ***
+; *** Inno Setup version 6.1.0+ English messages ***
 ;
 ; To download user-contributed translations of this file, go to:
-;   http://www.jrsoftware.org/files/istrans/
+;   https://jrsoftware.org/files/istrans/
 ;
 ; Note: When translating this text, do not add periods (.) to the end of
 ; messages that didn't have them already, because on those messages Inno
@@ -210,6 +210,18 @@ ReadyMemoComponents=Selected components:
 ReadyMemoGroup=Start Menu folder:
 ReadyMemoTasks=Additional tasks:
 
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Downloading additional files...
+ButtonStopDownload=&Stop download
+StopDownload=Are you sure you want to stop the download?
+ErrorDownloadAborted=Download aborted
+ErrorDownloadFailed=Download failed: %1 %2
+ErrorDownloadSizeFailed=Getting size failed: %1 %2
+ErrorFileHash1=File hash failed: %1
+ErrorFileHash2=Invalid file hash: expected %1, found %2
+ErrorProgress=Invalid progress: %1 of %2
+ErrorFileSize=Invalid file size: expected %1, found %2
+
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Preparing to Install
 PreparingDesc=Setup is preparing to install [name] on your computer.
@@ -292,8 +304,16 @@ ExistingFileReadOnly2=The existing file could not be replaced because it is mark
 ExistingFileReadOnlyRetry=&Remove the read-only attribute and try again
 ExistingFileReadOnlyKeepExisting=&Keep the existing file
 ErrorReadingExistingDest=An error occurred while trying to read the existing file:
-FileExists=The file already exists.%n%nWould you like Setup to overwrite it?
-ExistingFileNewer=The existing file is newer than the one Setup is trying to install. It is recommended that you keep the existing file.%n%nDo you want to keep the existing file?
+FileExistsSelectAction=Select action
+FileExists2=The file already exists.
+FileExistsOverwriteExisting=&Overwrite the existing file
+FileExistsKeepExisting=&Keep the existing file
+FileExistsOverwriteOrKeepAll=&Do this for the next conflicts
+ExistingFileNewerSelectAction=Select action
+ExistingFileNewer2=The existing file is newer than the one Setup is trying to install.
+ExistingFileNewerOverwriteExisting=&Overwrite the existing file
+ExistingFileNewerKeepExisting=&Keep the existing file (recommended)
+ExistingFileNewerOverwriteOrKeepAll=&Do this for the next conflicts
 ErrorChangingAttr=An error occurred while trying to change the attributes of the existing file:
 ErrorCreatingTemp=An error occurred while trying to create a file in the destination directory:
 ErrorReadingSource=An error occurred while trying to read the source file:

+ 56 - 117
Files/ISPPBuiltins.iss

@@ -1,11 +1,11 @@
-; BEGIN ISPPBUILTINS.ISS
-//
 // Inno Setup Preprocessor
 //
 // Inno Setup (C) 1997-2020 Jordan Russell. All Rights Reserved.
 // Portions Copyright (C) 2000-2020 Martijn Laan. All Rights Reserved.
 // Portions Copyright (C) 2001-2004 Alex Yackimoff. All Rights Reserved.
 //
+// See the ISPP help file for more documentation of the functions defined by this file
+//
 #if defined(ISPP_INVOKED) && !defined(_BUILTINS_ISS_)
 //
 #if PREPROCVER < 0x01000000
@@ -14,21 +14,7 @@
 //
 #define _BUILTINS_ISS_
 //
-// ===========================================================================
-//
-// Default states for options.
-//
-//#pragma parseroption -b+ ; short circuit boolean evaluation: on
-//#pragma parseroption -m- ; short circuit multiplication evaluation (0 * A will not eval A): off
-//#pragma parseroption -p+ ; string literals without escape sequences: on
-//#pragma parseroption -u- ; allow undeclared identifiers: off
-//#pragma option -c+       ; pass script to the compiler: on
-//#pragma option -e-       ; emit empty lines to translation: off
-//#pragma option -v-       ; verbose mode: off
-//
-// ---------------------------------------------------------------------------
-//
-// Verbose levels:
+// Verbose levels: 
 // 0 - #include and #file acknowledgements
 // 1 - information about any temp files created by #file
 // 2 - #insert and #append acknowledgements
@@ -61,8 +47,8 @@
 #define Yes                True
 #define No								 False
 //
-#define MaxInt             0x7FFFFFFFL
-#define MinInt             0x80000000L
+#define MaxInt             0x7FFFFFFFFFFFFFFFL
+#define MinInt             0x8000000000000000L
 //
 #define NULL
 #define void
@@ -168,20 +154,13 @@
 #define GetFileOriginalFilename(str FileName) GetStringFileInfo(FileName, ORIGINAL_FILENAME)
 #define GetFileProductVersion(str FileName) GetStringFileInfo(FileName, PRODUCT_VERSION)
 //
-// ParseVersion
-//
-// Macro internally calls GetFileVersion function and parses string returned
-// by that function (in form "0.0.0.0"). All four version elements are stored
-// in by-reference parameters Major, Minor, Rev, and Build. Macro returns
-// string returned by GetFileVersion.
-//
 #define DeleteToFirstPeriod(str *S) \
   Local[1] = Copy(S, 1, (Local[0] = Pos(".", S)) - 1), \
   S = Copy(S, Local[0] + 1), \
   Local[1]
 //
-#define ParseVersion(str FileName, *Major, *Minor, *Rev, *Build) \
-  Local[1]  = Local[0] = GetFileVersion(FileName), \
+#define GetVersionComponents(str FileName, *Major, *Minor, *Rev, *Build) \
+  Local[1]  = Local[0] = GetVersionNumbersString(FileName), \
   Local[1] == "" ? "" : ( \
     Major   = Int(DeleteToFirstPeriod(Local[1])), \
     Minor   = Int(DeleteToFirstPeriod(Local[1])), \
@@ -189,42 +168,53 @@
     Build   = Int(Local[1]), \
   Local[0])
 //
-// EncodeVer
+#define GetPackedVersion(str FileName, *Version) \
+  Local[0] = GetVersionComponents(FileName, Local[1], Local[2], Local[3], Local[4]), \
+  Version = PackVersionComponents(Local[1], Local[2], Local[3], Local[4]), \
+  Local[0]
 //
-// Encodes given four version elements to a 32 bit integer number (8 bits for
-// each element, i.e. elements must be within 0...255 range).
+#define GetVersionNumbers(str FileName, *MS, *LS) \
+  Local[0] = GetPackedVersion(FileName, Local[1]), \
+  UnpackVersionNumbers(Local[1], MS, LS), \
+  Local[0]
 //
-#define EncodeVer(int Major, int Minor, int Revision = 0, int Build = -1) \
-  Major << 24 | (Minor & 0xFF) << 16 | (Revision & 0xFF) << 8 | (Build >= 0 ? Build & 0xFF : 0)
+#define PackVersionNumbers(int VersionMS, int VersionLS) \
+  VersionMS << 32 | (VersionLS & 0xFFFFFFFF)
+//
+#define PackVersionComponents(int Major, int Minor, int Rev, int Build) \
+  Major << 48 | (Minor & 0xFFFF) << 32 | (Rev & 0xFFFF) << 16 | (Build & 0xFFFF)
+//
+#define UnpackVersionNumbers(int Version, *VersionMS, *VersionLS) \
+  VersionMS = Version >> 32, \
+  VersionLS = Version & 0xFFFFFFFF, \
+  void
 //
-// DecodeVer
+#define UnpackVersionComponents(int Version, *Major, *Minor, *Rev, *Build) \
+  Major = Version >> 48, \
+  Minor = (Version >> 32) & 0xFFFF, \
+  Rev   = (Version >> 16) & 0xFFFF, \
+  Build = Version & 0xFFFF, \
+  void
 //
-// Decodes given 32 bit integer encoded version to its string representation,
-// Digits parameter indicates how many elements to show (if the fourth element
-// is 0, it won't be shown anyway).
+#define VersionToStr(int Version) \
+  Str(Version >> 48 & 0xFFFF) + "." + Str(Version >> 32 & 0xFFFF) + "." + \
+  Str(Version >> 16 & 0xFFFF) + "." + Str(Version & 0xFFFF)
 //
-#define DecodeVer(int Ver, int Digits = 3) \
-  Str(Ver >> 0x18 & 0xFF) + (Digits > 1 ? "." : "") + \
+#define EncodeVer(int Major, int Minor, int Revision = 0, int Build = -1) \
+  (Major & 0xFF) << 24 | (Minor & 0xFF) << 16 | (Revision & 0xFF) << 8 | (Build >= 0 ? Build & 0xFF : 0)
+//
+#define DecodeVer(int Version, int Digits = 3) \
+  Str(Version >> 24 & 0xFF) + (Digits > 1 ? "." : "") + \
   (Digits > 1 ? \
-    Str(Ver >> 0x10 & 0xFF) + (Digits > 2 ? "." : "") : "") + \
+    Str(Version >> 16 & 0xFF) + (Digits > 2 ? "." : "") : "") + \
   (Digits > 2 ? \
-    Str(Ver >> 0x08 & 0xFF) + (Digits > 3 && (Local = Ver & 0xFF) ? "." : "") : "") + \
+    Str(Version >> 8 & 0xFF) + (Digits > 3 && (Local = Version & 0xFF) ? "." : "") : "") + \
   (Digits > 3 && Local ? \
-    Str(Ver & 0xFF) : "")
-//
-// FindSection
-//
-// Returns index of the line following the header of the section. This macro
-// is intended to be used with #insert directive.
+    Str(Version & 0xFF) : "")
 //
 #define FindSection(str Section = "Files") \
   Find(0, "[" + Section + "]", FIND_MATCH | FIND_TRIM) + 1
 //
-// FindSectionEnd
-//
-// Returns index of the line following last entry of the section. This macro
-// is intended to be used with #insert directive.
-//
 #if VER >= 0x03000000
 # define FindNextSection(int Line) \
     Find(Line, "[", FIND_BEGINS | FIND_TRIM, "]", FIND_ENDS | FIND_AND)
@@ -235,22 +225,11 @@
     FindSection(Section) + EntryCount(Section)
 #endif
 //
-// FindCode
-//
-// Returns index of the line (of translation) following either [Code] section
-// header, or "program" keyword, if any.
-//
 #define FindCode() \
     Local[1] = FindSection("Code"), \
     Local[0] = Find(Local[1] - 1, "program", FIND_BEGINS, ";", FIND_ENDS | FIND_AND), \
     (Local[0] < 0 ? Local[1] : Local[0] + 1)
 //
-// ExtractFilePath
-//
-// Returns directory portion of the given filename without backslash (unless
-// it is a root directory). If PathName doesn't contain directory portion,
-// the result is an empty string.
-//
 #define ExtractFilePath(str PathName) \
   (Local[0] = \
     !(Local[1] = RPos("\", PathName)) ? \
@@ -260,54 +239,32 @@
     ((Local[2] = Len(Local[0])) == 2 && Copy(Local[0], Local[2]) == ":" ? \
       "\" : \
       "")
+//
 #define ExtractFileDir(str PathName) \
   RemoveBackslash(ExtractFilePath(PathName))
-
+//
 #define ExtractFileExt(str PathName) \
   Local[0] = RPos(".", PathName), \
   Copy(PathName, Local[0] + 1)
 //
-// ExtractFileName
-//
-// Returns name portion of the given filename. If PathName ends with
-// a backslash, the result is an empty string.
-//
 #define ExtractFileName(str PathName) \
   !(Local[0] = RPos("\", PathName)) ? \
     PathName : \
     Copy(PathName, Local[0] + 1)
 //
-// ChangeFileExt
-//
-// Changes extension in FileName with NewExt. NewExt must not contain
-// period.
-//
 #define ChangeFileExt(str FileName, str NewExt) \
   !(Local[0] = RPos(".", FileName)) ? \
     FileName + "." + NewExt : \
     Copy(FileName, 1, Local[0]) + NewExt
 //
-// RemoveFileExt
-//
-// Removes extension in FileName.
-//
 #define RemoveFileExt(str FileName) \
   !(Local[0] = RPos(".", FileName)) ? \
   FileName : \
   Copy(FileName, 1, Local[0] - 1)
 //
-// AddBackslash
-//
-// Adds a backslash to the string, if it's not already there.
-//
 #define AddBackslash(str S) \
   Copy(S, Len(S)) == "\" ? S : S + "\"
 //
-// RemoveBackslash
-//
-// Removes trailing backslash from the string unless the string points to
-// a root directory.
-//
 #define RemoveBackslash(str S) \
   Local[0] = Len(S), \
   Local[0] > 0 ? \
@@ -318,38 +275,20 @@
       S : \
     ""
 //
-// Delete
-//
-// Deletes specified number of characters beginning with Index from S. S is
-// passed by reference (therefore is modified). Acts like Delete function in
-// Delphi (from System unit).
-//
 #define Delete(str *S, int Index, int Count = MaxInt) \
   S = Copy(S, 1, Index - 1) + Copy(S, Index + Count)
 //
-// Insert
-//
-// Inserts specified Substr at Index'th character into S. S is passed by
-// reference (therefore is modified).
-//
 #define Insert(str *S, int Index, str Substr) \
   Index > Len(S) + 1 ? \
     S : \
     S = Copy(S, 1, Index - 1) + SubStr + Copy(S, Index)
 //
-// YesNo, IsDirSet
-//
-// Returns nonzero value if given string is "yes", "true" or "1". Intended to
-// be used with SetupSetting function. This macro replaces YesNo function
-// available in previous releases.
-//
 #define YesNo(str S) \
   (S = LowerCase(S)) == "yes" || S == "true" || S == "1"
 //
 #define IsDirSet(str SetupDirective) \
   YesNo(SetupSetting(SetupDirective))
 //
-//
 #define Power(int X, int P = 2) \
   !P ? 1 : X * Power(X, P - 1)
 //
@@ -359,24 +298,24 @@
 #define Max(int A, int B, int C = MinInt)  \
   A > B ? A > C ? Int(A) : Int(C) : Int(B)
 //
-// SameText
-//
-// Returns True if the given strings are identical, ignoring case.
-// 
 #define SameText(str S1, str S2) \
   LowerCase(S1) == LowerCase(S2)
-// 
-// SameStr
-//
-// Returns True if the given strings are identical, with case-sensitivity.
 //
 #define SameStr(str S1, str S2) \
   S1 == S2
 //
-
+#define WarnRenamedVersion(str OldName, str NewName) \
+  Warning("Function """ + OldName + """ has been renamed. Use """ + NewName + "GetVersionComponents"" instead.")
+//
+#define ParseVersion(str FileName, *Major, *Minor, *Rev, *Build) \
+  WarnRenamedVersion("ParseVersion", "GetVersionComponents"), \
+  GetVersionComponents(FileName, Major, Minor, Rev, Build)
+//
+#define GetFileVersion(str FileName) \
+  WarnRenamedVersion("GetFileVersion", "GetVersionNumbersString"), \
+  GetVersionNumbersString(FileName)
+//
 #ifdef CStrings
 # pragma parseroption -p-
 #endif
-#endif
-; END ISPPBUILTINS.ISS
-
+#endif

+ 31 - 5
Files/Languages/Catalan.isl

@@ -1,6 +1,12 @@
-; *** Inno Setup version 6.0.3+ Catalan messages ***
+; *** Inno Setup version 6.1.0+ Catalan messages ***
 ;
 ; Translated by Carles Millan (email: [email protected])
+;
+; To download user-contributed translations of this file, go to:
+;   https://jrsoftware.org/files/istrans/
+;
+; Note: When translating this text, do not add periods (.) to the end of
+; messages that didn't have them already, because on those messages Inno
 
 [LangOptions]
 
@@ -133,7 +139,7 @@ UserInfoNameRequired=Cal que hi introdu
 WizardSelectDir=Trieu Carpeta de Destinació
 SelectDirDesc=On s'ha d'instal·lar [name]?
 SelectDirLabel3=El programa d'instal·lació instal·larà [name] a la carpeta següent.
-SelectDirBrowseLabel=Per a continuar, premeu Següent. Si desitgeu triar una altra capeta, premeu Cerca.
+SelectDirBrowseLabel=Per a continuar, premeu Següent. Si desitgeu triar una altra capeta, premeu Cerca.
 DiskSpaceGBLabel=Aquest programa necessita un mínim de [gb] GB d'espai a disc.
 DiskSpaceMBLabel=Aquest programa necessita un mínim de [mb] MB d'espai a disc.
 CannotInstallToNetworkDrive=La instal·lació no es pot fer en un disc de xarxa.
@@ -192,6 +198,18 @@ ReadyMemoType=Tipus d'instal
 ReadyMemoComponents=Components seleccionats:
 ReadyMemoGroup=Carpeta del Menú Inici:
 ReadyMemoTasks=Tasques addicionals:
+
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Descarregant els fitxers addicionals...
+ButtonStopDownload=&Atura la descàrrega
+StopDownload=Esteu segur que voleu aturar la descàrrega?
+ErrorDownloadAborted=Descàrrega cancel·lada
+ErrorDownloadFailed=La descàrrega ha fallat: %1 %2
+ErrorDownloadSizeFailed=La mesura de la descàrrega ha fallat: %1 %2
+ErrorFileHash1=El hash del fitxer ha fallat: %1
+ErrorFileHash2=El hash del fitxer és invàlid: s'esperava %1, s'ha trobat %2
+ErrorProgress=Progrés invàlid: %1 de %2
+ErrorFileSize=Mida del fitxer invàlida: s'esperava %1, s'ha trobat %2
 
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Preparant la instal·lació
@@ -273,10 +291,18 @@ SourceIsCorrupted=El fitxer d'origen est
 SourceDoesntExist=El fitxer d'origen "%1" no existeix
 ExistingFileReadOnly2=El fitxer existent no ha pogut ser substituït perquè està marcat com a només lectura.
 ExistingFileReadOnlyRetry=&Lleveu-li l'atribut de només lectura i torneu-ho a intentar
-ExistingFileReadOnlyKeepExisting=&Manteniu el fitxer existent
+ExistingFileReadOnlyKeepExisting=&Manté el fitxer existent
 ErrorReadingExistingDest=S'ha produït un error en llegir el fitxer:
-FileExists=El fitxer ja existeix.%n%nVoleu que sigui sobre-escrit?
-ExistingFileNewer=El fitxer existent és més nou que el que s'intenta instal·lar. Es recomana mantenir el fitxer existent.%n%nVoleu mantenir-lo?
+FileExistsSelectAction=Trieu acció
+FileExists2=El fitxer ja existeix.
+FileExistsOverwriteExisting=&Sobreescriu el fitxer existent
+FileExistsKeepExisting=&Manté el fitxer existent
+FileExistsOverwriteOrKeepAll=&Fes-ho també per als propers conflictes
+ExistingFileNewerSelectAction=Trieu acció
+ExistingFileNewer2=El fitxer existent és més nou que el que s'intenta instal·lar.
+ExistingFileNewerOverwriteExisting=&Sobreescriu el fitxer existent
+ExistingFileNewerKeepExisting=&Manté el fitxer existent (recomanat)
+ExistingFileNewerOverwriteOrKeepAll=&Fes-ho també per als propers conflictes
 ErrorChangingAttr=Hi ha hagut un error en canviar els atributs del fitxer:
 ErrorCreatingTemp=Hi ha hagut un error en crear un fitxer a la carpeta de destinació:
 ErrorReadingSource=Hi ha hagut un error en llegir el fitxer d'origen:

+ 43 - 21
Files/Languages/Corsican.isl

@@ -1,7 +1,7 @@
-; *** Inno Setup version 6.0.3+ Corsican messages ***
+; *** Inno Setup version 6.1.0+ Corsican messages ***
 ;
 ; To download user-contributed translations of this file, go to:
-;   http://www.jrsoftware.org/files/istrans/
+;   https://jrsoftware.org/files/istrans/
 ;
 ; Note: When translating this text, do not add periods (.) to the end of
 ; messages that didn't have them already, because on those messages Inno
@@ -13,6 +13,8 @@
 ; E-mail: Patrick.Santa-Maria[at]LaPoste.Net
 ;
 ; Changes:
+; July 25th, 2020 - Update to version 6.1.0+
+; July 1st, 2020 - Update to version 6.0.6+
 ; October 6th, 2019 - Update to version 6.0.3+
 ; January 20th, 2019 - Update to version 6.0.0+
 ; April 9th, 2016 - Changes to current version 5.5.3+
@@ -21,7 +23,7 @@
 ; September 17th, 2011 - Creation for version 5.1.11
 
 [LangOptions]
-; The following three entries are very important. Be sure to read and
+; The following three entries are very important. Be sure to read and 
 ; understand the '[LangOptions] section' topic in the help file.
 LanguageName=Corsu
 LanguageID=$0483
@@ -91,7 +93,7 @@ ErrorTooManyFilesInDir=Impussibule di creà un schedariu in u cartulare « %1 »
 
 ; *** Setup common messages
 ExitSetupTitle=Compie l’assistente
-ExitSetupMessage=L’assistente ùn hè micca compiu. S’è voi escite avà, u prugramma ùn serà micca installatu.%n%nPudete impiegà l’assistente torna un altra volta per compie l’installazione.%n%nCompie l’assistente ?
+ExitSetupMessage=L’assistente ùn hè micca compiu. S’è voi escite avà, u prugramma ùn serà micca installatu.%n%nPudete impiegà l’assistente torna un altra volta per compie l’installazione.%n%nCompie l’assistente ?
 AboutSetupMenuItem=&Apprupositu di l’assistente…
 AboutSetupTitle=Apprupositu di l’assistente
 AboutSetupMessage=%1 versione %2%n%3%n%n%1 pagina d’accolta :%n%4
@@ -163,15 +165,15 @@ WizardSelectDir=Selezziunà u locu di destinazione
 SelectDirDesc=Induve [name] deve esse installatu ?
 SelectDirLabel3=L’assistente installerà [name] in stu cartulare.
 SelectDirBrowseLabel=Per cuntinuà, sceglie Seguente. S’è voi preferisce selezziunà un altru cartulare, sciglite Sfuglià.
-DiskSpaceGBLabel=Hè richiestu almenu [gb] Go di spaziu liberu di discu.
-DiskSpaceMBLabel=Hè richiestu almenu [mb] Mo di spaziu liberu di discu.
+DiskSpaceGBLabel=Hè richiestu omancu [gb] Go di spaziu liberu di discu.
+DiskSpaceMBLabel=Hè richiestu omancu [mb] Mo di spaziu liberu di discu.
 CannotInstallToNetworkDrive=L’assistente ùn pò micca installà nant’à un discu di a reta.
-CannotInstallToUNCPath=L’assistente ùn pò micca installà in un passeghju UNC.
-InvalidPath=Ci vole à scrive un passeghju cumplettu cù a lettera di u lettore ; per indettu :%n%nC:\APP%n%no un passeghju UNC in a forma :%n%n\\servu\spartu
-InvalidDrive=U lettore o u passeghju UNC spartu ùn esiste micca o ùn hè micca accessibule. Ci vole à selezziunane un altru.
+CannotInstallToUNCPath=L’assistente ùn pò micca installà in un chjassu UNC.
+InvalidPath=Ci vole à scrive un chjassu cumplettu cù a lettera di u lettore ; per indettu :%n%nC:\APP%n%no un chjassu UNC in a forma :%n%n\\servitore\spartu
+InvalidDrive=U lettore o u chjassu UNC spartu ùn esiste micca o ùn hè micca accessibule. Ci vole à selezziunane un altru.
 DiskSpaceWarningTitle=Ùn basta u spaziu discu
-DiskSpaceWarning=L’assistente richiede almenu %1 Ko di spaziu liberu per installà, ma u lettore selezziunatu hà solu %2 Ko dispunibule.%n%nVulete cuntinuà quantunque ?
-DirNameTooLong=U nome di cartulare o u passeghju hè troppu longu.
+DiskSpaceWarning=L’assistente richiede omancu %1 Ko di spaziu liberu per installà, ma u lettore selezziunatu hà solu %2 Ko dispunibule.%n%nVulete cuntinuà quantunque ?
+DirNameTooLong=U nome di cartulare o u chjassu hè troppu longu.
 InvalidDirName=U nome di cartulare ùn hè micca accettevule.
 BadDirName32=I nomi di cartulare ùn ponu micca cuntene sti caratteri :%n%n%1
 DirExistsTitle=Cartulare esistente
@@ -191,8 +193,8 @@ NoUninstallWarningTitle=Cumpunenti esistenti
 NoUninstallWarning=L’assistente hà vistu chì sti cumpunenti sò dighjà installati nant’à l’urdinatore :%n%n%1%n%nDeselezziunà sti cumpunenti ùn i disinstallerà micca.%n%nVulete cuntinuà quantunque ?
 ComponentSize1=%1 Ko
 ComponentSize2=%1 Mo
-ComponentsDiskSpaceGBLabel=A selezzione attuale richiede almenu [gb] Go di spaziu liberu nant’à u discu.
-ComponentsDiskSpaceMBLabel=A selezzione attuale richiede almenu [mb] Mo di spaziu liberu nant’à u discu.
+ComponentsDiskSpaceGBLabel=A selezzione attuale richiede omancu [gb] Go di spaziu liberu nant’à u discu.
+ComponentsDiskSpaceMBLabel=A selezzione attuale richiede omancu [mb] Mo di spaziu liberu nant’à u discu.
 
 ; *** "Select Additional Tasks" wizard page
 WizardSelectTasks=Selezziunà trattamenti addizziunali
@@ -205,7 +207,7 @@ SelectStartMenuFolderDesc=Induve l’assistente deve piazzà l’accurtatoghji d
 SelectStartMenuFolderLabel3=L’assistente piazzerà l’accurtatoghji di u prugramma in stu cartulare di u listinu « Démarrer ».
 SelectStartMenuFolderBrowseLabel=Per cuntinuà, sceglie Seguente. S’è voi preferisce selezziunà un altru cartulare, sciglite Sfuglià.
 MustEnterGroupName=Ci vole à scrive un nome di cartulare.
-GroupNameTooLong=U nome di cartulare o u passeghju hè troppu longu.
+GroupNameTooLong=U nome di cartulare o u chjassu hè troppu longu.
 InvalidGroupName=U nome di cartulare ùn hè micca accettevule.
 BadGroupName=U nome di u cartulare ùn pò micca cuntene alcunu di sti caratteri :%n%n%1
 NoProgramGroupCheck2=Ùn creà &micca di cartulare in u listinu « Démarrer »
@@ -222,10 +224,22 @@ ReadyMemoComponents=Cumpunenti selezziunati :
 ReadyMemoGroup=Cartulare di u listinu « Démarrer » :
 ReadyMemoTasks=Trattamenti addizziunali :
 
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Scaricamentu di i schedarii addiziunali…
+ButtonStopDownload=&Piantà u scaricamentu
+StopDownload=Site sicuru di vulè piantà u scaricamentu ?
+ErrorDownloadAborted=Scaricamentu interrottu
+ErrorDownloadFailed=Scaricamentu fiascu : %1 %2
+ErrorDownloadSizeFailed=Fiascu per ottene a dimensione : %1 %2
+ErrorFileHash1=Fiascu di u tazzeghju di u schedariu : %1
+ErrorFileHash2=Tazzeghju di u schedariu inaccettevule : aspettatu %1, trovu %2
+ErrorProgress=Prugressione inaccettevule : %1 di %2
+ErrorFileSize=Dimensione di u schedariu inaccettevule : aspettatu %1, trovu %2
+
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Preparazione di l’installazione
 PreparingDesc=L’assistente appronta l’installazione di [name] nant’à l’urdinatore.
-PreviousInstallNotCompleted=L’installazione/A cacciatura di un prugramma precedente ùn s’hè micca compia bè. Ci vulerà à ridimarrà l’urdinatore per compie st’installazione.%n%nDopu, ci vulerà à rilancià l’assistente per compie l’installazione di [name].
+PreviousInstallNotCompleted=L’installazione o a cacciatura di un prugramma precedente ùn s’hè micca compia bè. Ci vulerà à ridimarrà l’urdinatore per compie st’installazione.%n%nDopu, ci vulerà à rilancià l’assistente per compie l’installazione di [name].
 CannotContinue=L’assistente ùn pò micca cuntinuà. Sceglie Abbandunà per esce.
 ApplicationsFound=St’appiecazioni impieganu schedarii chì devenu esse mudificati da l’assistente. Hè ricumandatu di permette à l’assistente di chjode autumaticamente st’appiecazioni.
 ApplicationsFound2=St’appiecazioni impieganu schedarii chì devenu esse mudificati da l’assistente. Hè ricumandatu di permette à l’assistente di chjode autumaticamente st’appiecazioni. S’è l’installazione si compie bè, l’assistente pruverà di rilancià l’appiecazioni.
@@ -240,8 +254,8 @@ InstallingLabel=Ci vole à aspettà durante l’installazione di [name] nant’
 
 ; *** "Setup Completed" wizard page
 FinishedHeadingLabel=Fine di l’installazione di [name]
-FinishedLabelNoIcons=L’installazione di [name] nant’à l’urdinatore hè compia.
-FinishedLabel=L’assistente hà compiu linstallazione di [name] nant’à l’urdinatore. L’appiecazione pò esse lanciata selezziunendu l’accurtatoghji installati.
+FinishedLabelNoIcons=L’assistente hà compiu l’installazione di [name] nant’à l’urdinatore.
+FinishedLabel=L’assistente hà compiu linstallazione di [name] nant’à l’urdinatore. L’appiecazione pò esse lanciata selezziunendu l’accurtatoghji installati.
 ClickFinish=Sceglie Piantà per compie l’assistente.
 FinishedRestartLabel=Per compie l’installazione di [name], l’assistente deve ridimarrà l’urdinatore. Vulete ridimarrà l’urdinatore subitu ?
 FinishedRestartMessage=Per compie l’installazione di [name], l’assistente deve ridimarrà l’urdinatore.%n%nVulete ridimarrà l’urdinatore subitu ?
@@ -255,8 +269,8 @@ RunEntryShellExec=Fighjà %1
 
 ; *** "Setup Needs the Next Disk" stuff
 ChangeDiskTitle=L’assistente hà bisogniu di u discu seguente
-SelectDiskLabel2=Mette u discu %1 è sceglie Vai.%n%nS’è i schedarii di stu discu si trovanu in un’altru cartulare chì quellu indicatu inghjò, scrive u passeghju currettu o sceglie Sfuglià.
-PathLabel=&Passeghju :
+SelectDiskLabel2=Mette u discu %1 è sceglie Vai.%n%nS’è i schedarii di stu discu si trovanu in un’altru cartulare chì quellu indicatu inghjò, scrive u chjassu currettu o sceglie Sfuglià.
+PathLabel=&Chjassu :
 FileNotInDir2=U schedariu « %1 » ùn si truva micca in « %2 ». Mette u discu curretu o sceglie un’altru cartulare.
 SelectDirectoryLabel=Ci vole à specificà induve si trova u discu seguente.
 
@@ -304,8 +318,16 @@ ExistingFileReadOnly2=U schedariu esistente hà un attributu di lettura-sola è
 ExistingFileReadOnlyRetry=&Caccià l’attributu di lettura-sola è pruvà torna
 ExistingFileReadOnlyKeepExisting=Cunservà u schedariu &esistente
 ErrorReadingExistingDest=Un sbagliu hè accadutu pruvendu di leghje u schedariu esistente :
-FileExists=U schedariu esiste dighjà.%n%nVulete chì l’assistente u rimpiazzi ?
-ExistingFileNewer=U schedariu esistente hè più recente chì quellu chì l’assistente prova d’installà. Hè ricumandatu di cunservà u schedariu esistente.%n%nVulete cunservà u schedariu esistente ?
+FileExistsSelectAction=Selezziunate un’azzione
+FileExists2=U schedariu esiste dighjà.
+FileExistsOverwriteExisting=&Rimpiazzà u schedariu chì esiste
+FileExistsKeepExisting=Cunservà u schedariu &esistente
+FileExistsOverwriteOrKeepAll=&Fà què per l’altri cunflitti
+ExistingFileNewerSelectAction=Selezziunate un’azzione
+ExistingFileNewer2=U schedariu esistente hè più recente chì quellu chì l’assistente prova d’installà.
+ExistingFileNewerOverwriteExisting=&Rimpiazzà u schedariu chì esiste
+ExistingFileNewerKeepExisting=Cunservà u schedariu &esistente (ricumandatu)
+ExistingFileNewerOverwriteOrKeepAll=&Fà què per l’altri cunflitti
 ErrorChangingAttr=Un sbagliu hè accadutu pruvendu di cambià l’attributi di u schedariu esistente :
 ErrorCreatingTemp=Un sbagliu hè accadutu pruvendu di creà un schedariu in u cartulare di destinazione :
 ErrorReadingSource=Un sbagliu hè accadutu pruvendu di leghje u schedariu d’urigine :

+ 25 - 5
Files/Languages/Danish.isl

@@ -1,14 +1,14 @@
-; *** Inno Setup version 6.0.3+ Danish messages ***
+; *** Inno Setup version 6.1.0+ Danish messages ***
 ;
 ; To download user-contributed translations of this file, go to:
-;   http://www.jrsoftware.org/files/istrans/
+;   https://jrsoftware.org/files/istrans/
 ;
 ; Note: When translating this text, do not add periods (.) to the end of
 ; messages that didn't have them already, because on those messages Inno
 ; Setup adds the periods automatically (appending a period would result in
 ; two periods being displayed).
 ;
-; ID: Danish.isl,v 6.0.3+ 2019/10/06 Thomas Vedel, [email protected]
+; ID: Danish.isl,v 6.0.3+ 2020/07/26 Thomas Vedel, [email protected]
 ; Parts by scootergrisen, 2015
 
 [LangOptions]
@@ -211,6 +211,18 @@ ReadyMemoComponents=Valgte komponenter:
 ReadyMemoGroup=Mappe i menuen Start:
 ReadyMemoTasks=Valgte supplerende opgaver:
 
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Downloader yderligere filer...
+ButtonStopDownload=&Stop download
+StopDownload=Er du sikker på at du ønsker at afbryde download?
+ErrorDownloadAborted=Download afbrudt
+ErrorDownloadFailed=Fejl under download: %1 %2
+ErrorDownloadSizeFailed=Fejl ved læsning af filstørrelse: %1 %2
+ErrorFileHash1=Fejl i hash: %1
+ErrorFileHash2=Fejl i fil hash værdi: forventet %1, fundet %2
+ErrorProgress=Fejl i trin: %1 af %2
+ErrorFileSize=Fejl i filstørrelse: forventet %1, fundet %2
+
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Klargøring af installationen
 PreparingDesc=Installationsprogrammet gør klar til at installere [name] på din computer.
@@ -293,8 +305,16 @@ ExistingFileReadOnly2=Den eksisterende fil er skrivebeskyttet og kan derfor ikke
 ExistingFileReadOnlyRetry=&Fjern skrivebeskyttelsen og forsøg igen
 ExistingFileReadOnlyKeepExisting=&Behold den eksisterende fil
 ErrorReadingExistingDest=Der opstod en fejl ved læsning af den eksisterende fil:
-FileExists=Filen findes allerede.%n%nSkal installationsprogrammet overskrive den?
-ExistingFileNewer=Den eksisterende fil er nyere end den installationsprogrammet forsøger at installere. Det anbefales at beholde den eksisterende fil.%n%n Skal den eksisterende fil beholdes?
+FileExistsSelectAction=Vælg handling
+FileExists2=Filen findes allerede.
+FileExistsOverwriteExisting=&Overskriv den eksisterende fil
+FileExistsKeepExisting=&Behold den eksiterende fil
+FileExistsOverwriteOrKeepAll=&Gentag handlingen for de næste konflikter
+ExistingFileNewerSelectAction=Vælg handling
+ExistingFileNewer2=Den eksisterende fil er nyere end den som forsøges installeret.
+ExistingFileNewerOverwriteExisting=&Overskriv den eksisterende fil
+ExistingFileNewerKeepExisting=&Behold den eksisterende fil (anbefales)
+ExistingFileNewerOverwriteOrKeepAll=&Gentag handlingen for de næste konflikter
 ErrorChangingAttr=Der opstod en fejl ved ændring af attributter for den eksisterende fil:
 ErrorCreatingTemp=Der opstod en fejl ved oprettelse af en fil i mappen:
 ErrorReadingSource=Der opstod en fejl ved læsning af kildefilen:

+ 23 - 3
Files/Languages/Dutch.isl

@@ -1,4 +1,4 @@
-; *** Inno Setup version 6.0.3+ Dutch messages ***
+; *** Inno Setup version 6.1.0+ Dutch messages ***
 ;
 ; This file is based on user-contributed translations by various authors
 ;
@@ -192,6 +192,18 @@ ReadyMemoComponents=Geselecteerde componenten:
 ReadyMemoGroup=Menu Start map:
 ReadyMemoTasks=Extra taken:
 
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Bezig met het downloaden van extra bestanden...
+ButtonStopDownload=&Stop download
+StopDownload=Weet u zeker dat u de download wilt stoppen?
+ErrorDownloadAborted=Download afgebroken
+ErrorDownloadFailed=Download mislukt: %1 %2
+ErrorDownloadSizeFailed=Ophalen grootte mislukt: %1 %2
+ErrorFileHash1=Bestand hashing mislukt: %1
+ErrorFileHash2=Ongeldige bestandshash: %1 verwacht, %2 gevonden
+ErrorProgress=Ongeldige voortgang: %1 van %2
+ErrorFileSize=Ongeldige bestandsgrootte: %1 verwacht, %2 gevonden
+
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Bezig met het voorbereiden van de installatie
 PreparingDesc=Setup is bezig met het voorbereiden van de installatie van [name].
@@ -272,8 +284,16 @@ ExistingFileReadOnly2=Het bestaande bestand kon niet vervangen worden omdat het
 ExistingFileReadOnlyRetry=&Verwijder de alleen-lezen markering en probeer het opnieuw
 ExistingFileReadOnlyKeepExisting=&Behoud het bestaande bestand
 ErrorReadingExistingDest=Er is een fout opgetreden bij het lezen van het bestaande bestand:
-FileExists=Het bestand bestaat al.%n%nWilt u dat Setup het overschrijft?
-ExistingFileNewer=Het bestaande bestand is nieuwer dan het bestand dat Setup probeert te installeren. U wordt aanbevolen het bestaande bestand te behouden.%n%nWilt u het bestaande bestand behouden?
+FileExistsSelectAction=Selecteer actie
+FileExists2=Het bestand bestaat al.
+FileExistsOverwriteExisting=&Overschrijf het bestaande bestand
+FileExistsKeepExisting=&Behoud het bestaande bestand
+FileExistsOverwriteOrKeepAll=&Dit voor de volgende conflicten uitvoeren
+ExistingFileNewerSelectAction=Selecteer actie
+ExistingFileNewer2=Het bestaande bestand is nieuwer dan het bestand dat Setup probeert te installeren.
+ExistingFileNewerOverwriteExisting=&Overschrijf het bestaande bestand
+ExistingFileNewerKeepExisting=&Behoud het bestaande bestand (aanbevolen)
+ExistingFileNewerOverwriteOrKeepAll=&Dit voor de volgende conflicten uitvoeren
 ErrorChangingAttr=Er is een fout opgetreden bij het wijzigen van de kenmerken van het bestaande bestand:
 ErrorCreatingTemp=Er is een fout opgetreden bij het maken van een bestand in de doelmap:
 ErrorReadingSource=Er is een fout opgetreden bij het lezen van het bronbestand:

+ 26 - 5
Files/Languages/French.isl

@@ -1,7 +1,7 @@
-; *** Inno Setup version 6.0.3+ French messages ***
+; *** Inno Setup version 6.1.0+ French messages ***
 ;
 ; To download user-contributed translations of this file, go to:
-;   http://www.jrsoftware.org/files/istrans/
+;   https://jrsoftware.org/files/istrans/
 ;
 ; Note: When translating this text, do not add periods (.) to the end of
 ; messages that didn't have them already, because on those messages Inno
@@ -25,6 +25,7 @@
 ;     "click": "Clicker" instead of "Appuyer" 
 ;     "retry": "Recommencer" au lieu de "Réessayer"
 ; + Added new 6.0.0 messages
+; + Added new 6.1.0 messages
 
 [LangOptions]
 ; The following three entries are very important. Be sure to read and 
@@ -98,7 +99,7 @@ ErrorTooManyFilesInDir=L'assistant d'installation n'a pas pu créer un fichier d
 ; *** Setup common messages
 ExitSetupTitle=Quitter l'installation
 ExitSetupMessage=L'installation n'est pas terminée. Si vous abandonnez maintenant, le programme ne sera pas installé.%n%nVous devrez relancer cet assistant pour finir l'installation.%n%nVoulez-vous quand même quitter l'assistant d'installation ?
-AboutSetupMenuItem=&À propos...
+AboutSetupMenuItem=À &propos...
 AboutSetupTitle=À Propos de l'assistant d'installation
 AboutSetupMessage=%1 version %2%n%3%n%nPage d'accueil de %1 :%n%4
 AboutSetupNote=
@@ -228,6 +229,18 @@ ReadyMemoComponents=Composants sélectionnés :
 ReadyMemoGroup=Dossier du menu Démarrer :
 ReadyMemoTasks=Tâches supplémentaires :
 
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Téléchargement de fichiers supplémentaires...
+ButtonStopDownload=&Arrêter le téléchargement
+StopDownload=Êtes-vous sûr de vouloir arrêter le téléchargement ?
+ErrorDownloadAborted=Téléchargement annulé
+ErrorDownloadFailed=Le téléchargement a échoué : %1 %2
+ErrorDownloadSizeFailed=La récupération de la taille du fichier a échouée : %1 %2
+ErrorFileHash1=Le calcul de l'empreinte du fichier a échoué : %1
+ErrorFileHash2=Empreinte du fichier invalide : attendue %1, trouvée %2
+ErrorProgress=Progression invalide : %1 sur %2
+ErrorFileSize=Taille du fichier invalide : attendue %1, trouvée %2
+
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Préparation de l'installation
 PreparingDesc=L'assistant d'installation prépare l'installation de [name] sur votre ordinateur.
@@ -310,8 +323,16 @@ ExistingFileReadOnly2=Le fichier existant ne peut pas être remplacé parce qu'i
 ExistingFileReadOnlyRetry=&Supprimer l'attribut lecture seule et réessayer
 ExistingFileReadOnlyKeepExisting=&Conserver le fichier existant
 ErrorReadingExistingDest=Une erreur s'est produite lors de la tentative de lecture du fichier existant :
-FileExists=Le fichier existe déjà.%n%nSouhaitez-vous que l'installation le remplace ?
-ExistingFileNewer=Le fichier existant est plus récent que celui que l'assistant essaie d'installer. Il est recommandé de conserver le fichier existant.%n%nSouhaitez-vous conserver le fichier existant ?
+FileExistsSelectAction=Choisissez une action
+FileExists2=Le fichier existe déjà.
+FileExistsOverwriteExisting=&Ecraser le fichier existant
+FileExistsKeepExisting=&Conserver le fichier existant
+FileExistsOverwriteOrKeepAll=&Faire ceci pour les conflits à venir
+ExistingFileNewerSelectAction=Choisissez une action
+ExistingFileNewer2=Le fichier existant est plus récent que celui que l'assistant d'installation est en train d'installer.
+ExistingFileNewerOverwriteExisting=&Ecraser le fichier existant
+ExistingFileNewerKeepExisting=&Conserver le fichier existant (recommandé)
+ExistingFileNewerOverwriteOrKeepAll=&Faire ceci pour les conflits à venir
 ErrorChangingAttr=Une erreur est survenue en essayant de modifier les attributs du fichier existant :
 ErrorCreatingTemp=Une erreur est survenue en essayant de créer un fichier dans le dossier de destination :
 ErrorReadingSource=Une erreur est survenue lors de la lecture du fichier source :

+ 41 - 41
Files/Languages/German.isl

@@ -64,10 +64,10 @@ HelpTextNote=
 
 ; *** Startup error messages
 LastErrorMessage=%1.%n%nFehler %2: %3
-SetupFileMissing=Die Datei %1 fehlt im Installations-Ordner. Bitte beheben Sie das Problem, oder besorgen Sie sich eine neue Kopie des Programms.
+SetupFileMissing=Die Datei %1 fehlt im Installationsordner. Bitte beheben Sie das Problem oder besorgen Sie sich eine neue Kopie des Programms.
 SetupFileCorrupt=Die Setup-Dateien sind beschädigt. Besorgen Sie sich bitte eine neue Kopie des Programms.
-SetupFileCorruptOrWrongVer=Die Setup-Dateien sind beschädigt oder inkompatibel zu dieser Version des Setups. Bitte beheben Sie das Problem, oder besorgen Sie sich eine neue Kopie des Programms.
-InvalidParameter=Ein ungültiger Paramter wurde auf der Kommandozeile übergeben:%n%n%1
+SetupFileCorruptOrWrongVer=Die Setup-Dateien sind beschädigt oder inkompatibel zu dieser Version des Setups. Bitte beheben Sie das Problem oder besorgen Sie sich eine neue Kopie des Programms.
+InvalidParameter=Ein ungültiger Parameter wurde auf der Kommandozeile übergeben:%n%n%1
 SetupAlreadyRunning=Setup läuft bereits.
 WindowsVersionNotSupported=Dieses Programm unterstützt die auf Ihrem Computer installierte Windows-Version nicht.
 WindowsServicePackRequired=Dieses Programm benötigt %1 Service Pack %2 oder höher.
@@ -78,29 +78,29 @@ WinVersionTooLowError=Dieses Programm benötigt %1 Version %2 oder höher.
 WinVersionTooHighError=Dieses Programm kann nicht unter %1 Version %2 oder höher installiert werden.
 AdminPrivilegesRequired=Sie müssen als Administrator angemeldet sein, um dieses Programm installieren zu können.
 PowerUserPrivilegesRequired=Sie müssen als Administrator oder als Mitglied der Hauptbenutzer-Gruppe angemeldet sein, um dieses Programm installieren zu können.
-SetupAppRunningError=Das Setup hat entdeckt, dass %1 zur Zeit ausgeführt wird.%n%nBitte schließen Sie jetzt alle laufenden Instanzen, und klicken Sie auf "OK", um fortzufahren, oder auf "Abbrechen", um zu beenden.
-UninstallAppRunningError=Die Deinstallation hat entdeckt, dass %1 zur Zeit ausgeführt wird.%n%nBitte schließen Sie jetzt alle laufenden Instanzen, und klicken Sie auf "OK", um fortzufahren, oder auf "Abbrechen", um zu beenden.
+SetupAppRunningError=Das Setup hat entdeckt, dass %1 zur Zeit ausgeführt wird.%n%nBitte schließen Sie jetzt alle laufenden Instanzen und klicken Sie auf "OK", um fortzufahren, oder auf "Abbrechen", um zu beenden.
+UninstallAppRunningError=Die Deinstallation hat entdeckt, dass %1 zur Zeit ausgeführt wird.%n%nBitte schließen Sie jetzt alle laufenden Instanzen und klicken Sie auf "OK", um fortzufahren, oder auf "Abbrechen", um zu beenden.
 
 ; *** Startup questions
 PrivilegesRequiredOverrideTitle=Installationsmodus auswählen
 PrivilegesRequiredOverrideInstruction=Bitte wählen Sie den Installationsmodus
-PrivilegesRequiredOverrideText1=%1 kann für alle Benutzer installiert werden (erfordert Administrationsrechte), oder nur für Sie.
-PrivilegesRequiredOverrideText2=%1 kann nur für Sie installiert werden, oder für alle Benutzer (erfordert Administrationsrechte).
+PrivilegesRequiredOverrideText1=%1 kann für alle Benutzer (erfordert Administrationsrechte) oder nur für Sie installiert werden.
+PrivilegesRequiredOverrideText2=%1 kann nur für Sie oder für alle Benutzer (erfordert Administrationsrechte) installiert werden.
 PrivilegesRequiredOverrideAllUsers=Installation für &alle Benutzer
 PrivilegesRequiredOverrideAllUsersRecommended=Installation für &alle Benutzer (empfohlen)
-PrivilegesRequiredOverrideCurrentUser=Installion nur für &Sie
-PrivilegesRequiredOverrideCurrentUserRecommended=Install nur für &Sie (empfohlen)
+PrivilegesRequiredOverrideCurrentUser=Installation nur für &Sie
+PrivilegesRequiredOverrideCurrentUserRecommended=Installation nur für &Sie (empfohlen)
 
 ; *** Misc. errors
-ErrorCreatingDir=Das Setup konnte den Ordner "%1" nicht erstellen
-ErrorTooManyFilesInDir=Das Setup konnte eine Datei im Ordner "%1" nicht erstellen, weil er zu viele Dateien enthält
+ErrorCreatingDir=Das Setup konnte den Ordner "%1" nicht erstellen.
+ErrorTooManyFilesInDir=Das Setup konnte eine Datei im Ordner "%1" nicht erstellen, weil er zu viele Dateien enthält.
 
 ; *** Setup common messages
 ExitSetupTitle=Setup verlassen
 ExitSetupMessage=Das Setup ist noch nicht abgeschlossen. Wenn Sie jetzt beenden, wird das Programm nicht installiert.%n%nSie können das Setup zu einem späteren Zeitpunkt nochmals ausführen, um die Installation zu vervollständigen.%n%nSetup verlassen?
 AboutSetupMenuItem=&Über das Setup ...
 AboutSetupTitle=Über das Setup
-AboutSetupMessage=%1 Version %2%n%3%n%n%1 Internet-Seite:%n%4
+AboutSetupMessage=%1 Version %2%n%3%n%n%1 Webseite:%n%4
 AboutSetupNote=
 TranslatorNote=German translation maintained by Jens Brand ([email protected])
 
@@ -127,7 +127,7 @@ SelectLanguageLabel=Wählen Sie die Sprache aus, die während der Installation b
 ClickNext="Weiter" zum Fortfahren, "Abbrechen" zum Verlassen.
 BeveledLabel=
 BrowseDialogTitle=Ordner suchen
-BrowseDialogLabel=Wählen Sie einen Ordner aus, und klicken Sie danach auf "OK".
+BrowseDialogLabel=Wählen Sie einen Ordner aus und klicken Sie danach auf "OK".
 NewFolderName=Neuer Ordner
 
 ; *** "Welcome" wizard page
@@ -137,24 +137,24 @@ WelcomeLabel2=Dieser Assistent wird jetzt [name/ver] auf Ihrem Computer installi
 ; *** "Password" wizard page
 WizardPassword=Passwort
 PasswordLabel1=Diese Installation wird durch ein Passwort geschützt.
-PasswordLabel3=Bitte geben Sie das Passwort ein, und klicken Sie danach auf "Weiter". Achten Sie auf korrekte Groß-/Kleinschreibung.
+PasswordLabel3=Bitte geben Sie das Passwort ein und klicken Sie danach auf "Weiter". Achten Sie auf korrekte Groß-/Kleinschreibung.
 PasswordEditLabel=&Passwort:
 IncorrectPassword=Das eingegebene Passwort ist nicht korrekt. Bitte versuchen Sie es noch einmal.
 
 ; *** "License Agreement" wizard page
 WizardLicense=Lizenzvereinbarung
-LicenseLabel=Lesen Sie bitte folgende, wichtige Informationen bevor Sie fortfahren.
+LicenseLabel=Lesen Sie bitte folgende wichtige Informationen, bevor Sie fortfahren.
 LicenseLabel3=Lesen Sie bitte die folgenden Lizenzvereinbarungen. Benutzen Sie bei Bedarf die Bildlaufleiste oder drücken Sie die "Bild Ab"-Taste.
 LicenseAccepted=Ich &akzeptiere die Vereinbarung
 LicenseNotAccepted=Ich &lehne die Vereinbarung ab
 
 ; *** "Information" wizard pages
 WizardInfoBefore=Information
-InfoBeforeLabel=Lesen Sie bitte folgende, wichtige Informationen bevor Sie fortfahren.
-InfoBeforeClickLabel=Klicken Sie auf "Weiter", sobald Sie bereit sind mit dem Setup fortzufahren.
+InfoBeforeLabel=Lesen Sie bitte folgende wichtige Informationen, bevor Sie fortfahren.
+InfoBeforeClickLabel=Klicken Sie auf "Weiter", sobald Sie bereit sind, mit dem Setup fortzufahren.
 WizardInfoAfter=Information
-InfoAfterLabel=Lesen Sie bitte folgende, wichtige Informationen bevor Sie fortfahren.
-InfoAfterClickLabel=Klicken Sie auf "Weiter", sobald Sie bereit sind mit dem Setup fortzufahren.
+InfoAfterLabel=Lesen Sie bitte folgende wichtige Informationen, bevor Sie fortfahren.
+InfoAfterClickLabel=Klicken Sie auf "Weiter", sobald Sie bereit sind, mit dem Setup fortzufahren.
 
 ; *** "User Information" wizard page
 WizardUserInfo=Benutzerinformationen
@@ -173,7 +173,7 @@ DiskSpaceGBLabel=Mindestens [gb] GB freier Speicherplatz ist erforderlich.
 DiskSpaceMBLabel=Mindestens [mb] MB freier Speicherplatz ist erforderlich.
 CannotInstallToNetworkDrive=Das Setup kann nicht in einen Netzwerk-Pfad installieren.
 CannotInstallToUNCPath=Das Setup kann nicht in einen UNC-Pfad installieren. Wenn Sie auf ein Netzlaufwerk installieren möchten, müssen Sie dem Netzwerkpfad einen Laufwerksbuchstaben zuordnen.
-InvalidPath=Sie müssen einen vollständigen Pfad mit einem Laufwerksbuchstaben angeben; z.B.:%n%nC:\Beispiel%n%noder einen UNC-Pfad in der Form:%n%n\\Server\Freigabe
+InvalidPath=Sie müssen einen vollständigen Pfad mit einem Laufwerksbuchstaben angeben, z. B.:%n%nC:\Beispiel%n%noder einen UNC-Pfad in der Form:%n%n\\Server\Freigabe
 InvalidDrive=Das angegebene Laufwerk bzw. der UNC-Pfad existiert nicht oder es kann nicht darauf zugegriffen werden. Wählen Sie bitte einen anderen Ordner.
 DiskSpaceWarningTitle=Nicht genug freier Speicherplatz
 DiskSpaceWarning=Das Setup benötigt mindestens %1 KB freien Speicherplatz zum Installieren, aber auf dem ausgewählten Laufwerk sind nur %2 KB verfügbar.%n%nMöchten Sie trotzdem fortfahren?
@@ -188,7 +188,7 @@ DirDoesntExist=Der Ordner:%n%n%1%n%nist nicht vorhanden. Soll der Ordner erstell
 ; *** "Select Components" wizard page
 WizardSelectComponents=Komponenten auswählen
 SelectComponentsDesc=Welche Komponenten sollen installiert werden?
-SelectComponentsLabel2=Wählen Sie die Komponenten aus, die Sie installieren möchten. Klicken Sie auf "Weiter", wenn Sie bereit sind fortzufahren.
+SelectComponentsLabel2=Wählen Sie die Komponenten aus, die Sie installieren möchten. Klicken Sie auf "Weiter", wenn Sie bereit sind, fortzufahren.
 FullInstallation=Vollständige Installation
 ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language)
 CompactInstallation=Kompakte Installation
@@ -197,8 +197,8 @@ NoUninstallWarningTitle=Komponenten vorhanden
 NoUninstallWarning=Das Setup hat festgestellt, dass die folgenden Komponenten bereits auf Ihrem Computer installiert sind:%n%n%1%n%nDiese nicht mehr ausgewählten Komponenten werden nicht vom Computer entfernt.%n%nMöchten Sie trotzdem fortfahren?
 ComponentSize1=%1 KB
 ComponentSize2=%1 MB
-ComponentsDiskSpaceGBLabel=Die aktuelle Auswahl erfordert min. [gb] GB Speicherplatz.
-ComponentsDiskSpaceMBLabel=Die aktuelle Auswahl erfordert min. [mb] MB Speicherplatz.
+ComponentsDiskSpaceGBLabel=Die aktuelle Auswahl erfordert mindestens [gb] GB Speicherplatz.
+ComponentsDiskSpaceMBLabel=Die aktuelle Auswahl erfordert mindestens [mb] MB Speicherplatz.
 
 ; *** "Select Additional Tasks" wizard page
 WizardSelectTasks=Zusätzliche Aufgaben auswählen
@@ -230,15 +230,15 @@ ReadyMemoTasks=Zusätzliche Aufgaben:
 
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Vorbereitung der Installation
-PreparingDesc=Das Setup bereitet die Installation von [name] auf diesen Computer vor.
+PreparingDesc=Das Setup bereitet die Installation von [name] auf diesem Computer vor.
 PreviousInstallNotCompleted=Eine vorherige Installation/Deinstallation eines Programms wurde nicht abgeschlossen. Der Computer muss neu gestartet werden, um die Installation/Deinstallation zu beenden.%n%nStarten Sie das Setup nach dem Neustart Ihres Computers erneut, um die Installation von [name] durchzuführen.
 CannotContinue=Das Setup kann nicht fortfahren. Bitte klicken Sie auf "Abbrechen" zum Verlassen.
 ApplicationsFound=Die folgenden Anwendungen benutzen Dateien, die aktualisiert werden müssen. Es wird empfohlen, Setup zu erlauben, diese Anwendungen zu schließen.
-ApplicationsFound2=Die folgenden Anwendungen benutzen Dateien, die aktualisiert werden müssen. Es wird empfohlen, Setup zu erlauben, diese Anwendungen zu schließen. Nachdem die Installation fertiggestellt wurde, versucht Setup diese Anwendungen wieder zu starten.
+ApplicationsFound2=Die folgenden Anwendungen benutzen Dateien, die aktualisiert werden müssen. Es wird empfohlen, Setup zu erlauben, diese Anwendungen zu schließen. Nachdem die Installation fertiggestellt wurde, versucht Setup, diese Anwendungen wieder zu starten.
 CloseApplications=&Schließe die Anwendungen automatisch
 DontCloseApplications=Schließe die A&nwendungen nicht
 ErrorCloseApplications=Das Setup konnte nicht alle Anwendungen automatisch schließen. Es wird empfohlen, alle Anwendungen zu schließen, die Dateien benutzen, die vom Setup vor einer Fortsetzung aktualisiert werden müssen.  
-PrepareToInstallNeedsRestart=Setup must restart your computer. After restarting your computer, run Setup again to complete the installation of [name].%n%nWould you like to restart now?
+PrepareToInstallNeedsRestart=Das Setup muss Ihren Computer neu starten. Führen Sie nach dem Neustart Setup erneut aus, um die Installation von [name] abzuschließen.%n%nWollen Sie jetzt neu starten? 
 
 ; *** "Installing" wizard page
 WizardInstalling=Installiere ...
@@ -261,29 +261,29 @@ RunEntryShellExec=%1 anzeigen
 
 ; *** "Setup Needs the Next Disk" stuff
 ChangeDiskTitle=Nächsten Datenträger einlegen
-SelectDiskLabel2=Legen Sie bitte Datenträger %1 ein, und klicken Sie auf "OK".%n%nWenn sich die Dateien von diesem Datenträger in einem anderen als dem angezeigten Ordner befinden, dann geben Sie bitte den korrekten Pfad ein oder klicken auf "Durchsuchen".
+SelectDiskLabel2=Legen Sie bitte Datenträger %1 ein und klicken Sie auf "OK".%n%nWenn sich die Dateien von diesem Datenträger in einem anderen als dem angezeigten Ordner befinden, dann geben Sie bitte den korrekten Pfad ein oder klicken auf "Durchsuchen".
 PathLabel=&Pfad:
 FileNotInDir2=Die Datei "%1" befindet sich nicht in "%2". Bitte Ordner ändern oder richtigen Datenträger einlegen.
 SelectDirectoryLabel=Geben Sie bitte an, wo der nächste Datenträger eingelegt wird.
 
 ; *** Installation phase messages
-SetupAborted=Das Setup konnte nicht abgeschlossen werden.%n%nBeheben Sie bitte das Problem, und starten Sie das Setup erneut.
+SetupAborted=Das Setup konnte nicht abgeschlossen werden.%n%nBeheben Sie bitte das Problem und starten Sie das Setup erneut.
 AbortRetryIgnoreSelectAction=Bitte auswählen
 AbortRetryIgnoreRetry=&Nochmals versuchen
 AbortRetryIgnoreIgnore=&Den Fehler ignorieren und fortfahren
 AbortRetryIgnoreCancel=Installation abbrechen
 
 ; *** Installation status messages
-StatusClosingApplications=Anwendungen werden geschlossen...
+StatusClosingApplications=Anwendungen werden geschlossen ...
 StatusCreateDirs=Ordner werden erstellt ...
 StatusExtractFiles=Dateien werden entpackt ...
 StatusCreateIcons=Verknüpfungen werden erstellt ...
 StatusCreateIniEntries=INI-Einträge werden erstellt ...
 StatusCreateRegistryEntries=Registry-Einträge werden erstellt ...
 StatusRegisterFiles=Dateien werden registriert ...
-StatusSavingUninstall=Deinstallations-Informationen werden gespeichert ...
+StatusSavingUninstall=Deinstallationsinformationen werden gespeichert ...
 StatusRunProgram=Installation wird beendet ...
-StatusRestartingApplications=Neustart der Anwendungen...
+StatusRestartingApplications=Neustart der Anwendungen ...
 StatusRollback=Änderungen werden rückgängig gemacht ...
 
 ; *** Misc. errors
@@ -306,12 +306,12 @@ FileAbortRetryIgnoreSkipNotRecommended=Diese Datei &überspringen (nicht empfohl
 FileAbortRetryIgnoreIgnoreNotRecommended=Den Fehler &ignorieren und fortfahren (nicht empfohlen)
 SourceIsCorrupted=Die Quelldatei ist beschädigt
 SourceDoesntExist=Die Quelldatei "%1" existiert nicht
-ExistingFileReadOnly2=Die vorhandene Datei kann nicht ersetzt werden, das sie schreibgeschützt ist
+ExistingFileReadOnly2=Die vorhandene Datei kann nicht ersetzt werden, da sie schreibgeschützt ist.
 ExistingFileReadOnlyRetry=&Den Schreibschutz entfernen und noch einmal versuchen
 ExistingFileReadOnlyKeepExisting=Die &vorhandene Datei behalten
 ErrorReadingExistingDest=Lesefehler in Datei:
 FileExists=Die Datei ist bereits vorhanden.%n%nSoll sie überschrieben werden?
-ExistingFileNewer=Die vorhandene Datei ist neuer als die Datei, die installiert werden soll. Es wird empfohlen die vorhandene Datei beizubehalten.%n%n Möchten Sie die vorhandene Datei beibehalten?
+ExistingFileNewer=Die vorhandene Datei ist neuer als die Datei, die installiert werden soll. Es wird empfohlen, die vorhandene Datei beizubehalten.%n%n Möchten Sie die vorhandene Datei beibehalten?
 ErrorChangingAttr=Fehler beim Ändern der Datei-Attribute:
 ErrorCreatingTemp=Fehler beim Erstellen einer Datei im Ziel-Ordner:
 ErrorReadingSource=Fehler beim Lesen der Quelldatei:
@@ -324,12 +324,12 @@ ErrorRegSvr32Failed=RegSvr32-Aufruf scheiterte mit Exit-Code %1
 ErrorRegisterTypeLib=Typen-Bibliothek konnte nicht registriert werden: %1
 
 ; *** Uninstall display name markings
-; used for example as 'Mein Programm (32-bit)'
+; used for example as 'Mein Programm (32 Bit)'
 UninstallDisplayNameMark=%1 (%2)
-; used for example as 'Mein Programm (32-bit, Alle Benutzer)'
+; used for example as 'Mein Programm (32 Bit, Alle Benutzer)'
 UninstallDisplayNameMarks=%1 (%2, %3)
-UninstallDisplayNameMark32Bit=32-bit
-UninstallDisplayNameMark64Bit=64-bit
+UninstallDisplayNameMark32Bit=32 Bit
+UninstallDisplayNameMark64Bit=64 Bit
 UninstallDisplayNameMarkAllUsers=Alle Benutzer
 UninstallDisplayNameMarkCurrentUser=Aktueller Benutzer
 
@@ -340,10 +340,10 @@ ErrorRestartingComputer=Das Setup konnte den Computer nicht neu starten. Bitte f
 ; *** Uninstaller messages
 UninstallNotFound=Die Datei "%1" existiert nicht. Entfernen der Anwendung fehlgeschlagen.
 UninstallOpenError=Die Datei "%1" konnte nicht geöffnet werden. Entfernen der Anwendung fehlgeschlagen.
-UninstallUnsupportedVer=Das Format der Deinstallations-Datei "%1" konnte nicht erkannt werden. Entfernen der Anwendung fehlgeschlagen
-UninstallUnknownEntry=In der Deinstallations-Datei wurde ein unbekannter Eintrag (%1) gefunden
+UninstallUnsupportedVer=Das Format der Deinstallationsdatei "%1" konnte nicht erkannt werden. Entfernen der Anwendung fehlgeschlagen.
+UninstallUnknownEntry=In der Deinstallationsdatei wurde ein unbekannter Eintrag (%1) gefunden.
 ConfirmUninstall=Sind Sie sicher, dass Sie %1 und alle zugehörigen Komponenten entfernen möchten?
-UninstallOnlyOnWin64=Diese Installation kann nur unter 64-bit Windows-Versionen entfernt werden.
+UninstallOnlyOnWin64=Diese Installation kann nur unter 64-Bit-Windows-Versionen entfernt werden.
 OnlyAdminCanUninstall=Diese Installation kann nur von einem Benutzer mit Administrator-Rechten entfernt werden.
 UninstallStatusLabel=Warten Sie bitte, während %1 von Ihrem Computer entfernt wird.
 UninstalledAll=%1 wurde erfolgreich von Ihrem Computer entfernt.
@@ -353,7 +353,7 @@ UninstallDataCorrupted="%1"-Datei ist beschädigt. Entfernen der Anwendung fehlg
 
 ; *** Uninstallation phase messages
 ConfirmDeleteSharedFileTitle=Gemeinsame Datei entfernen?
-ConfirmDeleteSharedFile2=Das System zeigt an, dass die folgende gemeinsame Datei von keinem anderen Programm mehr benutzt wird. Möchten Sie diese Datei entfernen lassen?%nSollte es doch noch Programme geben, die diese Datei benutzen, und sie wird entfernt, funktionieren diese Programme vielleicht nicht mehr richtig. Wenn Sie unsicher sind, wählen Sie "Nein" um die Datei im System zu belassen. Es schadet Ihrem System nicht, wenn Sie die Datei behalten.
+ConfirmDeleteSharedFile2=Das System zeigt an, dass die folgende gemeinsame Datei von keinem anderen Programm mehr benutzt wird. Möchten Sie diese Datei entfernen lassen?%nSollte es doch noch Programme geben, die diese Datei benutzen und sie wird entfernt, funktionieren diese Programme vielleicht nicht mehr richtig. Wenn Sie unsicher sind, wählen Sie "Nein", um die Datei im System zu belassen. Es schadet Ihrem System nicht, wenn Sie die Datei behalten.
 SharedFileNameLabel=Dateiname:
 SharedFileLocationLabel=Ordner:
 WizardUninstalling=Entfernen (Status)

+ 30 - 7
Files/Languages/Hebrew.isl

@@ -1,7 +1,7 @@
-; *** Inno Setup version 6.0.0+ Hebrew messages (stilgar(at)divrei-tora.com) ***
+; *** Inno Setup version 6.1.0+ Hebrew messages (s_h(at)enativ.com) ***
 ;
-;
-;	Translated by s_h ([email protected]) (c) 2005
+;   https://jrsoftware.org/files/istrans/
+;	Translated by s_h ([email protected]) (c) 2020
 ;
 
 
@@ -13,8 +13,8 @@ LanguageCodePage=1255
 ; sizes, uncomment any of the following entries and change them accordingly.
 ;DialogFontName=
 ;DialogFontSize=8
-WelcomeFontName=Tahoma
-WelcomeFontSize=11
+;WelcomeFontName=Tahoma
+;WelcomeFontSize=11
 ;TitleFontName=Arial
 ;TitleFontSize=29
 ;CopyrightFontName=Arial
@@ -146,6 +146,7 @@ WizardSelectDir=
 SelectDirDesc=היכן להתקין את [name]?
 SelectDirLabel3=תוכנת ההתקנה תתקין את [name] לתוך התיקייה הבאה.
 SelectDirBrowseLabel=להמשך, לחץ על 'הבא'. אם ברצונך לבחור תיקיה אחרת להתקנה, לחץ על 'עיון'.
+DiskSpaceGBLabel=דרושים להתקנה לפחות [gb] GB של שטח דיסק פנוי.
 DiskSpaceMBLabel=דרושים להתקנה לפחות [mb] MB של שטח דיסק פנוי.
 CannotInstallToNetworkDrive=לא ניתן להתקין את התוכנה על כונן רשת.
 CannotInstallToUNCPath=לא ניתן להתקין את התוכנה בנתיב UNC.
@@ -173,6 +174,7 @@ NoUninstallWarningTitle=
 NoUninstallWarning=תוכנת ההתקנה זיהתה שהרכיבים הבאים כבר מותקנים על מחשבך:%n%n%1%nהסרת הסימון מרכיבים אלו לא תסיר אותם ממחשבך.%n%nהאם ברצונך להמשיך בכל זאת?
 ComponentSize1=%1 KB
 ComponentSize2=%1 MB
+ComponentsDiskSpaceGBLabel=להתקנת הרכיבים שנבחרו דרושים לפחות [gb] GB פנויים על כונן היעד.
 ComponentsDiskSpaceMBLabel=להתקנת הרכיבים שנבחרו דרושים לפחות [mb] MB פנויים על כונן היעד.
 
 ; *** "Select Additional Tasks" wizard page
@@ -203,6 +205,18 @@ ReadyMemoComponents=
 ReadyMemoGroup=תיקיה בתפריט 'התחל':
 ReadyMemoTasks=משימות נוספות לביצוע:
 
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=מוריד קבצים נדרשים...
+ButtonStopDownload=&עצור הורדה
+StopDownload=אתה בטוח שאתה מעוניין לעצור את ההורדה?
+ErrorDownloadAborted=הורדה בוטלה
+ErrorDownloadFailed=הורדה נכשלה: %1 %2
+ErrorDownloadSizeFailed=איחזור גודל הקובץ נכשל: %1 %2
+ErrorFileHash1=אימות מזהה  הקובץ נכשל: %2
+ErrorFileHash2=מזהה קובץ לא חוקי: מצופה %2, נמצא %2
+ErrorProgress=תהליך לא חוקי: %1 מתוך %1
+ErrorFileSize=גודל קובץ לא חוקי: מצופה %1, נמצא %1
+
 ; *** "Preparing to Install" wizard page
 WizardPreparing=מתכונן להתקנה
 PreparingDesc=תוכנת ההתקנה מתכוננת להתקנת [name] על מחשבך.
@@ -213,6 +227,7 @@ ApplicationsFound2=
 CloseApplications=&סגור יישומים אוטומטית
 DontCloseApplications=&אל תסגור יישומים אלו
 ErrorCloseApplications=המתקין אינו יכול לסגור אוטומטית את התהליכים. מומלץ שתסגור את כל התוכניות שעושות שימוש בקבצים שנדרשים לעדכון על ידי תהליך ההתקנה ולאחר מכן תמשיך בהתקנה.
+PrepareToInstallNeedsRestart=לצורך השלמת ההתקנה נדרש הפעלה מחדש של המערכת. לאחר שהמחשב יופעל מחדש, הפעל שום את המתקין לצורך השלמת ההתקנה של [name].%n%nתרצה להפעיל מחדש כעת?
 
 ; *** "Installing" wizard page
 WizardInstalling=מתקין
@@ -284,8 +299,16 @@ ExistingFileReadOnly2=
 ExistingFileReadOnlyRetry=&הסר את תוכנת קריאה בלבד ונסה שוב
 ExistingFileReadOnlyKeepExisting=&השאר את הקובץ הקיים
 ErrorReadingExistingDest=שגיאה בעת נסיון לקרוא את הקובץ הקיים:
-FileExists=הקובץ כבר קיים.%n%nהאם ברצונך שתוכנת ההתקנה תשכתב אותו?
-ExistingFileNewer=הקובץ הקיים חדש יותר מהקובץ שתוכנת ההתקנה רוצה להתקין. המלצתנו היא שתשמור על הקובץ הקיים.%n%nהאם ברצונך לשמור את הקובץ הקיים?
+FileExistsSelectAction=בחר פעולה
+FileExists2=הקובץ כבר קיים.
+FileExistsOverwriteExisting=&החלף את הקובץ הקיים
+FileExistsKeepExisting=&שמור את הקובץ הקיים
+FileExistsOverwriteOrKeepAll=&עשה זאת גם בקבצים הכפולים הבאים
+ExistingFileNewerSelectAction=בחר פעולה
+ExistingFileNewer2=הקובץ הקיים חדש יותר מהקובץ שאותו אתה מנסה להתקין
+ExistingFileNewerOverwriteExisting=&החלף את הקובץ הקיים
+ExistingFileNewerKeepExisting=&שמור את הקובץ הקיים (מומלץ)
+ExistingFileNewerOverwriteOrKeepAll=&עשה זאת גם בקבצים הכפולים הבאים
 ErrorChangingAttr=שגיאה בעת נסיון לשנות מאפיינים של הקובץ הקיים:
 ErrorCreatingTemp=שגיאה בעת נסיון ליצור קובץ בתיקיית היעד:
 ErrorReadingSource=שגיאה בעת קריאת קובץ המקור:

+ 28 - 5
Files/Languages/Icelandic.isl

@@ -1,15 +1,17 @@
-; *** Inno Setup version 6.0.3+ Icelandic messages ***
+; *** Inno Setup version 6.1.0+ Icelandic messages ***
 ;
 ; Translator: Stefán Örvar Sigmundsson, eMedia Intellect
 ; Contact: [email protected]
-; Date: 2019-10-03
+; Date: 2020-07-25
 
 [LangOptions]
+
 LanguageName=<00CD>slenska
 LanguageID=$040F
 LanguageCodePage=1252
 
 [Messages]
+
 ; *** Application titles
 SetupAppTitle=Uppsetning
 SetupWindowTitle=Uppsetning - %1
@@ -192,6 +194,18 @@ ReadyMemoComponents=Valin atriði:
 ReadyMemoGroup=Upphafsvalmyndarmappa:
 ReadyMemoTasks=Aukaleg verk:
 
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Niðurhlaðandi aukalegum skrám…
+ButtonStopDownload=&Stöðva niðurhleðslu
+StopDownload=Ert þú viss um að þú viljir stöðva niðurhleðsluna?
+ErrorDownloadAborted=Niðurhleðslu hætt
+ErrorDownloadFailed=Niðurhleðsla mistókst: %1 %2
+ErrorDownloadSizeFailed=Mistókst að sækja stærð: %1 %2
+ErrorFileHash1=Skráarhakk mistókst: %1
+ErrorFileHash2=Ógilt skráarhakk: bjóst við %1, fékk %2
+ErrorProgress=Ógild framvinda: %1 of %2
+ErrorFileSize=Ógild skráarstærð: bjóst við %1, fékk %2
+
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Undirbúandi uppsetningu
 PreparingDesc=Uppsetning er undirbúandi uppsetningu [name] á tölvuna þína.
@@ -272,8 +286,16 @@ ExistingFileReadOnly2=Hina gildandi skrá var ekki hægt að yfirrita því hún
 ExistingFileReadOnlyRetry=&Fjarlægja lesa-einungis eigindi og reyna aftur
 ExistingFileReadOnlyKeepExisting=&Halda gildandi skrá
 ErrorReadingExistingDest=Villa kom upp meðan reynt var að lesa gildandi skrána:
-FileExists=Skráin er nú þegar til.%n%nVilt þú að Uppsetning yfirriti hana?
-ExistingFileNewer=Hin gildandi skrá er nýrri en sú sem Uppsetning er reynandi að uppsetja. Það er ráðlagt að þú haldir hinni gildandi skrá.%n%nVilt þú halda hinni gildandi skrá?
+FileExistsSelectAction=Velja aðgerð
+FileExists2=Skráin er nú þegar til.
+FileExistsOverwriteExisting=&Yfirrita hina gildandi skrá
+FileExistsKeepExisting=&Halda hinni gildandi skrá
+FileExistsOverwriteOrKeepAll=&Gera þetta við næstu ósamstæður
+ExistingFileNewerSelectAction=Velja aðgerð
+ExistingFileNewer2=Hin gildandi skrá er nýrri en sú sem Uppsetning er að reyna að uppsetja.
+ExistingFileNewerOverwriteExisting=&Yfirrita hina gildandi skrá
+ExistingFileNewerKeepExisting=&Halda hinni gildandi skrá (ráðlagt)
+ExistingFileNewerOverwriteOrKeepAll=&Gera þetta við næstu ósamstæður
 ErrorChangingAttr=Villa kom upp meðan reynt var að breyta eigindum gildandi skráarinnar:
 ErrorCreatingTemp=Villa kom upp meðan reynt var að skapa skrá í staðsetningarskráasafninu:
 ErrorReadingSource=Villa kom upp meðan reynt var að lesa upprunaskrána:
@@ -324,6 +346,7 @@ ShutdownBlockReasonInstallingApp=Uppsetjandi %1.
 ShutdownBlockReasonUninstallingApp=Niðurtakandi %1.
 
 [CustomMessages]
+
 NameAndVersion=%1 útgáfa %2
 AdditionalIcons=Aukalegir skyndivísir:
 CreateDesktopIcon=Skapa &skjáborðsskyndivísi
@@ -335,4 +358,4 @@ AssocFileExtension=&Tengja %1 við %2-skráarframlenginguna
 AssocingFileExtension=&Tengjandi %1 við %2-skráarframlenginguna…
 AutoStartProgramGroupDescription=Ræsing:
 AutoStartProgram=Sjálfvikt ræsa %1
-AddonHostProgramNotFound=%1 gat ekki staðsett möppuna sem þú valdir.%n%nVilt þú halda áfram hvort sem er?
+AddonHostProgramNotFound=%1 gat ekki staðsett möppuna sem þú valdir.%n%nVilt þú halda áfram hvort sem er?

+ 25 - 5
Files/Languages/Italian.isl

@@ -1,15 +1,15 @@
 ; [email protected]
-; *** Inno Setup version 6.0.3+ Italian messages ***
+; *** Inno Setup version 6.1.0+ Italian messages ***
 ;
 ; To download user-contributed translations of this file, go to:
-;   http://www.jrsoftware.org/files/istrans/
+;    https://jrsoftware.org/files/istrans/
 ;
 ; Note: When translating this text, do not add periods (.) to the end of
 ; messages that didn't have them already, because on those messages Inno
 ; Setup adds the periods automatically (appending a period would result in
 ; two periods being displayed).
 ;
-; Italian.isl - Last Update: 03.10.2019  by bovirus ([email protected])
+; Italian.isl - Last Update: 25.07.2020  by bovirus ([email protected])
 ;
 ; Translator name:   bovirus
 ; Translator e-mail: [email protected]
@@ -216,6 +216,18 @@ ReadyMemoComponents=Componenti selezionati:
 ReadyMemoGroup=Cartella del menu Avvio/Start:
 ReadyMemoTasks=Processi aggiuntivi:
 
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Download file aggiuntivi...
+ButtonStopDownload=&Stop download
+StopDownload=Sei sicuro di voler interrompere il download?
+ErrorDownloadAborted=Download annullato
+ErrorDownloadFailed=Download fallito: %1 %2
+ErrorDownloadSizeFailed=Rilevamento dimensione fallito: %1 %2
+ErrorFileHash1=Errore hash file: %1
+ErrorFileHash2=Hash file non valido: atteso %1, trovato %2
+ErrorProgress=Progresso non valido: %1 di %2
+ErrorFileSize=Dimensione file non valida: attesa %1, trovata %2
+
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Preparazione all'installazione
 PreparingDesc=Preparazione all'installazione di [name] nel computer.
@@ -298,8 +310,16 @@ ExistingFileReadOnly2=Il file esistente non può essere sostituito in quanto seg
 ExistingFileReadOnlyRetry=&Rimuovi attributo di sola lettura e riprova
 ExistingFileReadOnlyKeepExisting=&Mantieni il file esistente
 ErrorReadingExistingDest=Si è verificato un errore durante la lettura del file esistente:
-FileExists=Il file esiste già.%n%nVuoi sovrascrivere il file?
-ExistingFileNewer=Il file esistente è più recente di quello che si sta installando.%n%nTi raccomandiamo di mantenere il file esistente.%n%nVuoi mantenere il file esistente?
+FileExistsSelectAction=Seleziona azione
+FileExists2=Il file esiste già.
+FileExistsOverwriteExisting=S&ovrascrivi il file esistente
+FileExistsKeepExisting=&Mantieni il file esistente
+FileExistsOverwriteOrKeepAll=&Applica questa azione per i prossimi conflitti
+ExistingFileNewerSelectAction=Seleziona azione
+ExistingFileNewer2=Il file esistente è più recente del file che si sta cercando di installare.
+ExistingFileNewerOverwriteExisting=S&ovrascrivi il file esistente
+ExistingFileNewerKeepExisting=&Mantieni il file esistente (suggerito)
+ExistingFileNewerOverwriteOrKeepAll=&Applica questa azione per i prossimi conflitti
 ErrorChangingAttr=Si è verificato un errore durante il tentativo di modifica dell'attributo del file esistente:
 ErrorCreatingTemp=Si è verificato un errore durante la creazione di un file nella cartella di installazione:
 ErrorReadingSource=Si è verificato un errore durante la lettura del file sorgente:

+ 23 - 3
Files/Languages/Japanese.isl

@@ -1,4 +1,4 @@
-; *** Inno Setup version 6.0.3+ Japanese messages ***
+; *** Inno Setup version 6.1.0+ Japanese messages ***
 ;
 ; Maintained by Koichi Shirasuka ([email protected])
 ;
@@ -195,6 +195,18 @@ ReadyMemoComponents=
 ReadyMemoGroup=スタートメニューフォルダー:
 ReadyMemoTasks=追加タスク一覧:
 
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=追加のファイルをダウンロードしています...
+ButtonStopDownload=ダウンロードを中止(&S)
+StopDownload=ダウンロードを中止してもよろしいですか?
+ErrorDownloadAborted=ダウンロードを中止しました
+ErrorDownloadFailed=ダウンロードに失敗しました: %1 %2
+ErrorDownloadSizeFailed=サイズの取得に失敗しました: %1 %2
+ErrorFileHash1=ファイルのハッシュに失敗しました: %1
+ErrorFileHash2=無効なファイルハッシュ: 予期された値 %1, 実際の値 %2
+ErrorProgress=無効な進行状況: %1 / %2
+ErrorFileSize=無効なファイルサイズ: 予期された値 %1, 実際の値 %2
+
 ; *** "Preparing to Install" wizard page
 WizardPreparing=インストール準備中
 PreparingDesc=ご使用のコンピューターへ [name] をインストールする準備をしています。
@@ -277,8 +289,16 @@ ExistingFileReadOnly2=
 ExistingFileReadOnlyRetry=読み取り専用属性を解除してもう一度やりなおす(&R)
 ExistingFileReadOnlyKeepExisting=既存のファイルを残す(&K)
 ErrorReadingExistingDest=既存のファイルを読み込み中にエラーが発生しました:
-FileExists=ファイルは既に存在します。%n%n上書きしますか?
-ExistingFileNewer=インストールしようとしているファイルよりも新しいファイルが存在します。既存のファイルを残すことをお奨めします。%n%n既存のファイルを残しますか?
+FileExistsSelectAction=アクションを選択してください
+FileExists2=ファイルは既に存在します。
+FileExistsOverwriteExisting=既存のファイルを上書きする(&O)
+FileExistsKeepExisting=既存のファイルを維持する(&K)
+FileExistsOverwriteOrKeepAll=以降の競合に同じ処理を行う(&D)
+ExistingFileNewerSelectAction=アクションを選択してください
+ExistingFileNewer2=セットアップがインストールしようとしているものよりも新しいファイルがあります。
+ExistingFileNewerOverwriteExisting=既存のファイルを上書きする(&O)
+ExistingFileNewerKeepExisting=既存のファイルを維持する(&K) (推奨)
+ExistingFileNewerOverwriteOrKeepAll=以降の競合に同じ処理を行う(&D)
 ErrorChangingAttr=既存ファイルの属性を変更中にエラーが発生しました:
 ErrorCreatingTemp=コピー先のフォルダーにファイルを作成中にエラーが発生しました:
 ErrorReadingSource=コピー元のファイルを読み込み中にエラーが発生しました:

+ 28 - 5
Files/Languages/Norwegian.isl

@@ -1,11 +1,14 @@
-; *** Inno Setup version 6.0.3+ Norwegian (bokmål) messages ***
+; *** Inno Setup version 6.1.0+ Norwegian (bokmål) messages ***
+;
+; To download user-contributed translations of this file, go to:
+;   https://jrsoftware.org/files/istrans/
 ;
 ; Note: When translating this text, do not add periods (.) to the end of
 ; messages that didn't have them already, because on those messages Inno
 ; Setup adds the periods automatically (appending a period would result in
 ; two periods being displayed).
 ;
-; Norwegian translation by Eivind Bakkestuen
+; Norwegian translation currently maintained by Eivind Bakkestuen
 ; E-mail: [email protected]
 ; Many thanks to the following people for language improvements and comments:
 ;
@@ -144,7 +147,7 @@ WizardSelectDir=Velg mappen hvor filene skal installeres:
 SelectDirDesc=Hvor skal [name] installeres?
 SelectDirLabel3=Installasjonsprogrammet vil installere [name] i følgende mappe.
 SelectDirBrowseLabel=Klikk på Neste for å fortsette. Klikk på Bla gjennom hvis du vil velge en annen mappe.
-DiskSpaceGBLabel=Programmet krever minst [gb] MB med diskplass.
+DiskSpaceGBLabel=Programmet krever minst [gb] GB med diskplass.
 DiskSpaceMBLabel=Programmet krever minst [mb] MB med diskplass.
 CannotInstallToNetworkDrive=Kan ikke installere på en nettverksstasjon.
 CannotInstallToUNCPath=Kan ikke installere på en UNC-bane. Du må tilordne nettverksstasjonen hvis du vil installere i et nettverk.
@@ -203,6 +206,18 @@ ReadyMemoComponents=Valgte komponenter:
 ReadyMemoGroup=Programgruppe:
 ReadyMemoTasks=Tilleggsoppgaver:
 
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Laster ned ekstra filer...
+ButtonStopDownload=&Stopp nedlasting
+StopDownload=Er du sikker på at du vil stoppe nedlastingen?
+ErrorDownloadAborted=Nedlasting avbrutt
+ErrorDownloadFailed=Nedlasting feilet: %1 %2
+ErrorDownloadSizeFailed=Kunne ikke finne filstørrelse: %1 %2
+ErrorFileHash1=Fil hash verdi feilet: %1
+ErrorFileHash2=Ugyldig fil hash verdi: forventet %1, fant %2
+ErrorProgress=Ugyldig fremdrift: %1 of %2
+ErrorFileSize=Ugyldig fil størrelse: forventet %1, fant %2
+
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Forbereder installasjonen
 PreparingDesc=Installasjonsprogrammet forbereder installasjon av [name] på den maskin.
@@ -285,8 +300,16 @@ ExistingFileReadOnly2=Den eksisterende filen er skrivebeskyttet og kan ikke erst
 ExistingFileReadOnlyRetry=&Fjern skrivebeskyttelse og prøv igjen
 ExistingFileReadOnlyKeepExisting=&Behold eksisterende fil
 ErrorReadingExistingDest=En feil oppsto under lesing av den eksisterende filen:
-FileExists=Filen eksisterer allerede.%n%nVil du overskrive den?
-ExistingFileNewer=Den eksisterende filen er nyere enn den som blir forsøkt installert. Det anbefales at du beholder den eksisterende filen.%n%nVil du beholde den eksisterende filen?
+FileExistsSelectAction=Velg aksjon
+FileExists2=Filen eksisterer allerede.
+FileExistsOverwriteExisting=&Overskriv den eksisterende filen
+FileExistsKeepExisting=&Behold den eksisterende filen
+FileExistsOverwriteOrKeepAll=&Gjør samme valg for påfølgende konflikter
+ExistingFileNewerSelectAction=Velg aksjon
+ExistingFileNewer2=Den eksisterende filen er nyere enn filen Installasjonen prøver å installere.
+ExistingFileNewerOverwriteExisting=&Overskriv den eksisterende filen
+ExistingFileNewerKeepExisting=&Behold den eksisterende filen (anbefalt)
+ExistingFileNewerOverwriteOrKeepAll=&Gjør samme valg for påfølgende konflikter
 ErrorChangingAttr=En feil oppsto da attributtene ble forsøkt forandret på den eksisterende filen:
 ErrorCreatingTemp=En feil oppsto under forsøket på å lage en fil i mål-mappen:
 ErrorReadingSource=En feil oppsto under forsøket på å lese kildefilen:

+ 43 - 24
Files/Languages/Polish.isl

@@ -1,15 +1,15 @@
-; *** Inno Setup version 6.0.3+ Polish messages ***
+; *** Inno Setup version 6.1.0+ Polish messages ***
 ; Krzysztof Cynarski <krzysztof at cynarski.net>
-; Proofreading, corrections and 6.0.0+ updates:
+; Proofreading, corrections and 5.5.7-6.1.0+ updates:
 ; Łukasz Abramczuk <lukasz.abramczuk at gmail.com>
 ; To download user-contributed translations of this file, go to:
-; http://www.jrsoftware.org/is3rdparty.php
+;   https://jrsoftware.org/files/istrans/
 ;
 ; Note: When translating this text, do not add periods (.) to the end of
 ; messages that didn't have them already, because on those messages Inno
 ; Setup adds the periods automatically (appending a period would result in
 ; two periods being displayed).
-; last update: 2019/10/03 
+; last update: 2020/07/26 
 
 [LangOptions]
 ; The following three entries are very important. Be sure to read and 
@@ -17,10 +17,9 @@
 LanguageName=Polski
 LanguageID=$0415
 LanguageCodePage=1250
- 
 
 [Messages]
-  
+
 ; *** Application titles
 SetupAppTitle=Instalator
 SetupWindowTitle=Instalacja - %1
@@ -69,7 +68,7 @@ PrivilegesRequiredOverrideCurrentUserRecommended=Zainstaluj dla &bie
 
 ; *** Misc. errors
 ErrorCreatingDir=Instalator nie mógł utworzyć katalogu "%1"
-ErrorTooManyFilesInDir=Nie można utworzyć pliku w katalogu %1, ponieważ zawiera on zbyt wiele plików
+ErrorTooManyFilesInDir=Nie można utworzyć pliku w katalogu "%1", ponieważ zawiera on zbyt wiele plików
 
 ; *** Setup common messages
 ExitSetupTitle=Zakończ instalację
@@ -78,7 +77,7 @@ AboutSetupMenuItem=&O instalatorze...
 AboutSetupTitle=O instalatorze
 AboutSetupMessage=%1 wersja %2%n%3%n%n Strona domowa %1:%n%4
 AboutSetupNote=
-TranslatorNote=Wersja polska: Krzysztof Cynarski%n<krzysztof at cynarski.net>%nKorekta: Łukasz Abramczuk%n<lukasz.abramczuk at gmail.com>
+TranslatorNote=Wersja polska: Krzysztof Cynarski%n<krzysztof at cynarski.net>%nOd wersji 5.5.7: Łukasz Abramczuk%n<lukasz.abramczuk at gmail.com>
 
 ; *** Buttons
 ButtonBack=< &Wstecz
@@ -94,7 +93,7 @@ ButtonFinish=&Zako
 ButtonBrowse=&Przeglądaj...
 ButtonWizardBrowse=P&rzeglądaj...
 ButtonNewFolder=&Utwórz nowy folder
- 
+
 ; *** "Select Language" dialog messages
 SelectLanguageTitle=Język instalacji
 SelectLanguageLabel=Wybierz język używany podczas instalacji:
@@ -191,7 +190,7 @@ GroupNameTooLong=Nazwa folderu lub 
 InvalidGroupName=Niepoprawna nazwa folderu.
 BadGroupName=Nazwa folderu nie może zawierać żadnego z następujących znaków:%n%n%1
 NoProgramGroupCheck2=&Nie twórz folderu w Menu Start
-	
+
 ; *** "Ready to Install" wizard page
 WizardReady=Gotowy do rozpoczęcia instalacji
 ReadyLabel1=Instalator jest już gotowy do rozpoczęcia instalacji aplikacji [name] na komputerze.
@@ -203,7 +202,19 @@ ReadyMemoType=Rodzaj instalacji:
 ReadyMemoComponents=Wybrane komponenty:
 ReadyMemoGroup=Folder w Menu Start:
 ReadyMemoTasks=Dodatkowe zadania:
-  
+
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Pobieranie dodatkowych plików...
+ButtonStopDownload=&Zatrzymaj pobieranie
+StopDownload=Czy na pewno chcesz zatrzymać pobieranie?
+ErrorDownloadAborted=Pobieranie przerwane
+ErrorDownloadFailed=Błąd pobierania: %1 %2
+ErrorDownloadSizeFailed=Pobieranie informacji o rozmiarze nie powiodło się: %1 %2
+ErrorFileHash1=Błąd sumy kontrolnej pliku: %1
+ErrorFileHash2=Nieprawidłowa suma kontrolna pliku: oczekiwano %1, otrzymano %2
+ErrorProgress=Nieprawidłowy postęp: %1 z %2
+ErrorFileSize=Nieprawidłowy rozmiar pliku: oczekiwano %1, otrzymano %2
+
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Przygotowanie do instalacji
 PreparingDesc=Instalator przygotowuje instalację aplikacji [name] na komputerze.
@@ -214,12 +225,12 @@ ApplicationsFound2=Poni
 CloseApplications=&Automatycznie zamknij aplikacje
 DontCloseApplications=&Nie zamykaj aplikacji
 ErrorCloseApplications=Instalator nie był w stanie automatycznie zamknąć wymaganych aplikacji. Zalecane jest zamknięcie wszystkich aplikacji, które aktualnie używają uaktualnianych przez program instalacyjny plików.
-PrepareToInstallNeedsRestart=Instalator wymaga ponownego uruchomienia komputera. Po zrestartowaniu komputera uruchom instalator ponownie, by dokończyć proces instalacji aplikacji [name].%n%nCzy chcesz teraz uruchomić komputer ponownie?
+PrepareToInstallNeedsRestart=Instalator wymaga ponownego uruchomienia komputera. Po restarcie komputera uruchom instalator ponownie, by dokończyć proces instalacji aplikacji [name].%n%nCzy chcesz teraz uruchomić komputer ponownie?
 
 ; *** "Installing" wizard page
 WizardInstalling=Instalacja
 InstallingLabel=Poczekaj, aż instalator zainstaluje aplikację [name] na komputerze.
- 
+
 ; *** "Setup Completed" wizard page
 FinishedHeadingLabel=Zakończono instalację aplikacji [name]
 FinishedLabelNoIcons=Instalator zakończył instalację aplikacji [name] na komputerze.
@@ -234,21 +245,21 @@ NoRadio=&Nie, uruchomi
 RunEntryExec=Uruchom aplikację %1
 ; used for example as 'View Readme.txt'
 RunEntryShellExec=Wyświetl plik %1
- 
+
 ; *** "Setup Needs the Next Disk" stuff
 ChangeDiskTitle=Instalator potrzebuje kolejnego archiwum
 SelectDiskLabel2=Proszę włożyć dysk %1 i kliknąć przycisk OK.%n%nJeśli wymieniony poniżej folder nie określa położenia plików z tego dysku, proszę wprowadzić poprawną ścieżkę lub kliknąć przycisk Przeglądaj.
 PathLabel=Ś&cieżka:
 FileNotInDir2=Ścieżka "%2" nie zawiera pliku "%1". Proszę włożyć właściwy dysk lub wybrać inny folder.
 SelectDirectoryLabel=Proszę określić lokalizację kolejnego archiwum instalatora.
-  
+
 ; *** Installation phase messages
 SetupAborted=Instalacja nie została zakończona.%n%nProszę rozwiązać problem i ponownie rozpocząć instalację.
 AbortRetryIgnoreSelectAction=Wybierz operację
 AbortRetryIgnoreRetry=Spróbuj &ponownie
 AbortRetryIgnoreIgnore=Z&ignoruj błąd i kontynuuj
 AbortRetryIgnoreCancel=Przerwij instalację
-  
+
 ; *** Installation status messages
 StatusClosingApplications=Zamykanie aplikacji...
 StatusCreateDirs=Tworzenie folderów...
@@ -261,7 +272,7 @@ StatusSavingUninstall=Zapisywanie informacji o dezinstalacji...
 StatusRunProgram=Kończenie instalacji...
 StatusRestartingApplications=Ponowne uruchamianie aplikacji...
 StatusRollback=Cofanie zmian...
- 
+
 ; *** Misc. errors
 ErrorInternal2=Wewnętrzny błąd: %1
 ErrorFunctionFailedNoCode=Błąd podczas wykonywania %1
@@ -273,10 +284,10 @@ ErrorExecutingProgram=Nie mo
 ErrorRegOpenKey=Błąd podczas otwierania klucza rejestru:%n%1\%2
 ErrorRegCreateKey=Błąd podczas tworzenia klucza rejestru:%n%1\%2
 ErrorRegWriteKey=Błąd podczas zapisu do klucza rejestru:%n%1\%2
- 
+
 ; *** INI errors
 ErrorIniEntry=Błąd podczas tworzenia pozycji w pliku INI: "%1".
- 
+
 ; *** File copying errors
 FileAbortRetryIgnoreSkipNotRecommended=&Pomiń plik (niezalecane)
 FileAbortRetryIgnoreIgnoreNotRecommended=Z&ignoruj błąd i kontynuuj (niezalecane)
@@ -286,8 +297,16 @@ ExistingFileReadOnly2=Istniej
 ExistingFileReadOnlyRetry=&Usuń atrybut "Tylko do odczytu" i spróbuj ponownie
 ExistingFileReadOnlyKeepExisting=&Zachowaj istniejący plik
 ErrorReadingExistingDest=Wystąpił błąd podczas próby odczytu istniejącego pliku:
-FileExists=Plik już istnieje.%n%nCzy chcesz, aby instalator nadpisał go własną wersją?
-ExistingFileNewer=Istniejący plik jest nowszy niż ten, który instalator próbuje skopiować. Zalecanym jest zachowanie istniejącego pliku.%n%nCzy chcesz zachować istniejący plik?
+FileExistsSelectAction=Wybierz czynność
+FileExists2=Plik już istnieje.
+FileExistsOverwriteExisting=&Nadpisz istniejący plik
+FileExistsKeepExisting=&Zachowaj istniejący plik
+FileExistsOverwriteOrKeepAll=&Wykonaj tę czynność dla kolejnych przypadków
+ExistingFileNewerSelectAction=Wybierz czynność
+ExistingFileNewer2=Istniejący plik jest nowszy niż ten, który instalator próbuje skopiować.
+ExistingFileNewerOverwriteExisting=&Nadpisz istniejący plik
+ExistingFileNewerKeepExisting=&Zachowaj istniejący plik (zalecane)
+ExistingFileNewerOverwriteOrKeepAll=&Wykonaj tę czynność dla kolejnych przypadków
 ErrorChangingAttr=Wystąpił błąd podczas próby zmiany atrybutów pliku docelowego:
 ErrorCreatingTemp=Wystąpił błąd podczas próby utworzenia pliku w folderze docelowym:
 ErrorReadingSource=Wystąpił błąd podczas próby odczytu pliku źródłowego:
@@ -338,10 +357,10 @@ StatusUninstalling=Dezinstalacja aplikacji %1...
 ; *** Shutdown block reasons
 ShutdownBlockReasonInstallingApp=Instalacja aplikacji %1.
 ShutdownBlockReasonUninstallingApp=Dezinstalacja aplikacji %1.
- 
+
 ; The custom messages below aren't used by Setup itself, but if you make
 ; use of them in your scripts, you'll want to translate them.
- 
+
 [CustomMessages]
 
 NameAndVersion=%1 (wersja %2)
@@ -355,4 +374,4 @@ AssocFileExtension=&Przypisz aplikacj
 AssocingFileExtension=Przypisywanie aplikacji %1 do rozszerzenia pliku %2...
 AutoStartProgramGroupDescription=Autostart:
 AutoStartProgram=Automatycznie uruchamiaj aplikację %1
-AddonHostProgramNotFound=Aplikacja %1 nie została znaleziona we wskazanym przez Ciebie folderze.%n%nCzy pomimo tego chcesz kontynuować?
+AddonHostProgramNotFound=Aplikacja %1 nie została znaleziona we wskazanym przez Ciebie folderze.%n%nCzy pomimo tego chcesz kontynuować?

+ 23 - 3
Files/Languages/Portuguese.isl

@@ -1,4 +1,4 @@
-; *** Inno Setup version 6.0.3+ Portuguese (Portugal) messages ***
+; *** Inno Setup version 6.1.0+ Portuguese (Portugal) messages ***
 ;
 ; Maintained by Nuno Silva (nars AT gmx.net)
 
@@ -192,6 +192,18 @@ ReadyMemoComponents=Componentes seleccionados:
 ReadyMemoGroup=Pasta do Menu Iniciar:
 ReadyMemoTasks=Tarefas adicionais:
 
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=A transferir ficheiros adicionais...
+ButtonStopDownload=&Parar transferência
+StopDownload=Tem a certeza que deseja parar a transferência?
+ErrorDownloadAborted=Transferência cancelada
+ErrorDownloadFailed=Falha na transferência: %1 %2
+ErrorDownloadSizeFailed=Falha ao obter tamanho: %1 %2
+ErrorFileHash1=Falha de verificação do ficheiro: %1
+ErrorFileHash2=Hash do ficheiro inválida: experado %1, encontrado %2
+ErrorProgress=Progresso inválido: %1 de %2
+ErrorFileSize=Tamanho de ficheiro inválido: experado %1, encontrado %2
+
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Preparando-se para instalar
 PreparingDesc=Preparando-se para instalar o [name] no seu computador.
@@ -274,8 +286,16 @@ ExistingFileReadOnly2=O ficheiro existente n
 ExistingFileReadOnlyRetry=&Remover o atributo "só de leitura" e tentar novamente
 ExistingFileReadOnlyKeepExisting=&Manter o ficheiro existente
 ErrorReadingExistingDest=Ocorreu um erro ao tentar ler o ficheiro existente:
-FileExists=O ficheiro já existe.%n%nDeseja substituí-lo?
-ExistingFileNewer=O ficheiro existente é mais recente que o que está a ser instalado. É recomendado que mantenha o ficheiro existente.%n%nDeseja manter o ficheiro existente?
+FileExistsSelectAction=Seleccione uma acção
+FileExists2=O ficheiro já existe.
+FileExistsOverwriteExisting=&Substituir o ficheiro existente
+FileExistsKeepExisting=&Manter o ficheiro existente
+FileExistsOverwriteOrKeepAll=&Fazer isto para os próximos conflitos
+ExistingFileNewerSelectAction=Seleccione uma acção
+ExistingFileNewer2=O ficheiro existente é mais recente que o que está a ser instalado.
+ExistingFileNewerOverwriteExisting=&Substituir o ficheiro existente
+ExistingFileNewerKeepExisting=&Manter o ficheiro existente (recomendado)
+ExistingFileNewerOverwriteOrKeepAll=&Fazer isto para os próximos conflitos
 ErrorChangingAttr=Ocorreu um erro ao tentar alterar os atributos do ficheiro existente:
 ErrorCreatingTemp=Ocorreu um erro ao tentar criar um ficheiro na directoria de destino:
 ErrorReadingSource=Ocorreu um erro ao tentar ler o ficheiro de origem:

+ 27 - 4
Files/Languages/Russian.isl

@@ -1,4 +1,4 @@
-; *** Inno Setup version 6.0.3+ Russian messages ***
+; *** Inno Setup version 6.1.0+ Russian messages ***
 ;
 ; Translated from English by Dmitry Kann, yktooo at gmail.com
 ;
@@ -29,6 +29,7 @@ ErrorTitle=
 SetupLdrStartupMessage=Данная программа установит %1 на ваш компьютер, продолжить?
 LdrCannotCreateTemp=Невозможно создать временный файл. Установка прервана
 LdrCannotExecTemp=Невозможно выполнить файл во временном каталоге. Установка прервана
+HelpTextNote=
 
 ; *** Startup error messages
 LastErrorMessage=%1.%n%nОшибка %2: %3
@@ -89,7 +90,7 @@ ButtonNewFolder=&
 
 ; *** "Select Language" dialog messages
 SelectLanguageTitle=Выберите язык установки
-SelectLanguageLabel=Выберите язык, который будет использован в  процессе установки.
+SelectLanguageLabel=Выберите язык, который будет использован в процессе установки.
 
 ; *** Common wizard text
 ClickNext=Нажмите «Далее», чтобы продолжить, или «Отмена», чтобы выйти из программы установки.
@@ -137,6 +138,7 @@ WizardSelectDir=
 SelectDirDesc=В какую папку вы хотите установить [name]?
 SelectDirLabel3=Программа установит [name] в следующую папку.
 SelectDirBrowseLabel=Нажмите «Далее», чтобы продолжить. Если вы хотите выбрать другую папку, нажмите «Обзор».
+DiskSpaceGBLabel=Требуется как минимум [gb] Гб свободного дискового пространства.
 DiskSpaceMBLabel=Требуется как минимум [mb] Мб свободного дискового пространства.
 CannotInstallToNetworkDrive=Установка не может производиться на сетевой диск.
 CannotInstallToUNCPath=Установка не может производиться в папку по UNC-пути.
@@ -164,6 +166,7 @@ NoUninstallWarningTitle=
 NoUninstallWarning=Программа установки обнаружила, что следующие компоненты уже установлены на вашем компьютере:%n%n%1%n%nОтмена выбора этих компонент не удалит их.%n%nПродолжить?
 ComponentSize1=%1 Кб
 ComponentSize2=%1 Мб
+ComponentsDiskSpaceGBLabel=Текущий выбор требует не менее [gb] Гб на диске.
 ComponentsDiskSpaceMBLabel=Текущий выбор требует не менее [mb] Мб на диске.
 
 ; *** "Select Additional Tasks" wizard page
@@ -194,6 +197,18 @@ ReadyMemoComponents=
 ReadyMemoGroup=Папка в меню «Пуск»:
 ReadyMemoTasks=Дополнительные задачи:
 
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Загрузка дополнительных файлов...
+ButtonStopDownload=&Прервать загрузку
+StopDownload=Вы действительно хотите прекратить загрузку?
+ErrorDownloadAborted=Загрузка прервана
+ErrorDownloadFailed=Ошибка загрузки: %1 %2
+ErrorDownloadSizeFailed=Ошибка получения размера: %1 %2
+ErrorFileHash1=Ошибка хэша файла: %1
+ErrorFileHash2=Неверный хэш файла: ожидался %1, получен %2
+ErrorProgress=Ошибка выполнения: %1 из %2
+ErrorFileSize=Неверный размер файла: ожидался %1, получен %2
+
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Подготовка к установке
 PreparingDesc=Программа установки подготавливается к установке [name] на ваш компьютер.
@@ -276,8 +291,16 @@ ExistingFileReadOnly2=
 ExistingFileReadOnlyRetry=&Удалить атрибут «только для чтения» и повторить попытку
 ExistingFileReadOnlyKeepExisting=&Оставить файл на месте
 ErrorReadingExistingDest=Произошла ошибка при попытке чтения существующего файла:
-FileExists=Файл уже существует.%n%nПерезаписать его?
-ExistingFileNewer=Существующий файл более новый, чем устанавливаемый. Рекомендуется сохранить существующий файл.%n%nВы хотите сохранить существующий файл?
+FileExistsSelectAction=Выберите действие
+FileExists2=Файл уже существует.
+FileExistsOverwriteExisting=&Заменить существующий файл
+FileExistsKeepExisting=&Сохранить существующий файл
+FileExistsOverwriteOrKeepAll=&Повторить действие для всех последующих конфликтов
+ExistingFileNewerSelectAction=Выберите действие
+ExistingFileNewer2=Существующий файл более новый, чем устанавливаемый.
+ExistingFileNewerOverwriteExisting=&Заменить существующий файл
+ExistingFileNewerKeepExisting=&Сохранить существующий файл (рекомендуется)
+ExistingFileNewerOverwriteOrKeepAll=&Повторить действие для всех последующих конфликтов
 ErrorChangingAttr=Произошла ошибка при попытке изменения атрибутов существующего файла:
 ErrorCreatingTemp=Произошла ошибка при попытке создания файла в папке назначения:
 ErrorReadingSource=Произошла ошибка при попытке чтения исходного файла:

+ 23 - 5
Files/Languages/Slovenian.isl

@@ -1,4 +1,4 @@
-; *** Inno Setup version 6.0.3+ Slovenian messages ***
+; *** Inno Setup version 6.1.0+ Slovenian messages ***
 ;
 ; To download user-contributed translations of this file, go to:
 ;   http://www.jrsoftware.org/is3rdparty.php
@@ -9,8 +9,6 @@
 ; two periods being displayed).
 ;
 ; Maintained by Jernej Simoncic ([email protected])
-;
-; $jrsoftware: issrc/Files/Languages/Slovenian.isl,v 1.14 2007/02/27 18:22:41 jr Exp $
 
 [LangOptions]
 LanguageName=Slovenski
@@ -202,6 +200,18 @@ ReadyMemoComponents=Izbrane komponente:
 ReadyMemoGroup=Mapa v meniju »Začetek«:
 ReadyMemoTasks=Dodatna opravila:
 
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Prenašam dodatne datoteke...
+ButtonStopDownload=Prekini preno&s
+StopDownload=Ali res želite prekiniti prenos?
+ErrorDownloadAborted=Prenos prekinjen
+ErrorDownloadFailed=Prenos ni uspel: %1 %2
+ErrorDownloadSizeFailed=Pridobivanje velikosti ni uspelo: %1 %2
+ErrorFileHash1=Pridobivanje zgoščene vrednosti ni uspelo: %1
+ErrorFileHash2=Neveljavna zgoščena vrednost: pričakovana %1, dobljena %2
+ErrorProgress=Neveljaven potek: %1 od %2
+ErrorFileSize=Neveljavna velikost datoteke: pričakovana %1, dobljena %2
+
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Pripravljam za namestitev
 PreparingDesc=Namestitveni program je pripravljen za namestitev programa [name] v vaš računalnik.
@@ -286,8 +296,16 @@ ExistingFileReadOnly2=Obstoje
 ExistingFileReadOnlyRetry=Odst&rani oznako samo za branje in poizkusi ponovno
 ExistingFileReadOnlyKeepExisting=&Ohrani obstoječo datoteko
 ErrorReadingExistingDest=Pri branju obstoječe datoteke je prišlo do napake:
-FileExists=Datoteka že obstaja.%n%nŽelite, da jo namestitveni program prepiše?
-ExistingFileNewer=V računalniku je nameščena različica datoteke, ki je novejša, kot ta, ki je v namestitvenem programu. Priporočljivo je, da obdržite obstoječo datoteko.%n%nŽelite obdržati obstoječo datoteko?
+FileExistsSelectAction=Izberite dejanje
+FileExists2=Datoteka že obstaja.
+FileExistsOverwriteExisting=&Prepiši obstoječo datoteko
+FileExistsKeepExisting=&Ohrani trenutno datoteko
+FileExistsOverwriteOrKeepAll=&To naredite za preostale spore
+ExistingFileNewerSelectAction=Izberite dejanje
+ExistingFileNewer2=Obstoječa datoteka je novejša, kot datoteka, ki se namešča.
+ExistingFileNewerOverwriteExisting=&Prepiši obstoječo datoteko
+ExistingFileNewerKeepExisting=&Ohrani trenutno datoteko (priporočeno)
+ExistingFileNewerOverwriteOrKeepAll=&To naredite za preostale spore
 ErrorChangingAttr=Pri poskusu spremembe lastnosti datoteke je prišlo do napake:
 ErrorCreatingTemp=Pri ustvarjanju datoteke v ciljni mapi je prišlo do napake:
 ErrorReadingSource=Pri branju izvorne datoteke je prišlo do napake:

+ 30 - 5
Files/Languages/Spanish.isl

@@ -1,8 +1,8 @@
-; *** Inno Setup version 6.0.0+ Spanish messages ***
+; *** Inno Setup version 6.1.0+ Spanish messages ***
 ;
 ; Maintained by Jorge Andres Brugger ([email protected])
-; Spanish.isl version 1.4 (20180208)
-; Default.isl version 6.0.0
+; Spanish.isl version 1.5 (20200727)
+; Default.isl version 6.1.0
 ; 
 ; Thanks to Germán Giraldo, Jordi Latorre, Ximo Tamarit, Emiliano Llano, 
 ; Ramón Verduzco, Graciela García,  Carles Millan and Rafael Barranco-Droege
@@ -150,6 +150,7 @@ WizardSelectDir=Seleccione la Carpeta de Destino
 SelectDirDesc=¿Dónde debe instalarse [name]?
 SelectDirLabel3=El programa instalará [name] en la siguiente carpeta.
 SelectDirBrowseLabel=Para continuar, haga clic en Siguiente. Si desea seleccionar una carpeta diferente, haga clic en Examinar.
+DiskSpaceGBLabel=Se requieren al menos [gb] GB de espacio libre en el disco.
 DiskSpaceMBLabel=Se requieren al menos [mb] MB de espacio libre en el disco.
 CannotInstallToNetworkDrive=El programa de instalación no puede realizar la instalación en una unidad de red.
 CannotInstallToUNCPath=El programa de instalación no puede realizar la instalación en una ruta de acceso UNC.
@@ -177,6 +178,7 @@ NoUninstallWarningTitle=Componentes Encontrados
 NoUninstallWarning=El programa de instalación ha detectado que los siguientes componentes ya están instalados en su sistema:%n%n%1%n%nDesmarcar estos componentes no los desinstalará.%n%n¿Desea continuar de todos modos?
 ComponentSize1=%1 KB
 ComponentSize2=%1 MB
+ComponentsDiskSpaceGBLabel=La selección actual requiere al menos [gb] GB de espacio en disco.
 ComponentsDiskSpaceMBLabel=La selección actual requiere al menos [mb] MB de espacio en disco.
 
 ; *** "Select Additional Tasks" wizard page
@@ -207,6 +209,18 @@ ReadyMemoComponents=Componentes Seleccionados:
 ReadyMemoGroup=Carpeta del Menú Inicio:
 ReadyMemoTasks=Tareas Adicionales:
 
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Descargando archivos adicionales...
+ButtonStopDownload=&Detener descarga
+StopDownload=¿Está seguiro que desea detener la descarga?
+ErrorDownloadAborted=Descarga cancelada
+ErrorDownloadFailed=Falló descarga: %1 %2
+ErrorDownloadSizeFailed=Falló obtención de tamaño: %1 %2
+ErrorFileHash1=Falló hash del archivo: %1
+ErrorFileHash2=Hash de archivo no válido: esperado %1, encontrado %2
+ErrorProgress=Progreso no válido: %1 de %2
+ErrorFileSize=Tamaño de archivo no válido: esperado %1, encontrado %2
+
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Preparándose para Instalar
 PreparingDesc=El programa de instalación está preparándose para instalar [name] en su sistema.
@@ -217,6 +231,7 @@ ApplicationsFound2=Las siguientes aplicaciones est
 CloseApplications=&Cerrar automáticamente las aplicaciones
 DontCloseApplications=&No cerrar las aplicaciones
 ErrorCloseApplications=El programa de instalación no pudo cerrar de forma automática todas las aplicaciones. Se recomienda que, antes de continuar, cierre todas las aplicaciones que utilicen archivos que necesitan ser actualizados por el programa de instalación.
+PrepareToInstallNeedsRestart=El programa de instalación necesita reiniciar el sistema. Una vez que se haya reiniciado ejecute nuevamente el programa de instalación para completar la instalación de [name].%n%n¿Desea reiniciar el sistema ahora?
 
 ; *** "Installing" wizard page
 WizardInstalling=Instalando
@@ -288,8 +303,16 @@ ExistingFileReadOnly2=El archivo existente no puede ser reemplazado debido a que
 ExistingFileReadOnlyRetry=&Elimine el atributo de sólo-lectura y reintente
 ExistingFileReadOnlyKeepExisting=&Mantener el archivo existente
 ErrorReadingExistingDest=Ocurrió un error mientras se intentaba leer el archivo:
-FileExists=El archivo ya existe.%n%n¿Desea sobreescribirlo?
-ExistingFileNewer=El archivo existente es más reciente que el que está tratando de instalar. Se recomienda que mantenga el archivo existente.%n%n¿Desea mantener el archivo existente?
+FileExistsSelectAction=Seleccione acción
+FileExists2=El archivo ya existe.
+FileExistsOverwriteExisting=&Sobreescribir el archivo existente
+FileExistsKeepExisting=&Mantener el archivo existente
+FileExistsOverwriteOrKeepAll=&Hacer lo mimso para lo siguientes conflictos
+ExistingFileNewerSelectAction=Seleccione acción
+ExistingFileNewer2=El archivo existente es más reciente que el que se está tratando de instalar.
+ExistingFileNewerOverwriteExisting=&Sobreescribir el archivo existente
+ExistingFileNewerKeepExisting=&Mantener el archivo existente (recomendado)
+ExistingFileNewerOverwriteOrKeepAll=&Hacer lo mimso para lo siguientes conflictos
 ErrorChangingAttr=Ocurrió un error al intentar cambiar los atributos del archivo:
 ErrorCreatingTemp=Ocurrió un error al intentar crear un archivo en la carpeta de destino:
 ErrorReadingSource=Ocurrió un error al intentar leer el archivo de origen:
@@ -302,7 +325,9 @@ ErrorRegSvr32Failed=RegSvr32 fall
 ErrorRegisterTypeLib=Imposible registrar la librería de tipos: %1
 
 ; *** Uninstall display name markings
+; used for example as 'My Program (32-bit)'
 UninstallDisplayNameMark=%1 (%2)
+; used for example as 'My Program (32-bit, All users)'
 UninstallDisplayNameMarks=%1 (%2, %3)
 UninstallDisplayNameMark32Bit=32-bit
 UninstallDisplayNameMark64Bit=64-bit

+ 26 - 6
Files/Languages/Turkish.isl

@@ -1,7 +1,7 @@
-; *** Inno Setup version 6.0.3+ Turkish messages ***
-; Language	"Turkce" Turkish Translate by "Ceviren"	Kaya Zeren [email protected]
+; *** Inno Setup version 6.1.0+ Turkish messages ***
+; Language	"Turkce" Turkish Translate by "Ceviren"	Kaya Zeren [email protected]
 ; To download user-contributed translations of this file, go to:
-;   http://www.jrsoftware.org/files/istrans/
+;   https://www.jrsoftware.org/files/istrans/
 ;
 ; Note: When translating this text, do not add periods (.) to the end of
 ; messages that didn't have them already, because on those messages Inno
@@ -210,6 +210,18 @@ ReadyMemoComponents=Se
 ReadyMemoGroup=Başlat Menüsü klasörü:
 ReadyMemoTasks=Ek işlemler:
 
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Ek dosyalar indiriliyor...
+ButtonStopDownload=İndirmeyi &durdur
+StopDownload=İndirmeyi durdurmak istediğinize emin misiniz?
+ErrorDownloadAborted=İndirme durduruldu
+ErrorDownloadFailed=İndirilemedi: %1 %2
+ErrorDownloadSizeFailed=Boyut alınamadı: %1 %2
+ErrorFileHash1=Dosya karması doğrulanamadı: %1
+ErrorFileHash2=Dosya karması geçersiz: %1 olması gerekirken %2
+ErrorProgress=Adım geçersiz: %1 / %2
+ErrorFileSize=Dosya boyutu geçersiz: %1 olması gerekirken %2
+
 ; *** "Kuruluma Hazırlanılıyor" sayfası
 WizardPreparing=Kuruluma Hazırlanılıyor
 PreparingDesc=[name] bilgisayarınıza kurulmaya hazırlanıyor.
@@ -292,10 +304,18 @@ ExistingFileReadOnly2=Var olan dosya salt okunabilir olarak i
 ExistingFileReadOnlyRetry=&Salt okunur işareti kaldırılıp yeniden denensin
 ExistingFileReadOnlyKeepExisting=&Var olan dosya korunsun
 ErrorReadingExistingDest=Var olan dosya okunmaya çalışılırken bir sorun çıktı.
-FileExists=Dosya zaten var.%n%nKurulum yardımcısı bu dosyanın üzerine yazsın mı?
-ExistingFileNewer=Var olan dosya, kurulum yardımcısı tarafından yazılmaya çalışılandan daha yeni. Var olan dosyayı korumanız önerilir %n%nVar olan dosya korunsun mu?
+FileExistsSelectAction=Yapılacak işlemi seçin
+FileExists2=Dosya zaten var.
+FileExists=&Var olan osyanın üzerine yazılsın
+FileExistsKeepExisting=Var &olan dosya korunsun
+FileExistsOverwriteOrKeepAll=&Sonraki çakışmalarda da bu işlem yapılsın
+ExistingFileNewerSelectAction=Yapılacak işlemi seçin
+ExistingFileNewer2=Var olan dosya, kurulum yardımcısı tarafından yazılmaya çalışılandan daha yeni.
+ExistingFileNewerOverwriteExisting=&Var olan dosyanın üzerine yazılsın
+ExistingFileNewerKeepExisting=Var &olan dosya korunsun (önerilir)
+ExistingFileNewerOverwriteOrKeepAll=&Sonraki çakışmalarda bu işlem yapılsın
 ErrorChangingAttr=Var olan dosyanın öznitelikleri değiştirilirken bir sorun çıktı:
-ErrorCreatingTemp=Hedef klasörde bir dosya oluşturulurken sorun çıktı:
+ErrorCreatingTemp=Hedef klasörde bir dosya oluşturulurken bir sorun çıktı:
 ErrorReadingSource=Kaynak dosya okunurken bir sorun çıktı:
 ErrorCopying=Dosya kopyalanırken bir sorun çıktı:
 ErrorReplacingExistingFile=Var olan dosya değiştirilirken bir sorun çıktı:

+ 106 - 103
Files/Languages/Unofficial/Croatian.isl

@@ -1,4 +1,4 @@
-; *** Inno Setup version 6.0.0+ Croatian messages ***
+; *** Inno Setup version 6.0.3+ Croatian messages ***
 ; Translated by: Milo Ivir ([email protected])
 ; Based on translation by Elvis Gambiraža ([email protected])
 ; Based on translation by Krunoslav Kanjuh ([email protected])
@@ -42,7 +42,7 @@ ConfirmTitle=Potvrda
 ErrorTitle=Greška
 
 ; *** SetupLdr messages
-SetupLdrStartupMessage=Ovime ćeš instalirati %1. Želiš li nastaviti?
+SetupLdrStartupMessage=Ovime će se instalirati %1. Želiš li nastaviti?
 LdrCannotCreateTemp=Nije moguće stvoriti privremenu datoteku. Instalacija je prekinuta
 LdrCannotExecTemp=Nije moguće pokrenuti datoteku u privremenoj mapi. Instalacija je prekinuta
 HelpTextNote=
@@ -54,23 +54,23 @@ SetupFileCorrupt=Datoteke instalacije su oštećene. Nabavi novu kopiju programa
 SetupFileCorruptOrWrongVer=Datoteke instalacije su oštećene ili nisu kompatibilne s ovom verzijom instalacije. Ispravi problem ili nabavi novu kopiju programa.
 InvalidParameter=Neispravan parametar je prenijet u naredbenom retku:%n%n%1
 SetupAlreadyRunning=Instalacija je već pokrenuta.
-WindowsVersionNotSupported=Program ne podržava verziju Windowsa koju koristite.
+WindowsVersionNotSupported=Program ne podržava Windows verziju koju koristiš.
 WindowsServicePackRequired=Program zahtijeva %1 servisni paket %2 ili noviji.
-NotOnThisPlatform=Ovaj program neće raditi na %1.
-OnlyOnThisPlatform=Ovaj program se mora pokrenuti na %1.
-OnlyOnTheseArchitectures=Ovaj program može biti instaliran na verziji Windowsa dizajniranim za sljedeću procesorsku arhitekturu:%n%n%1
-WinVersionTooLowError=Ovaj program zahtijeva %1 verziju %2 ili noviju.
-WinVersionTooHighError=Ovaj program se ne može instalirati na %1 verziji %2 ili novijoj.
-AdminPrivilegesRequired=Morate biti prijavljeni kao administrator prilikom instaliranja ovog programa.
-PowerUserPrivilegesRequired=Morate biti prijavljeni kao administrator ili član grupe naprednih korisnika prilikom instaliranja ovog programa.
-SetupAppRunningError=Instalacija je otkrila da je %1 pokrenut.%n%nZatvorite program i potom kliknite "Dalje" za nastavak ili "Odustani" za prekid instalacije.
-UninstallAppRunningError=Deinstalacija je otkrila da je %1 pokrenut.%n%nZatvorite program i potom kliknite "Dalje" za nastavak ili "Odustani" za prekid instalacije.
+NotOnThisPlatform=Program neće raditi na %1.
+OnlyOnThisPlatform=Program se mora pokrenuti na %1.
+OnlyOnTheseArchitectures=Program se može instalirati na Windows verzijama za sljedeće procesorske arhitekture:%n%n%1
+WinVersionTooLowError=Program zahtijeva %1 verziju %2 ili noviju.
+WinVersionTooHighError=Program se ne može instalirati na %1 verziji %2 ili novijoj.
+AdminPrivilegesRequired=Za instaliranje programa moraš biti prijavljen/a kao administrator.
+PowerUserPrivilegesRequired=Za instaliranje programa moraš biti prijavljen/a kao administrator ili kao član grupe naprednih korisnika.
+SetupAppRunningError=Instalacija je otkrila da je %1 trenutačno pokrenut.%n%nZatvori program i potom pritisni "Dalje" za nastavak ili "Odustani" za prekid.
+UninstallAppRunningError=Deinstalacija je otkrila da je %1 trenutačno pokrenut.%n%nZatvori program i potom pritisni "Dalje" za nastavak ili "Odustani" za prekid.
 
 ; *** Startup questions
-PrivilegesRequiredOverrideTitle=Odaberite način instaliranja
-PrivilegesRequiredOverrideInstruction=Odaberite način instaliranja
-PrivilegesRequiredOverrideText1=%1 se može instalirati za sve korisnike (zahtijeva administrativna prava) ili samo za vas.
-PrivilegesRequiredOverrideText2=%1 se može instalirati samo za vas ili za sve korisnike (zahtijeva administrativna prava).
+PrivilegesRequiredOverrideTitle=Odaberi način instaliranja
+PrivilegesRequiredOverrideInstruction=Odaberi način instaliranja
+PrivilegesRequiredOverrideText1=%1 se može instalirati za sve korisnike (potrebna su administratorska prava) ili samo za tebe.
+PrivilegesRequiredOverrideText2=%1 se može instalirati samo za tebe ili za sve korisnike (potrebna su administratorska prava).
 PrivilegesRequiredOverrideAllUsers=Instaliraj z&a sve korisnike
 PrivilegesRequiredOverrideAllUsersRecommended=Instaliraj z&a sve korisnike (preporučeno)
 PrivilegesRequiredOverrideCurrentUser=Instaliraj samo za &mene
@@ -78,11 +78,11 @@ PrivilegesRequiredOverrideCurrentUserRecommended=Instaliraj samo za &mene (prepo
 
 ; *** Misc. errors
 ErrorCreatingDir=Instalacija nije mogla stvoriti mapu "%1"
-ErrorTooManyFilesInDir=Nemoguće stvaranje datoteke u mapi "%1", jer ona sadrži previše datoteka
+ErrorTooManyFilesInDir=Datoteku nije moguće stvoriti u mapi "%1", jer mapa sadrži previše datoteka
 
 ; *** Setup common messages
 ExitSetupTitle=Prekini instalaciju
-ExitSetupMessage=Instalacija nije završena. Ako sad izađete, program neće biti instaliran.%n%nInstalaciju možete pokrenuti kasnije, ukoliko ju želite završiti.%n%nPrekinuti instalaciju?
+ExitSetupMessage=Instalacija nije završena. Ako sad izađeš, program neće biti instaliran.%n%nInstalaciju možeš pokrenuti kasnije, ukoliko je želiš dovršiti.%n%nPrekinuti instalaciju?
 AboutSetupMenuItem=&O instalaciji …
 AboutSetupTitle=O instalaciji
 AboutSetupMessage=%1 verzija %2%n%3%n%n%1 početna stranica:%n%4
@@ -105,105 +105,107 @@ ButtonWizardBrowse=Odabe&ri …
 ButtonNewFolder=&Stvori novu mapu
 
 ; *** "Select Language" dialog messages
-SelectLanguageTitle=Odaberite jezik za instalaciju
-SelectLanguageLabel=Odberite jezik koji želite koristiti tijekom instaliranja.
+SelectLanguageTitle=Odaberi jezik za instalaciju
+SelectLanguageLabel=Odaberi jezik koji želiš koristiti tijekom instaliranja.
 
 ; *** Common wizard text
-ClickNext=Kliknite "Dalje" za nastavak ili "Odustani" za prekid instalacije.
+ClickNext=Pritisni "Dalje" za nastavak ili "Odustani" za prekid instalacije.
 BeveledLabel=
-BrowseDialogTitle=Odaberite mapu
-BrowseDialogLabel=Odaberite mapu iz popisa te kliknite "U redu".
+BrowseDialogTitle=Odaberi mapu
+BrowseDialogLabel=Odaberi mapu iz popisa i pritisni "U redu".
 NewFolderName=Nova mapa
 
 ; *** "Welcome" wizard page
-WelcomeLabel1=Dobro došli u instalaciju programa [name]
-WelcomeLabel2=Ovaj program će instalirati [name/ver] na vaše računalo.%n%nPreporučamo da zatvorite sve programe prije nego što nastavite dalje.
+WelcomeLabel1=Čarobnjak za instalaciju programa [name]
+WelcomeLabel2=Ovime ćeš instalirati [name/ver].%n%nPreporučujemo da zatvoriš sve programe prije nego što nastaviš dalje.
 
 ; *** "Password" wizard page
 WizardPassword=Lozinka
 PasswordLabel1=Instalacija je zaštićena lozinkom.
-PasswordLabel3=Upišite lozinku i kliknite "Dalje". Lozinke su osjetljive na mala i velika slova.
+PasswordLabel3=Upiši lozinku i pritisni "Dalje". Lozinke su osjetljive na mala i velika slova.
 PasswordEditLabel=&Lozinka:
-IncorrectPassword=Upisana je pogrešna lozinka. Pokušajte ponovo.
+IncorrectPassword=Upisana je pogrešna lozinka. Pokušaj ponovo.
 
 ; *** "License Agreement" wizard page
 WizardLicense=Licencni ugovor
-LicenseLabel=Prije nastavka pažljivo pročitajte sljedeće važne informacije.
-LicenseLabel3=Pročitajte licencni ugovor. Morate prihvatiti uvjete ugovora kako biste nastavili s instaliranjem.
+LicenseLabel=Prije nego što nastaviš dalje, pažljivo pročitaj sljedeće važne informacije.
+LicenseLabel3=Pročitaj licencni ugovor. Moraš prihvatiti uvjete ugovora, ako želiš nastaviti instalirati.
 LicenseAccepted=&Prihvaćam ugovor
 LicenseNotAccepted=&Ne prihvaćam ugovor
 
 ; *** "Information" wizard pages
 WizardInfoBefore=Informacije
-InfoBeforeLabel=Pročitajte sljedeće važne informacije prije nego što nastavite dalje.
-InfoBeforeClickLabel=Kada ste spremni nastaviti s instaliranjem, kliknite "Dalje".
+InfoBeforeLabel=Pročitaj sljedeće važne informacije prije nego što nastaviš dalje.
+InfoBeforeClickLabel=Kad želiš nastaviti instalirati, pritisni "Dalje".
 WizardInfoAfter=Informacije
-InfoAfterLabel=Pročitajte sljedeće važne informacije prije nego što nastavite dalje.
-InfoAfterClickLabel=Kada ste spremni nastaviti s instaliranjem, kliknite "Dalje".
+InfoAfterLabel=Pročitaj sljedeće važne informacije prije nego što nastaviš dalje.
+InfoAfterClickLabel=Kad želiš nastaviti instalirati, pritisni "Dalje".
 
 ; *** "User Information" wizard page
-WizardUserInfo=Informacije o korisniku
-UserInfoDesc=Upišite informacije o vama.
+WizardUserInfo=Korisnički podaci
+UserInfoDesc=Upiši svoje podatke.
 UserInfoName=&Ime korisnika:
 UserInfoOrg=&Organizacija:
 UserInfoSerial=&Serijski broj:
-UserInfoNameRequired=Morate upisati ime.
+UserInfoNameRequired=Ime je obavezno polje.
 
 ; *** "Select Destination Location" wizard page
-WizardSelectDir=Odaberite odredišno mjesto
-SelectDirDesc=Gdje treba instalirati [name]?
-SelectDirLabel3=Instalacija će instalirati [name] u sljedeću mapu.
-SelectDirBrowseLabel=Za nastavak kliknite na "Dalje". Ako želite odabrati drugu mapu, kliknite na "Odaberi".
+WizardSelectDir=Odaberi odredišno mjesto
+SelectDirDesc=Gdje želiš instalirati [name]?
+SelectDirLabel3=[name] će se instalirati u sljedeću mapu.
+SelectDirBrowseLabel=Za nastavak instalacije, pritisni "Dalje". Za odabir jedne druge mape, pritisni "Odaberi".
+DiskSpaceGBLabel=Potrebno je barem [gb] GB slobodnog prostora na disku.
 DiskSpaceMBLabel=Potrebno je barem [mb] MB slobodnog prostora na disku.
 CannotInstallToNetworkDrive=Instalacija ne može instalirati na mrežnu jedinicu.
 CannotInstallToUNCPath=Instalacija ne može instalirati na UNC stazu.
-InvalidPath=Morate unijeti punu stazu zajedno sa slovom diska, npr.:%n%nC:\APP%n%nili UNC stazu u obliku:%n%n\\server\share
-InvalidDrive=Disk koji ste odabrali ne postoji. Odaberite neki drugi.
+InvalidPath=Moraš upisati punu stazu zajedno sa slovom diska, npr.:%n%nC:\APP%n%nili UNC stazu u obliku:%n%n\\server\share
+InvalidDrive=Odabrani disk ne postoji. Odaberi jedan drugi.
 DiskSpaceWarningTitle=Nedovoljno prostora na disku
-DiskSpaceWarning=Instalacija zahtijeva barem %1 KB slobodnog prostora, a odabrani disk ima samo %2 KB na raspolaganju.%n%nŽelite li svejedno nastaviti?
+DiskSpaceWarning=Instalacija treba barem %1 KB slobodnog prostora, no odabrani disk ima samo %2 KB.%n%nSvejedno nastaviti?
 DirNameTooLong=Naziv mape ili staze je predugačak.
 InvalidDirName=Naziv mape je neispravan.
-BadDirName32=Naziv mape ne smije sadržavati niti jedan od sljedećih znakova:%n%n%1
+BadDirName32=Naziv mape ne smije sadržavati sljedeće znakove:%n%n%1
 DirExistsTitle=Mapa već postoji
-DirExists=Mapa:%n%n%1%n%nveć postoji. Želite li svejedno u nju instalirati?
+DirExists=Mapa:%n%n%1%n%nveć postoji. Želiš li svejedno u nju instalirati?
 DirDoesntExistTitle=Mapa ne postoji
-DirDoesntExist=The folder:%n%n%1%n%nne postoji. Želite li ju stvoriti?
+DirDoesntExist=Mapa:%n%n%1%n%nne postoji. Želiš li je stvoriti?
 
 ; *** "Select Components" wizard page
-WizardSelectComponents=Odaberite komponente
-SelectComponentsDesc=Koje komponente želite instalirati?
-SelectComponentsLabel2=Odaberite komponente koje želite instalirati, isključite komponente koje ne želite instalirati. Za nastavak kliknite na "Dalje".
+WizardSelectComponents=Odaberi komponente
+SelectComponentsDesc=Koje komponente želiš instalirati?
+SelectComponentsLabel2=Odaberi komponente koje želiš instalirati, isključi komponente koje ne želiš instalirati. Za nastavak instalacije pritisni "Dalje".
 FullInstallation=Kompletna instalacija
 ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language)
 CompactInstallation=Kompaktna instalacija
 CustomInstallation=Prilagođena instalacija
 NoUninstallWarningTitle=Postojeće komponente
-NoUninstallWarning=Instalacija je utvrdila da na vašem računalu već postoje sljedeće komponente:%n%n%1%n%nIsključivanjem tih komponenata, one neće biti deinstalirane.%n%nŽelite li ipak nastaviti?
+NoUninstallWarning=Instalacija je utvrdila da na tvom računalu već postoje sljedeće komponente:%n%n%1%n%nIsključivanjem tih komponenata, one se neće deinstalirati.%n%nŽeliš li svejedno nastaviti?
 ComponentSize1=%1 KB
 ComponentSize2=%1 MB
+ComponentsDiskSpaceGBLabel=Trenutačni odabir zahtijeva barem [gb] GB na disku.
 ComponentsDiskSpaceMBLabel=Trenutačni odabir zahtijeva barem [mb] MB na disku.
 
 ; *** "Select Additional Tasks" wizard page
-WizardSelectTasks=Odaberite dodatne zadatke
-SelectTasksDesc=Koje dodatne zadatke želite izvršiti?
-SelectTasksLabel2=Odaberite zadatke koje želite izvršiti tijekom instaliranja programa [name], zatim kliknite "Dalje".
+WizardSelectTasks=Odaberi dodatne zadatke
+SelectTasksDesc=Koje dodatne zadatke želiš izvršiti?
+SelectTasksLabel2=Odaberi zadatke koje želiš izvršiti tijekom instaliranja programa [name], zatim pritisni "Dalje".
 
 ; *** "Select Start Menu Folder" wizard page
-WizardSelectProgramGroup=Odaberite mapu iz "Start" izbornika
-SelectStartMenuFolderDesc=Gdje želite da instalacija spremi programske prečace?
+WizardSelectProgramGroup=Odaberi mapu iz "Start" izbornika
+SelectStartMenuFolderDesc=Gdje želiš da instalacija spremi programske prečace?
 SelectStartMenuFolderLabel3=Instalacija će stvoriti programske prečace u sljedeću mapu "Start" izbornika.
-SelectStartMenuFolderBrowseLabel=Kliknite "Dalje" za nastavak ili "Odaberi" za odabir jedne druge mape.
-MustEnterGroupName=Morate upisati naziv mape.
-GroupNameTooLong=Naziv mape ili staze je predug.
+SelectStartMenuFolderBrowseLabel=Ako želiš nastaviti, pritisni "Dalje". Ako želiš odabrati jednu drugu mapu, pritisni "Odaberi".
+MustEnterGroupName=Moraš upisati naziv mape.
+GroupNameTooLong=Naziv mape ili staze je predugačak.
 InvalidGroupName=Naziv mape nije ispravan.
 BadGroupName=Naziv mape ne smije sadržavati sljedeće znakove:%n%n%1
 NoProgramGroupCheck2=&Ne stvaraj mapu u "Start" izborniku
 
 ; *** "Ready to Install" wizard page
 WizardReady=Sve je spremno za instaliranje
-ReadyLabel1=Instalacija je spremna za instaliranje [name] na vaše računalo.
-ReadyLabel2a=Kliknite "Instaliraj" ako želite instalirati program ili "Natrag" ako želite pregledati ili promijeniti postavke
-ReadyLabel2b=Kliknite "Instaliraj" ako želite instalirati program.
+ReadyLabel1=Instalacija je spremna za instaliranje programa [name].
+ReadyLabel2a=Pritisni "Instaliraj", ako želiš instalirati program. Pritisni "Natrag", ako želiš pregledati ili promijeniti postavke
+ReadyLabel2b=Pritisni "Instaliraj", ako želiš instalirati program.
 ReadyMemoUserInfo=Korisnički podaci:
 ReadyMemoDir=Odredišno mjesto:
 ReadyMemoType=Vrsta instalacije:
@@ -213,29 +215,30 @@ ReadyMemoTasks=Dodatni zadaci:
 
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Priprema za instaliranje
-PreparingDesc=Instalacija se priprema za instaliranje [name] na vaše računalo.
-PreviousInstallNotCompleted=The installation/removal of a previous program was not completed. You will need to restart your computer to complete that installation.%n%nAfter restarting your computer, run Setup again to complete the installation of [name].
-CannotContinue=Instalacija ne može nastaviti. Kliknite na "Odustani" za izlaz.
-ApplicationsFound=Sljedeći programi koriste datoteke koje instalacija mora aktualiziranti. Preporučamo da dopustite instalaciji da zatvori ove programe.
-ApplicationsFound2=Sljedeći programi koriste datoteke koje instalacija mora aktualiziranti. Preporučamo da dopustite instalaciji da zatvori ove programe. Kad instaliranje završi, instalacija će pokušati ponovo pokrenuti programe.
+PreparingDesc=Instalacija se priprema za instaliranje programa [name].
+PreviousInstallNotCompleted=Instaliranje/uklanjanje jednog prethodnog programa nije bilo gotovo. Morat ćeš ponovo pokrenuti računalo i dovršiti to instaliranje.%n%nNakon ponovnog pokretanja računala, pokreni instalaciju ponovo, kako bi se dovršilo instaliranje programa [name].
+CannotContinue=Instalacija ne može nastaviti rad. Pritisni "Odustani" za izlaz iz instalacije.
+ApplicationsFound=Sljedeći programi koriste datoteke koje instalacija mora aktualizirati. Preporučujemo da dopustiš instalaciji zatvoriti ove programe.
+ApplicationsFound2=Sljedeći programi koriste datoteke koje instalacija mora aktualizirati. Preporučujemo da dopustiš instalaciji zatvoriti ove programe. Kad instaliranje završi, instalacija će pokušati ponovo pokrenuti programe.
 CloseApplications=&Zatvori programe automatski
 DontCloseApplications=&Ne zatvaraj programe
-ErrorCloseApplications=Instalacija nij uspjela automatski zatvoriti programe. Preporučamo da zatvorite sve programe koji koriste datoteke, koje se moraju aktulaizirati.
+ErrorCloseApplications=Instalacija nije uspjela automatski zatvoriti programe. Preporučujemo da zatvoriš sve programe koji koriste datoteke koje se moraju aktualizirati.
+PrepareToInstallNeedsRestart=Instalacija mora ponovo pokrenuti računalo. Nakon ponovnog pokretanja računala, pokreni instalaciju ponovo, kako bi se dovršilo instaliranje programa [name].%n%nŽeliš li sada ponovo pokrenuti računalo?
 
 ; *** "Installing" wizard page
 WizardInstalling=Instaliranje
-InstallingLabel=Pričekajte dok ne završi instaliranje programa [name] na vaše računalo.
+InstallingLabel=Pričekaj dok ne završi instaliranje programa [name].
 
 ; *** "Setup Completed" wizard page
 FinishedHeadingLabel=Završavanje instalacijskog čarobnjaka za [name]
-FinishedLabelNoIcons=Instalacija je završila instaliranje programa [name] na vaše računalo.
-FinishedLabel=Instalacija je završila instaliranje programa [name] na vaše računalo. Program se može pokrenuti pomoću instaliranih prečaca.
-ClickFinish=Kliknite na "Završi" kako biste izašli iz instalacije.
-FinishedRestartLabel=Kako biste završili instaliranje programa [name], potrebno je ponovo pokrenuti računalo. Želite li to sada učiniti?
-FinishedRestartMessage=Kako biste završili instaliranje programa [name], potrebno je ponovo pokrenuti računalo.%n%nŽelite li to sada učiniti?
+FinishedLabelNoIcons=Instalacija je završila instaliranje programa [name].
+FinishedLabel=Instalacija je završila instaliranje programa [name]. Program se može pokrenuti pomoću instaliranih prečaca.
+ClickFinish=Za izlaz iz instalacije pritisni "Završi".
+FinishedRestartLabel=Za završavanje instaliranja programa [name], instalacija mora ponovo pokrenuti računalo. Želiš li sada ponovo pokrenuti računalo?
+FinishedRestartMessage=Za završavanje instaliranja programa [name], instalacija mora ponovo pokrenuti računalo.%n%nŽeliš li sada ponovo pokrenuti računalo?
 ShowReadmeCheck=Da, želim pročitati README datoteku
-YesRadio=&Da, želim sad ponovo pokrenuti računalo
-NoRadio=&Ne, kasnije ću ponovo pokrenuti računalo 
+YesRadio=&Da, sada ponovo pokrenuti računalo
+NoRadio=&Ne, računalo ću kasnije ponovo pokrenuti 
 ; used for example as 'Run MyProg.exe'
 RunEntryExec=Pokreni %1
 ; used for example as 'View Readme.txt'
@@ -243,14 +246,14 @@ RunEntryShellExec=Prikaži %1
 
 ; *** "Setup Needs the Next Disk" stuff
 ChangeDiskTitle=Instalacija treba sljedeći disk
-SelectDiskLabel2=Umetnite disk %1 i kliknite na "U redu".%n%nAko se datoteke s ovog diska nalaze na nekom drugom mjestu od prikazanog ispod, upišite ispravnu stazu ili kliknite na "Odaberi".
+SelectDiskLabel2=Umetni disk %1 i pritisni "U redu".%n%nAko se datoteke s ovog diska nalaze na nekom drugom mjestu od dolje prikazanog, upiši ispravnu stazu ili pritisni "Odaberi".
 PathLabel=&Staza:
-FileNotInDir2=Staza "%1" ne postoji u "%2". Umetnite odgovarajući disk ili odaberite jednu drugu mapu.
-SelectDirectoryLabel=Odaberite mjesto sljedećeg diska.
+FileNotInDir2=Staza "%1" ne postoji u "%2". Umetni odgovarajući disk ili odaberi jednu drugu mapu.
+SelectDirectoryLabel=Odredi mjesto sljedećeg diska.
 
 ; *** Installation phase messages
-SetupAborted=Instalacija nije završena.%n%nIspravite problem i ponovo pokrenite instalaciju.
-AbortRetryIgnoreSelectAction=Odaberite radnju
+SetupAborted=Instalacija nije završena.%n%nIspravi problem i ponovo pokreni instalaciju.
+AbortRetryIgnoreSelectAction=Odaberi radnju
 AbortRetryIgnoreRetry=&Pokušaj ponovo
 AbortRetryIgnoreIgnore=&Zanemari grešku i nastavi
 AbortRetryIgnoreCancel=Prekini s instaliranjem
@@ -270,10 +273,10 @@ StatusRollback=Poništavanje promjena …
 
 ; *** Misc. errors
 ErrorInternal2=Interna greška: %1
-ErrorFunctionFailedNoCode=%1 nije uspjelo
-ErrorFunctionFailed=%1 nije uspjelo; kod %2
-ErrorFunctionFailedWithMessage=%1 failed; kod %2.%n%3
-ErrorExecutingProgram=Nije moguće pokrenuti datoteku:%n%1
+ErrorFunctionFailedNoCode=%1 neuspjelo
+ErrorFunctionFailed=%1 neuspjelo; kod %2
+ErrorFunctionFailedWithMessage=%1 – neuspjelo; kod %2.%n%3
+ErrorExecutingProgram=Nije moguće izvršiti datoteku:%n%1
 
 ; *** Registry errors
 ErrorRegOpenKey=Greška prilikom otvaranja ključa registra:%n%1\%2
@@ -284,17 +287,17 @@ ErrorRegWriteKey=Greška prilikom pisanja u ključ registra:%n%1\%2
 ErrorIniEntry=Greška prilikom stvaranja INI unosa u datoteci "%1".
 
 ; *** File copying errors
-FileAbortRetryIgnoreSkipNotRecommended=&Preskoči ovu datoteku (ne preporuča se)
-FileAbortRetryIgnoreIgnoreNotRecommended=&Zanemari grešku i nastavi (ne preporuča se)
-SourceIsCorrupted=Izvorna datoteka je oštećena
-SourceDoesntExist=Izvorna datoteka "%1" ne postoji
+FileAbortRetryIgnoreSkipNotRecommended=&Preskoči ovu datoteku (ne preporučuje se)
+FileAbortRetryIgnoreIgnoreNotRecommended=&Zanemari grešku i nastavi (ne preporučuje se)
+SourceIsCorrupted=Izvorna datoteka je oštećena
+SourceDoesntExist=Izvorna datoteka "%1" ne postoji
 ExistingFileReadOnly2=Postojeću datoteku nije bilo moguće zamijeniti, jer je označena sa "samo-za-čitanje".
-ExistingFileReadOnlyRetry=&Uklonite atribut "samo-za-čitanje" i pokušajte ponovo
+ExistingFileReadOnlyRetry=&Ukloni svojstvo "samo-za-čitanje" i pokušaj ponovo
 ExistingFileReadOnlyKeepExisting=&Zadrži postojeću datoteku
 ErrorReadingExistingDest=Pojavila se greška prilikom pokušaja čitanja postojeće datoteke:
-FileExists=The file already exists.%n%nŽelite li da ju instalacija prepiše?
-ExistingFileNewer=Postojeća datoteka je novija od one, koju pokušavate instalirati. Preporuča se da zadržite postojeću datoteku.%n%nŽelite li zadržati postojeću datoteku?
-ErrorChangingAttr=Pojavila se greška prilikom pokušaja promjene atributa postojeće datoteke:
+FileExists=Datoteka već postoji.%n%nŽeliš li da je instalacija prepiše?
+ExistingFileNewer=Postojeća datoteka je novija od one, koju pokušavaš instalirati. Preporučuje se da zadržiš postojeću datoteku.%n%nŽeliš li zadržati postojeću datoteku?
+ErrorChangingAttr=Pojavila se greška prilikom pokušaja promjene svojstva postojeće datoteke:
 ErrorCreatingTemp=Pojavila se greška prilikom pokušaja stvaranja datoteke u odredišnoj mapi:
 ErrorReadingSource=Pojavila se greška prilikom pokušaja čitanja izvorišne datoteke:
 ErrorCopying=Pojavila se greška prilikom pokušaja kopiranja datoteke:
@@ -303,7 +306,7 @@ ErrorRestartReplace=Zamijenjivanje nakon ponovnog pokretanja nije uspjelo:
 ErrorRenamingTemp=Pojavila se greška prilikom pokušaja preimenovanja datoteke u odredišnoj mapi:
 ErrorRegisterServer=Nije moguće registrirati DLL/OCX: %1
 ErrorRegSvr32Failed=Greška u RegSvr32. Izlazni kod %1
-ErrorRegisterTypeLib=Nije moguće registrirati type library: %1
+ErrorRegisterTypeLib=Nije moguće registrirati biblioteku vrsta: %1
 
 ; *** Uninstall display name markings
 ; used for example as 'My Program (32-bit)'
@@ -317,25 +320,25 @@ UninstallDisplayNameMarkCurrentUser=Trenutačni korisnik
 
 ; *** Post-installation errors
 ErrorOpeningReadme=Pojavila se greška prilikom pokušaja otvaranja README datoteke.
-ErrorRestartingComputer=Instalacija nije mogla ponovo pokrenuti računalo. Učinite to ručno.
+ErrorRestartingComputer=Instalacija nije mogla ponovo pokrenuti računalo. Učini to ručno.
 
 ; *** Uninstaller messages
 UninstallNotFound=Datoteka "%1" ne postoji. Deinstaliranje nije moguće.
 UninstallOpenError=Datoteku "%1" nije bilo moguće otvoriti. Deinstaliranje nije moguće
 UninstallUnsupportedVer=Deinstalacijska datoteka "%1" je u formatu koji ova verzija deinstalacijskog programa ne prepoznaje. Deinstaliranje nije moguće
-UninstallUnknownEntry=Nepoznat zapis (%1) je pronađen u deinstalacijskoj datoteci
-ConfirmUninstall=Zaista želite ukloniti %1 i sve pripadajuće komponente?
+UninstallUnknownEntry=Pronađen je nepoznat zapis (%1) u deinstalacijskoj datoteci
+ConfirmUninstall=Zaista želiš ukloniti %1 i sve pripadajuće komponente?
 UninstallOnlyOnWin64=Ovu instalaciju je moguće ukloniti samo na 64-bitnom Windows sustavu.
-OnlyAdminCanUninstall=Ovu instalaciju je moguće ukloniti samo korisnik s administrativnim pravima.
-UninstallStatusLabel=Pričekajte dok se %1 uklanja s vašeg računala.
-UninstalledAll=%1 je uspješno uklonjen s vašeg računala.
-UninstalledMost=Deinstaliranje programa %1 je završeno.%n%nNeke elemente nije bilo moguće ukloniti. Mogu se ukloniti ručno.
-UninstalledAndNeedsRestart=Kako biste završili deinstalirati %1, morate ponovo pokrenuti vaše računalo%n%nŽelite li to sad učiniti?
+OnlyAdminCanUninstall=Ovu instalaciju može ukloniti samo korisnik s administratorskim pravima.
+UninstallStatusLabel=Pričekaj dok se %1 uklanja s računala.
+UninstalledAll=%1 je uspješno uklonjen s računala.
+UninstalledMost=Deinstaliranje programa %1 je završeno.%n%nNeke elemente nije bilo moguće ukloniti. Oni se mogu ukloniti ručno.
+UninstalledAndNeedsRestart=Za završavanje deinstaliranja programa %1, potrebno je ponovo pokrenuti računalo.%n%nŽeliš li to sada učiniti?
 UninstallDataCorrupted="%1" datoteka je oštećena. Deinstaliranje nije moguće
 
 ; *** Uninstallation phase messages
 ConfirmDeleteSharedFileTitle=Ukloniti dijeljene datoteke?
-ConfirmDeleteSharedFile2=Sustav ukazuje na to, da sljedeće dijeljenu datoteku ne koristi niti jedan program. Želite li ukloniti tu dijeljenu datoteku?%n%nAko neki programi i dalje koriste tu datoteku, a ona se izbriše, ti programi neće ispravno raditi. Ako niste sigurni, odaberite "Ne". Datoteka neće štetiti vašem sustavu.
+ConfirmDeleteSharedFile2=Sustav ukazuje na to, da sljedeću dijeljenu datoteku ne koristi niti jedan program. Želiš li ukloniti tu dijeljenu datoteku?%n%nAko neki programi i dalje koriste tu datoteku, a ona se izbriše, ti programi neće ispravno raditi. Ako ne znaš, odaberi "Ne". Datoteka neće štetiti tvom sustavu.
 SharedFileNameLabel=Datoteka:
 SharedFileLocationLabel=Mjesto:
 WizardUninstalling=Stanje deinstalacije
@@ -361,4 +364,4 @@ AssocFileExtension=&Poveži program %1 s datotečnim nastavkom %2
 AssocingFileExtension=Povezivanje programa %1 s datotečnim nastavkom %2 …
 AutoStartProgramGroupDescription=Pokretanje:
 AutoStartProgram=Automatski pokreni %1
-AddonHostProgramNotFound=%1 nije nađen u odabranoj mapi.%n%nŽelite li svejedno nastaviti?
+AddonHostProgramNotFound=%1 nije nađen u odabranoj mapi.%n%nŽeliš li svejedno nastaviti?

+ 364 - 0
Files/Languages/Unofficial/Georgian.isl

@@ -0,0 +1,364 @@
+; *** Inno Setup version 6.0.3+ Georgian ***
+; Translated by Saba Khmaladze ([email protected])
+;
+; To download user-contributed translations of this file, go to:
+;   https://jrsoftware.org/files/istrans/
+;
+; Note: When translating this text, do not add periods (.) to the end of
+; messages that didn't have them already, because on those messages Inno
+; Setup adds the periods automatically (appending a period would result in
+; two periods being displayed).
+
+[LangOptions]
+; The following three entries are very important. Be sure to read and 
+; understand the '[LangOptions] section' topic in the help file.
+LanguageName=Georgian
+LanguageID=$0437
+LanguageCodePage=0
+; If the language you are translating to requires special font faces or
+; sizes, uncomment any of the following entries and change them accordingly.
+DialogFontName=Sylfaen
+;DialogFontSize=8
+WelcomeFontName=Sylfaen
+;WelcomeFontSize=12
+TitleFontName=Sylfaen
+;TitleFontSize=29
+CopyrightFontName=Sylfaen
+;CopyrightFontSize=8
+
+[Messages]
+
+; *** Application titles
+SetupAppTitle=ინსტალაცია
+SetupWindowTitle=ინსტალდება - %1
+UninstallAppTitle=წაშლა
+UninstallAppFullTitle=იშლება %1
+
+; *** Misc. common
+InformationTitle=ინფორმაცია
+ConfirmTitle=დაზუსტება
+ErrorTitle=შეცდომა
+
+; *** SetupLdr messages
+SetupLdrStartupMessage=თქვენთან დაინსტალდება %1. გსურთ გაგრძელება?
+LdrCannotCreateTemp=დროებითი ფაილი ვერ შეიქმნა. ინსტალაცია შეწყდა
+LdrCannotExecTemp=დროებით საქაღალდეში ფაილი ვერ გაეშვა. ინსტალაცია შეწყდა
+HelpTextNote=
+
+; *** Startup error messages
+LastErrorMessage=%1.%n%nშეცდომა %2: %3
+SetupFileMissing=საინსტალაციო საქაღალდეში არ მოიძებნა ფაილი %1. გაასწორეთ პრობლემა ან გადმოწერეთ პროგრამის ახალი ვერსია.
+SetupFileCorrupt=საინსტალაციო ფაილები დაზიანებულია. გაასწორეთ პრობლემა ან გადმოწერეთ პროგრამის ახალი ვერსია.
+SetupFileCorruptOrWrongVer=საინსტალაციო ფაილები დაზიანებული ან არათავსებადია ამ ვერსიასთან. გაასწორეთ პრობლემა ან გადმოწერეთ პროგრამის ახალი ვერსია.
+InvalidParameter=არასწორი პარამეტრი გადაეცა ბრძანებათა ველს:%n%n%1
+SetupAlreadyRunning=ინსტალაცია უკვე მიმდინარეობს.
+WindowsVersionNotSupported=ეს პროგრამა Windows-ის ამ ვერსიაზე ვერ გაეშვება.
+WindowsServicePackRequired=ამ პროგრამას სჭირდება %1 Service Pack %2 ან უფრო ახალი.
+NotOnThisPlatform=ეს პროგრამა არ გაეშვება სისტემაზე %1.
+OnlyOnThisPlatform=ეს პროგრამა უნდა გაეშვას სისტემაზე %1.
+OnlyOnTheseArchitectures=ეს პროგრამა დაინსტალდება მხოლოდ Windows-ის შემდეგ არქიტექტურაზე:%n%n%1
+WinVersionTooLowError=ამ პროგრამას სჭირდება %1 ვერსია %2 ან უფრო ახალი.
+WinVersionTooHighError=ეს პროგრამა ვერ დაინსტალდება %1 ვერსია %2-ზე ან უფრო ახალზე.
+AdminPrivilegesRequired=ამ პროგრამის დასაინსტალებლად საჭიროა ადმინისტრატორის ანგარიში.
+PowerUserPrivilegesRequired=ამ პროგრამის დასაინსტალებლად საჭიროა ადმინისტრატორის ან მძლავრი იუზერის (Power User) ანგარიში.
+SetupAppRunningError=საინსტალაციომ დაადგინა რომ გაშვებულია %1.%n%nგთხოვთ დახურეთ გაშვებული პროცესები, გასაგრძელებლად დააჭირეთ ღილაკს კარგი ან გამოსასვლელად ღილაკს გაუქმება.
+UninstallAppRunningError=ამომშლელმა დაადგინა რომ გაშვებულია %1.%n%nგთხოვთ დახურეთ გაშვებული პროცესები, გასაგრძელებლად დააჭირეთ ღილაკს კარგი ან გამოსასვლელად ღილაკს გაუქმება.
+
+; *** Startup questions
+PrivilegesRequiredOverrideTitle=აირჩიეთ ინსტალაციის რეჟიმი
+PrivilegesRequiredOverrideInstruction=აირჩიეთ ინსტალაციის რეჟიმი
+PrivilegesRequiredOverrideText1=%1 შეიძლება დაინსტალდეს ყველასთვის (საჭიროა ადმინისტრატორის უფლება) ან მხოლოდ თქვენთვის.
+PrivilegesRequiredOverrideText2=%1 შეიძლება დაინსტალდეს მხოლოდ თქვენთვის ან ყველასთვის (საჭიროა ადმინისტრატორის უფლება).
+PrivilegesRequiredOverrideAllUsers=დაინსტალება ყველა მომხმარებლისტვის
+PrivilegesRequiredOverrideAllUsersRecommended=დაინსტალება ყველა მომხმარებლისთვის (რეკომენდებულია)
+PrivilegesRequiredOverrideCurrentUser=დაინსტალება მხოლოდ ჩემთვის
+PrivilegesRequiredOverrideCurrentUserRecommended=დაინსტალება მხოლოდ ჩემთვის (რეკომენდებულია)
+
+; *** Misc. errors
+ErrorCreatingDir=საინსტალაციომ ვერ შექმნა საქაღალდე "%1"
+ErrorTooManyFilesInDir=საქაღალდეში "%1" ვერ შეიქმნა ფაილი, რადგან ის შეიცავს ძალიან ბევრ ფაილს
+
+; *** Setup common messages
+ExitSetupTitle=საინსტალაციოს გათიშვა
+ExitSetupMessage=ინსტალაცია არ დასრულებულა, გათიშვის შემთხვევაში პროცესი გაუქმდება.%n%nინსტალაციის დასასრულებლად მოგიწევთ საინსტალაციოს თავიდან გაშვება.%n%nგსურთ გათიშვა?
+AboutSetupMenuItem=&ინსტალაციის შეწყვეტა...
+AboutSetupTitle=ინსტალაციის შეწყვეტა
+AboutSetupMessage=%1 ვერსია %2%n%3%n%n%1 ვებ-გვერდი:%n%4
+AboutSetupNote=
+TranslatorNote=
+
+; *** Buttons
+ButtonBack=< &უკან
+ButtonNext=&შემდეგი >
+ButtonInstall=&ინსტალაცია
+ButtonOK=კარგი
+ButtonCancel=გაუქმება
+ButtonYes=&კი
+ButtonYesToAll=კი ყველასთვის
+ButtonNo=&არა
+ButtonNoToAll=არა ყველასთვის
+ButtonFinish=&დასრულება
+ButtonBrowse=&მითითება...
+ButtonWizardBrowse=მ&ითითება...
+ButtonNewFolder=&ახალი საქაღალდე
+
+; *** "Select Language" dialog messages
+SelectLanguageTitle=ინსტალაციის ენის არჩევა
+SelectLanguageLabel=მიუთითეთ ენა, რომელზეც გაეშვება საინსტალაციო.
+
+; *** Common wizard text
+ClickNext=გასაგრძელებლად დააჭირეთ შემდეგს, გასაუქმებლად გაუქმებას.
+BeveledLabel=
+BrowseDialogTitle=საქაღალდის მითითება
+BrowseDialogLabel=აირჩიეთ საქაღალდე და დააჭირეთ ღილაკს კარგი.
+NewFolderName=ახალი საქაღალდე
+
+; *** "Welcome" wizard page
+WelcomeLabel1=მოგესალმებით [name]-(ი)ს საინსტალაციოში
+WelcomeLabel2=საინსტალაციო დააინსტალებს [name/ver] კომპიუტერში.%n%nგაგრძელებამდე რეკომენდებულია დახუროთ გახსნილი პროგრამები.
+
+; *** "Password" wizard page
+WizardPassword=პაროლი
+PasswordLabel1=საინსტალაციო დაცულია პაროლით.
+PasswordLabel3=შეიყვანეთ პაროლი და დააჭირეთ გაგრძელებას.
+PasswordEditLabel=&პაროლი:
+IncorrectPassword=შეყვანილი პაროლი არასწორია.
+
+; *** "License Agreement" wizard page
+WizardLicense=სალიცენზიო შეთანხმება
+LicenseLabel=გაგრძელებამდე ყურადღებით გაეცანით ქვემოთ მოცემულ ინფორმაციას.
+LicenseLabel3=ყურადღებით წაიკითხეთ სალიცენზიო შეთანხმება. გაგრძელებისთვის თქვენ უნდა დაეთანხმოთ მას.
+LicenseAccepted=ვეთანხმები სალიცენზიო შეთანხმებას
+LicenseNotAccepted=არ ვეთანხმები სალიცენზიო შეთანხმებას
+
+; *** "Information" wizard pages
+WizardInfoBefore=ინფორმაცია
+InfoBeforeLabel=გაგრძელებამდე გთხოვთ წაიკითხოთ მნიშვნელოვანი ინფორმაცია.
+InfoBeforeClickLabel=როცა მზად იქნები დააჭირე შემდეგს.
+WizardInfoAfter=ინფორმაცია
+InfoAfterLabel=გაგრძელებამდე გთხოვთ წაიკითხოთ მნიშვნელოვანი ინფორმაცია.
+InfoAfterClickLabel=როცა მზად იქნები დააჭირე შემდეგს.
+
+; *** "User Information" wizard page
+WizardUserInfo=ინფორმაცია მომხმარებელზე
+UserInfoDesc=შეიყვანეთ ინფორმაცია თქვენზე.
+UserInfoName=&სახელი:
+UserInfoOrg=&ორგანიზაცია:
+UserInfoSerial=სერიული &ნომერი:
+UserInfoNameRequired=უნდა შეიყვანოთ სახელი.
+
+; *** "Select Destination Location" wizard page
+WizardSelectDir=მიუთითეთ საინსტალაციო საქაღალდე
+SelectDirDesc=სად დაინსტალდეს [name]?
+SelectDirLabel3=საინსტალაციო დააინსტალებს [name]-(ი)ს მოცემულ საქაღალდეში.
+SelectDirBrowseLabel=გასაგრძელებლად დააჭირეთ გაგრძელებას ან თუ გსურთ სხვა საქაღალდის მითითება - მითითებას.
+DiskSpaceGBLabel=საჭიროა მინიმუმ [gb] გბ სივრცე.
+DiskSpaceMBLabel=საჭიროა მინიმუმ [mb] მბ სივრცე.
+CannotInstallToNetworkDrive=ვერ დაინსტალდება ქსელურ მისამართზე.
+CannotInstallToUNCPath=ვერ დაინსტალდება UNC მისამართზე.
+InvalidPath=უნდა შეიყვანეთ სრული მისამართი, დისკის სახელის ჩათვლით; მაგალითად:%n%nC:\APP%n%nან UNC მისამართი ფორმატში:%n%n\\server\share
+InvalidDrive=დისკი ან UNC მისამართი არ არსებობს ან მიუწვდომელია. მიუთითეთ სხვა.
+DiskSpaceWarningTitle=არასაკმარისი სივრცე დისკზე
+DiskSpaceWarning=დასაინსტალებლად საჭიროა მინიმუმ %1 კბ სივრცე, მაგრამ ხელმისაწვდომია მხოლოდ %2 კბ.%n%nგსურთ გაგრძელება?
+DirNameTooLong=საქაღალდის დასახელება ძალიან გრძელია.
+InvalidDirName=საქაღალდის დასახელება არასწორია.
+BadDirName32=საქაღალდის სახელში არ უნდა იყოს სიმბოლოები:%n%n%1
+DirExistsTitle=საქაღალდე არსებობს
+DirExists=საქაღალდე:%n%n%1%n%nუკვე არსებობს. გსურთ მაგ საქაღალდეში დაინსტალება?
+DirDoesntExistTitle=საქაღალდე არ არსებობს
+DirDoesntExist=საქაღალდე:%n%n%1%n%nარ არსებობს. გსურთ შექმნა?
+
+; *** "Select Components" wizard page
+WizardSelectComponents=აირჩიეთ კომპონენტები
+SelectComponentsDesc=რომელი კომპონენტები დაინსტალდეს?
+SelectComponentsLabel2=აირჩიეთ რომელი კომპონენტის დაინსტალებაც გსურთ; არ მონიშნოთ ის კომპონენტი რომლის დაინსტალებაც არ გსურთ. როცა მზად იქნებით დააჭირეთ გაგრძელებას.
+FullInstallation=სრული ინსტალაცია
+CompactInstallation=კომპაქტური ინსტალაცია
+CustomInstallation=არჩევითი ინსტალაცია
+NoUninstallWarningTitle=კომპონენტები არსებობს
+NoUninstallWarning=საინსტალაციომ დაადგინა რომ ზოგიერთი კომპონენტი უკვე დაინსტალებულია:%n%n%1%n%nმათი არ მონიშვნა არ ნიშნავს რომ ისინი წაიშლება.%n%nგსურთ გაგრძელებას?
+ComponentSize1=%1 კბ
+ComponentSize2=%1 მბ
+ComponentsDiskSpaceGBLabel=საჭიროა მინიმუმ [gb] გბ სივრცე.
+ComponentsDiskSpaceMBLabel=საჭიროა მინიმუმ [mb] მბ სივრცე.
+
+; *** "Select Additional Tasks" wizard page
+WizardSelectTasks=მიუთითეთ დამატებითი დავალებები
+SelectTasksDesc=რა დამატებითი დავალება შესრულდეს?
+SelectTasksLabel2=აირჩიეთ თუ რომელიმე დამატებითი ფუნქციის შესრულება გსურთ [name]-(ი)ს ინსტალაციისას და დააჭირეთ შემდეგს.
+
+; *** "Select Start Menu Folder" wizard page
+WizardSelectProgramGroup=აირჩიეთ გაშვების მენიუს საქაღალდე
+SelectStartMenuFolderDesc=სად დაინსტალდეს პროგრამის ხატულები?
+SelectStartMenuFolderLabel3=საინსტალაციო პროგრამის ხატულებს გაშვების მენიუსთვის დააინსტალებს ქვემოთ მოცემულ საქაღალდეში.
+SelectStartMenuFolderBrowseLabel=გასაგრძელებლად დააჭირეთ შემდეგს ან მიუთითეთ სხვა საქაღალდე.
+MustEnterGroupName=ჩაწერეთ საქაღალდის სახელი.
+GroupNameTooLong=საქაღალდის სახელი ან მისამართი ძალიან გრძელია.
+InvalidGroupName=საქაღალდის სახელი არასწორია.
+BadGroupName=სახელში არ უნდა იყოს შემდეგი სიმბოლოები:%n%n%1
+NoProgramGroupCheck2=&არ შეიქმნას საქაღალდე გაშვების მენიუში
+
+; *** "Ready to Install" wizard page
+WizardReady=მზადაა დასაინსტალებლად
+ReadyLabel1=საინსტალაციო მზადაა დააინსტალოს [name] თქვენს კომპიუტერში.
+ReadyLabel2a=დასაინსტალებლად დააჭირეთ ინსტალაციას ან დაბრუნდით უკან და გადახედეთ პარამეტრებს.
+ReadyLabel2b=დასაინსტალებლად დააჭირეთ ინსტალაციას.
+ReadyMemoUserInfo=ინფორმაცია მომხმარებელზე:
+ReadyMemoDir=ინფორმაცია საქაღალდეზე:
+ReadyMemoType=ინსტალაციის სახეობა:
+ReadyMemoComponents=არჩეული კომპონენტები:
+ReadyMemoGroup=გაშვების მენიუს საქაღალდე:
+ReadyMemoTasks=დამატებითი დავალებები:
+
+; *** "Preparing to Install" wizard page
+WizardPreparing=მზადდება დასაინსტალებლად
+PreparingDesc=საინსტალაციო ემზადება რომ [name] დააინსტალოს კომპიუტერში.
+PreviousInstallNotCompleted=წინა პროგრამის ინსტალაცია/წაშლა არ მოხერხდა. საჭიროა კომპიუტერის გადატვირთვა.%n%nკომპიუტერის გადატვირთვის შემდეგ ხელახლა გაუშვით [name]-(ი)ს საინსტალაციო.
+CannotContinue=ინსტალაცია არ გაგრძელდა. გასაუქმებლად დააჭირეთ გაუქმებას.
+ApplicationsFound=მოცემული პროგრამები იყენებენ ფაილებს რომელიც საინსტალაციომ უნდა განახლოს. რეკომენდებულია უფლება მისცეთ საინსტალაციოს გათიშოს ეს პროგრამები.
+ApplicationsFound2=ოცემული პროგრამები იყენებენ ფაილებს რომელიც საინსტალაციომ უნდა განახლოს. რეკომენდებულია უფლება მისცეთ საინსტალაციოს გათიშოს ეს პროგრამები. ინსტალაციის დასრულების შემდეგ საინსტალაციო შეეცდება ხელახლა ჩართოს ეს პროგრამები.
+CloseApplications=&აპლიკაციების ავტომატურად გათიშვა
+DontCloseApplications=&არ გაითიშოს აპლიკაციები
+ErrorCloseApplications=საინსტალაციომ ავტომატურად ვერ გათიშა ყველა აპლიკაცია. რეკომენდებულია რომ გათიშოთ ყველა აპლიკაცია.
+PrepareToInstallNeedsRestart=საინსტალაციომ უნდა გადატვირთოს კომპიუტერი. კომპიუტერის გადატვირთვის შემდეგ ხელახლა გაუშვით საინსტალაციო რათა გაგრძელდეს [name]-(ი)ს ინსტალაცია.%n%nგსურთ ახლა გადატვირთვა?
+
+; *** "Installing" wizard page
+WizardInstalling=ინსტალდება
+InstallingLabel=მოითმინეთ სანამ საინსტალაციო დააინსტალებს [name]-(ი)ს კომპიუტერში.
+
+; *** "Setup Completed" wizard page
+FinishedHeadingLabel=სრულდება [name]-(ი)ს ინსტალაცია
+FinishedLabelNoIcons=საინსტალაციომ დაასრულა [name]-(ი)ს ინსტალაცია კომპიუტერში.
+FinishedLabel=საინსტალაციომ დაასრულა [name]-(ი)ს ინსტალაცია კომპიუტერში. პროგრამა გაეშვება შესაბამისი ხატულას მონიშვნის შემთხვევაში.
+ClickFinish=საინსტალაციოს გასათიშად დააჭირეთ დასრულებას.
+FinishedRestartLabel=[name]-(ი)ს ინსტალაციის დასრულებისთვის საჭიროა კომპიუტეირს გადატვირთვა. გსურთ ახლა გადატვირთვა?
+FinishedRestartMessage=[name]-(ი)ს ინსტალაციის დასრულებისთვის საჭიროა კომპიუტეირს გადატვირთვა.%n%nგსურთ ახლა გადატვირთვა?
+ShowReadmeCheck=README ფაილის ჩვენება
+YesRadio=&კი, გადაიტვირთოს კომპიუტერი
+NoRadio=&არა, მოგვიანებით გადავტვირთავ კომპიუტერს
+; used for example as 'Run MyProg.exe'
+RunEntryExec=გაეშვას %1
+; used for example as 'View Readme.txt'
+RunEntryShellExec=%1-(ი)ს ნახვა
+
+; *** "Setup Needs the Next Disk" stuff
+ChangeDiskTitle=ინსტალაციისთვის საჭიროა შემდეგი დისკი
+SelectDiskLabel2=ჩადეთ დისკი %1 და დააჭირეთ ღილაკს კარგი.%n%nთუ ფაილები არაა ქვემოთ მოცემულ მისამართზე დააჭირეთ მითითებას და მიუთითეთ სწორი მისამართი.
+PathLabel=&მისამართი:
+FileNotInDir2=ფაილი "%1" არ მოიძებნა "%2" მისამართზე. ჩადეთ სწორი დისკი და ან აირჩიეთ სხვა საქაღალდე.
+SelectDirectoryLabel=მიუთითეთ შემდეგი დისკის მდებარეობა.
+
+; *** Installation phase messages
+SetupAborted=ინსტალაცია არ დასრულდა.%n%nგაასწორეთ პრობლემა და გაუშვით ინსტალაცია ხელახლა.
+AbortRetryIgnoreSelectAction=აირჩიეთ მოქმედება
+AbortRetryIgnoreRetry=&ხელახლა ცდა
+AbortRetryIgnoreIgnore=&შეცდომის უგულებელყოფა და გაგრძელება
+AbortRetryIgnoreCancel=ინსტალაციის გაუქმება
+
+; *** Installation status messages
+StatusClosingApplications=ითიშება პროგრამები...
+StatusCreateDirs=მიმდინარეობს საქაღალდეების შექმნა...
+StatusExtractFiles=მიმდინარეობს ფაილების ამოარქივება...
+StatusCreateIcons=მიმდინარეობს ხატულების შექმნა...
+StatusCreateIniEntries=იქმნება INI ჩანაწერები...
+StatusCreateRegistryEntries=იქმნება რეესტრის ჩანაწერები...
+StatusRegisterFiles=მიმდინარეობს ფაილების რეგისტრაცია...
+StatusSavingUninstall=ინახება წასაშლელი ინფორმაცია...
+StatusRunProgram=სრულდება ინსტალაცია...
+StatusRestartingApplications=იტვირთება პროგრამები...
+StatusRollback=უქმდება ცვლილებები...
+
+; *** Misc. errors
+ErrorInternal2=შიდა შეცდომა: %1
+ErrorFunctionFailedNoCode=%1 არ შესრულდა
+ErrorFunctionFailed=%1 არ შესრულდა; კოდი %2
+ErrorFunctionFailedWithMessage=%1 არ შესრულდა; კოდი %2.%n%3
+ErrorExecutingProgram=არ შესრულდა file:%n%1
+
+; *** Registry errors
+ErrorRegOpenKey=შეცდომა რეესტრის გასაღების გახსნისას:%n%1\%2
+ErrorRegCreateKey=შეცდომა რეესტრის გასაღების შექმნისას:%n%1\%2
+ErrorRegWriteKey=შეცდომა რეესტრის გასაღების ჩაწერისას:%n%1\%2
+
+; *** INI errors
+ErrorIniEntry=შეცდომა INI ჩანაწერის შექმნისას ფაილში "%1".
+
+; *** File copying errors
+FileAbortRetryIgnoreSkipNotRecommended=&ფაილის გამოტოვება (არაა რეკომენდებული)
+FileAbortRetryIgnoreIgnoreNotRecommended=&შეცდომის უგულებელყოფა და გამოტოვება (არაა რეკომენდებული)
+SourceIsCorrupted=საწყისი ფაილი დაზიანებულია
+SourceDoesntExist=საწყისი ფაილი "%1" არსებობს
+ExistingFileReadOnly2=არსებული ფაილი არ ჩანაცვლდა, იმიტომ რომ ის არის მხოლოდ წაკითხვადი.
+ExistingFileReadOnlyRetry=&მხოლოდ წაკითხვადის მოხსნა და ხელახლა ცდა
+ExistingFileReadOnlyKeepExisting=&არსებული ფაილის დატოვება
+ErrorReadingExistingDest=შეცდომა არსებული ფაილის წაკითხვისას:
+FileExists=ფაილი უკვე არსებობს.%n%nგსურთ გადაეწეროს?
+ExistingFileNewer=არსებული ფაილი უფრო ახალია ვიდრე რომლის ინსტალაციასაც ცდილობთ. რეკომენდებულია დაიტოვოთ არსებული ფაილი.%n%nგსურთ არსებული ფაილის დატოვება?
+ErrorChangingAttr=შეცდომა არსებულ ფაილზე ატრიბუტის შეცვლისას:
+ErrorCreatingTemp=შეცდომა საქაღალდეში ფაილის შექმნისას:
+ErrorReadingSource=შეცდომა საწყისი ფაილის წაკითხვისას:
+ErrorCopying=შეცდომა ფაილის კოპირებისას:
+ErrorReplacingExistingFile=შეცდომა არსებულ ფაილზ გადაწერისას:
+ErrorRestartReplace=გადაწერა არ მოხერხდა:
+ErrorRenamingTemp=შეცდომა ფაილის სახელის შეცვლისას:
+ErrorRegisterServer=არ დარეგისტრდა DLL/OCX: %1
+ErrorRegSvr32Failed=RegSvr32 არ გაეშვა, კოდი: %1
+ErrorRegisterTypeLib=არ დარეგისტრდა ბიბლიოთეკა: %1
+
+; *** Uninstall display name markings
+; used for example as 'My Program (32-bit)'
+UninstallDisplayNameMark=%1 (%2)
+; used for example as 'My Program (32-bit, All users)'
+UninstallDisplayNameMarks=%1 (%2, %3)
+UninstallDisplayNameMark32Bit=32-bit
+UninstallDisplayNameMark64Bit=64-bit
+UninstallDisplayNameMarkAllUsers=ყველა მომხმარებელი
+UninstallDisplayNameMarkCurrentUser=ახლანდელი მომხმარებელი
+
+; *** Post-installation errors
+ErrorOpeningReadme=შეცდომა Readme ფაილის გახსნისას.
+ErrorRestartingComputer=საინსტალაციომ ვერ გადატვირთა კომპიუტერი. გადატვირთეთ ხელით.
+
+; *** Uninstaller messages
+UninstallNotFound=ფაილი "%1" არ არსებობს. არ წაიშალა.
+UninstallOpenError=ფაილი "%1" არ არსებობს. არ წაიშალა
+UninstallUnsupportedVer=წასაშლელი ჟურნალის ფაილი "%1" ისეთ ფორმატშია რომ ამ ვერსიის წამშლელი ვერ აღიქვამს. არ წაიშალა
+UninstallUnknownEntry=უცნობი ჩანაწერი (%1)
+ConfirmUninstall=ნამდვილად გსურთ სრულად წაშალოთ %1 და ყველა მისი კომპონენტი?
+UninstallOnlyOnWin64=ეს ინსტალაცია შეიძლება წაიშალოს მხოლოდ 64 ბიტიან Windows-ში.
+OnlyAdminCanUninstall=ეს ინსტალაცია შეიძლება წაიშალოს მხოლოდ ადმინისტრატორის უფლებებით.
+UninstallStatusLabel=მოითმინეთ სანამ %1 წაიშლება კომპიუტერიდან.
+UninstalledAll=%1 წაიშალა კომპიუტერიდან.
+UninstalledMost=%1-(ი)ს წაშლა დასრულდა.%n%nზოგიერთი ელემენტი არ წაიშალა და წაშალეთ ხელით.
+UninstalledAndNeedsRestart=იმისთვის რომ %1 წაიშალოს საჭიროა კომპიუტერის გადატვირთვა.%n%nგსურთ ახლა გადატვირთვა?
+UninstallDataCorrupted="%1" ფაილი დაზიანებულია. არ წაიშალა
+
+; *** Uninstallation phase messages
+ConfirmDeleteSharedFileTitle=წაიშალოს გაზიარებული ფაილი?
+ConfirmDeleteSharedFile2=სისტემამ აღმოაჩინა რომ მოცემულ გაზიარებულ ფაილს არ იყენებს არც ერთი პროგრამა. გსურთ წამშლელმა წაშალოს გაზიარებული ფაილი?%n%nთუ რომელიმე პროგრამა ისევ იყენებს ამ ფაილს და მას წაშლით, ეს პროგრამები ვეღარ იმუშავებენ ნორმალურად. დარწმუნებული თუ არ ხართ დააჭირეთ არას. ფაილის დატოვება არაფერს გააფუჭებს.
+SharedFileNameLabel=ფაილის სახელი:
+SharedFileLocationLabel=მდებარეობა:
+WizardUninstalling=წაშლის სტატუსი
+StatusUninstalling=იშლება %1...
+
+; *** Shutdown block reasons
+ShutdownBlockReasonInstallingApp=ინსტალდება %1.
+ShutdownBlockReasonUninstallingApp=იშლება %1.
+
+; The custom messages below aren't used by Setup itself, but if you make
+; use of them in your scripts, you'll want to translate them.
+
+[CustomMessages]
+
+NameAndVersion=%1 ვერსია %2
+AdditionalIcons=დამატებითი ხატულები:
+CreateDesktopIcon=ხატულას შექმნა სამუშაო მაგიდაზე
+CreateQuickLaunchIcon=სწრაფი გაშვების ხატულას შექმნა
+ProgramOnTheWeb=%1 ვებ-გვერდზე
+UninstallProgram=წაიშალოს %1
+LaunchProgram=გაეშვას %1
+AssocFileExtension=&ასოცირდეს %1 %2 ფაილის გაფართოებასთან?
+AssocingFileExtension=%1 ასოცირდება %2 ფაილების გაფართოებასთან...
+AutoStartProgramGroupDescription=გაშვება:
+AutoStartProgram=ავტომატურად გაშვება %1
+AddonHostProgramNotFound=%1 არ მოიძებნა მითითებულ საქაღალდეში.%n%nგსურთ გაგრძელება?

+ 0 - 317
Files/Languages/Unofficial/Georgian.islu

@@ -1,317 +0,0 @@
-; *** Inno Setup version 5.1.11+ Georgian messages ***
-;
-; Translation was made by Otari Sakhelashvili, [email protected]
-;   http://www.jrsoftware.org/files/istrans/
-;
-; Note: When translating this text, do not add periods (.) to the end of
-; messages that didn't have them already, because on those messages Inno
-; Setup adds the periods automatically (appending a period would result in
-; two periods being displayed).
-
-[LangOptions]
-; The following three entries are very important. Be sure to read and 
-; understand the '[LangOptions] section' topic in the help file.
-LanguageName=Georgian
-LanguageID=$0437
-LanguageCodePage=0
-; If the language you are translating to requires special font faces or
-; sizes, uncomment any of the following entries and change them accordingly.
-DialogFontName=Sylfaen
-;DialogFontSize=8
-WelcomeFontName=Sylfaen
-;WelcomeFontSize=12
-TitleFontName=Sylfaen
-;TitleFontSize=29
-CopyrightFontName=Sylfaen
-;CopyrightFontSize=8
-
-[Messages]
-
-; *** Application titles
-SetupAppTitle=ჩადგმა
-SetupWindowTitle=%1-ის - დაყენება
-UninstallAppTitle=წაშლა
-UninstallAppFullTitle=%1-ის წაშლა
-
-; *** Misc. common
-InformationTitle=ინფორმაცია
-ConfirmTitle=დადასტურება
-ErrorTitle=შეცდომა
-
-; *** SetupLdr messages
-SetupLdrStartupMessage=ეს დააყენებს %1-ს. გინდა გაგრძელება?
-LdrCannotCreateTemp=შეუძლებელია დროებითი ფაილის შექმნა. დაყენება გაჩერდა
-LdrCannotExecTemp=შეუძლებელია დროებითი ფაილების საქაღალდიდან ფაილის გახსნა. დაყენება გაჩერდა
-
-; *** Startup error messages
-LastErrorMessage=%1.%n%nშეცდომა %2: %3
-SetupFileMissing=ფაილი %1 დასაყენებელ საქაღალდეში არ არის. შეასწორეთ პრობლემა ან მოითხოვეთ პროგრამის ახალი ვერსია.
-SetupFileCorrupt=დამყენებლის ფაილები დაზიანებულია. გთხოვთ მოითხოვოთ პროგრამის ახალი ვერსია.
-SetupFileCorruptOrWrongVer=მოცემული ფაილები დაზინებულია ან მოცემულ დამყენებელთან არაა თავსებადი. შეასწორეთ პრობლემა ან მოითხოვეთ პროგრამის ახალი ვერსია.
-NotOnThisPlatform=მოცემული პროგრამა ვერ გაეშვება %1-ზე.
-OnlyOnThisPlatform=მოცემული პროგრამა უნდა გაეშვას %1-ზე.
-OnlyOnTheseArchitectures=ეს პროგრამა მარტო ყენდება Windows-ის კონკრეტულ პროცესორის არქიტექტურებზე:%n%n%1
-MissingWOW64APIs=იმ Windows-ის ვერსიას რომელსაც შენ იყენებ არ მოყვება ის ფუნქცია, რომელიც დამყენებელს საშეულებას მიცემს 64 ბიტიანი სისტემაზე დაყენება განახორციელოს. რომ გამოსწოროთ ეს პრობლემა დააყენე Service Pack %1.
-WinVersionTooLowError=ამ პროგრამს ჭირდება %1 ვერსია ან %2-ზე უფრო ახალი.
-WinVersionTooHighError=ეს პროგრამა ვერ დაყენდება %1 ვერსიაზე და %2-ზე უფრო ახალზე.
-AdminPrivilegesRequired=შენ უნდა იყო შესული როგორც ადმინისტრატორი, ამ პროგრამის დასაყენებლად.
-PowerUserPrivilegesRequired=შენ უნდა იყო ადმინისტრატორის ან გამოცდილი მოხმარებლის (Power Users) პროფილით, ამ პროგრამის დასაყენებლად.
-SetupAppRunningError=დამყენებელმა დააფიქსირა %1 არის გაშვებული.%n%nდაკეტეთ მისი ყველა პროცესი,მერე დააჭირე "კარგი"-ს, გასაგრძელებლად, ან "შეჩერება"-ს დასასრულებლად.
-UninstallAppRunningError=წამშლელმა დააფიქსირა %1 არის გაშვებული.%n%nდაკეტეთ მისი ყველა პროცესი, მერე დააჭირე "კარგი"-ს, გასაგრძელებლად, ან "შეჩერება"-ს დასასრულებლად.
-
-; *** Misc. errors
-ErrorCreatingDir=დამყენებელი ვერ ქმნის საქაღალდეს "%1"
-ErrorTooManyFilesInDir=შეუძლებელია ფაილის შექმნა "%1" რადგან იქ უკვე ბევრი ფაილია
-
-; *** Setup common messages
-ExitSetupTitle=დამყენებლიდან გასვლა
-ExitSetupMessage=დაყენება არ დამთავრებულა. თუ გახვალ, მოცემული პროგრამა არ დაყენდება.%n%nსხვა დროს მოგიწევს დამყენებლის გაშვება.%n%nგავიდე?
-AboutSetupMenuItem=&დამყენებლის შესახებ...
-AboutSetupTitle=დამყენებლის შესახებ
-AboutSetupMessage=%1 ვერსია %2%n%3%n%n%1 საშინაო გვერდი:%n%4
-AboutSetupNote=
-TranslatorNote=ქართულად თარგმნა ოთარ სახელაშვილმა [email protected]
-
-; *** Buttons
-ButtonBack=< &უკან
-ButtonNext=&წინ >
-ButtonInstall=&დააყენე
-ButtonOK=კარგი
-ButtonCancel=გაჩერება
-ButtonYes=&დიახ
-ButtonYesToAll=დიახ &ყველასთვისl
-ButtonNo=&არა
-ButtonNoToAll=არა ყ&ველასთვის
-ButtonFinish=&დასრულება
-ButtonBrowse=&ამორჩევა...
-ButtonWizardBrowse=ა&მორჩევა...
-ButtonNewFolder=&შექმენი ახალი საქაღალდე
-
-; *** "Select Language" dialog messages
-SelectLanguageTitle=აირჩიე დაყენების ენა
-SelectLanguageLabel=აირჩიე ინტეფეისის ენა, დაყენების განამავლობაში:
-
-; *** Common wizard text
-ClickNext=დააჭირე "წინ"-ს გასაგრძელებლად, "გაჩერება"-ს დაყენების შესაწყვეტად.
-BeveledLabel=
-BrowseDialogTitle=საქაღალდის არჩევა
-BrowseDialogLabel=აირჩიე სიიდან საქაღალდე და დააჭირე "კარგი"-ს.
-NewFolderName=ახალი საქაღალდე
-
-; *** "Welcome" wizard page
-WelcomeLabel1=მოგესალმება [name]-ის დაყენების ოსტატი
-WelcomeLabel2=ის დააყენებს [name/ver]-ს შენ კომპიუტერზე.%n%nრეკომენდირებულია დაკეტო ყველა პროგრამა, დაყენების დროს.
-
-; *** "Password" wizard page
-WizardPassword=პაროლი
-PasswordLabel1=ეს დაყენება პროლითაა დაცული.
-PasswordLabel3=შეიყვანე პაროლი, და დააჭირე "წინ"-ს გასაგრძელებლად. პაროლი შეიყვანეთ თანრიგის გათვალიწინებით.
-PasswordEditLabel=&პაროლი:
-IncorrectPassword=შეყვანილი პაროლი არასწორეა. ცადე ხელახლა.
-
-; *** "License Agreement" wizard page
-WizardLicense=სალიცენზიო შეთანხმება
-LicenseLabel=გთხოვთ წაიკითხოთ მოცემული ინფორმაცია გაგრძელებამდე.
-LicenseLabel3=გთხოვთ წაიკითხოთ მოცემული სალიცენზიო შეთანხმება. თქვენ უნდა დათახმდეთ მოცემულ სალიცენზიო შეთანხმებას გასაგრძელებლად.
-LicenseAccepted=მე &ვეთანხმები ამ შეთანხმებას
-LicenseNotAccepted=მე &არ ვეთანხმები ამ შეთანხმებას
-
-; *** "Information" wizard pages
-WizardInfoBefore=ინფორმაცია
-InfoBeforeLabel=გთხოვთ წაიკითხოთ ეს მნიშვნელოვანი ინფორმაცია გაგრძელებამდე.
-InfoBeforeClickLabel=როცა მზად იქნები დააჭირე "წინ"-ს.
-WizardInfoAfter=ინფორმაცია
-InfoAfterLabel=გთხოვთ წაიკითხოთ ეს მნიშვნელოვანი ინფორმაცია გაგრძელებამდე.
-InfoAfterClickLabel=როცა მზად იქნები დააჭირე "წინ"-ს.
-
-; *** "User Information" wizard page
-WizardUserInfo=ინფორმაცია მომხმარებელზე
-UserInfoDesc=შეიყვანე შენი ინფორმაცია.
-UserInfoName=&სახელი:
-UserInfoOrg=&ორგანიზაცია:
-UserInfoSerial=სერიული &ნომერი:
-UserInfoNameRequired=შენ უნდა შეიყვანოი სახელი.
-
-; *** "Select Destination Location" wizard page
-WizardSelectDir=აირჩიე დასაყენებელი საქაღალდე
-SelectDirDesc=სად უნდა დაყენდეს [name]?
-SelectDirLabel3=დამყენებელი [name]-ს დააყენებს შემდეგ საქაღალდეში.
-SelectDirBrowseLabel=გასაგრძელებლად დააჭირე "წინ"-ს. სხვა საქაღალდის ასარჩევად კი, "არჩევა"-ს.
-DiskSpaceMBLabel=[mb] მბ.-ზე მეტი თავისუფალი ადგილია საჭირო.
-ToUNCPathname=ვერ დააყენებ ქსელურ მისამრთზე. თუ გინდა ქსეულ მისამართზე დაყენება, დააყენე ქსელის დისკი.
-InvalidPath=შენ უნდა შეიყვანო სრული მისამართი, დისკის სახელიანა;მაგალითად:%n%nC:\APP%n%ან ამ ფორმით:%n%n\\server\share
-InvalidDrive=თქვენი არჩეული ქსელის მისამართი ან დისკი, მიუწდომელია ან არ არსებობს, აირჩიეთ სხვა.
-DiskSpaceWarningTitle=არასაკმარისი ადგილი
-DiskSpaceWarning=დამყენებელს ჭირდება %1 კბ. ცარიელი ადგილი, მაგრამ არჩეულ დისკზე მხოლოდ %2 კბ. არის თავისუფალი.%n%nგავაგრძელო?
-DirNameTooLong=მოცემული საქაღალდის სახელი ან მისამართი ძალიან გრძელია.
-InvalidDirName=მოცემული საქაღალდის სახელი არასწორეა.
-BadDirName32=საქაღალდის სახელი არ უნდა შეიცავდეს ამ სიმბლოებს:%n%n%1
-DirExistsTitle=საქაღალდე არსებობს
-DirExists=საქაღალდე:%n%n%1%n%nუკვე არსებობს. მაინც მანდ დავაყენო?
-DirDoesntExistTitle=საქაღალდე არ არსებობს
-DirDoesntExist=საქაღალდე:%n%n%1%n%nარ არსებობს. გინდა შეიქმნას?
-
-; *** "Select Components" wizard page
-WizardSelectComponents=აირჩიე კომპონენტები
-SelectComponentsDesc=რომელი კომპონენტი უნდა დაყენდეს?
-SelectComponentsLabel2=ჩართე დასაყენებელი კომპონენტები; გამორთე კომპონენტები რომლიც არ გინდა დაყენდეს. დააჭირე "წინ"-ს გასაგრძელებლად.
-FullInstallation=სრული დაყენება
-; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language)
-CompactInstallation=კომპაქტური დაყენება
-CustomInstallation=არჩევით დაყენება
-NoUninstallWarningTitle=დასაყენებელი კომპონენტები
-NoUninstallWarning=დაფიქსირდა რომ უკვე დაყენებულია შენ კომპიუტერზე ეს კომპონენტები:%n%n%1%n%nმათი ამორთვა გამოიწვევს მათ წაშლას.%n%nგავაგრძელო მაინც?
-ComponentSize1=%1 კბ.
-ComponentSize2=%1 მბ.
-ComponentsDiskSpaceMBLabel=არჩეული კომპონენეტები, იკავებს [mb] მბ. ადგილს.
-
-; *** "Select Additional Tasks" wizard page
-WizardSelectTasks=აირჩიე დამატებითი დავალებები
-SelectTasksDesc=რა უნდა შესრულდეს დამატებით?
-SelectTasksLabel2=არიჩიე დავალებები რაც ჩამდგმელმა უნდა შეასრულოს [name]-ს დაყენების დროს, მერე დააჭირე "წინ"-ს.
-
-; *** "Select Start Menu Folder" wizard page
-WizardSelectProgramGroup=აირჩიე საწყისი მენიუს საქაღალდე
-SelectStartMenuFolderDesc=სად უნდა განლაგდნენ პროგრამის მალმომხმობები?
-SelectStartMenuFolderLabel3=მალმომხმობები განლაგდება ამ საქაღალდეში.
-SelectStartMenuFolderBrowseLabel=გასაგრძელებლად დააჭირე "წინ"-ს. სხვა საქაღალდის ასარჩევად "არჩევას"-ს.
-MustEnterGroupName=თქვენ უნდა შეიყვანოთ საქაღალდის სახელი.
-GroupNameTooLong=საქაღალდის სახელი ან მისამრთი ძალიან გრძელია.
-InvalidGroupName=მოცემული საქაღალდის სახელი არასწორეა.
-BadGroupName=საქაღალდის სახელი არ უნდა შეიცავდეს ამ სიმბლოებს:%n%n%1
-NoProgramGroupCheck2=&ნუ შექმნი საწყისი მენიუს საქაღალდეს
-
-; *** "Ready to Install" wizard page
-WizardReady=მზადაა დასაყენებლად
-ReadyLabel1=დამყენებელი მზადაა [name] დააყენოს შენ კომპიუტერზე.
-ReadyLabel2a=დააჭირე "დაყენებას" დასაყენებლად, ან "უკან"-ს დაყენების პარამეტრების შესაცვლელად.
-ReadyLabel2b=დააჭირე "დაყენებას" დაყენების გასაგრძელებლად.
-ReadyMemoUserInfo=მომხარებლის ინფორმაცია:
-ReadyMemoDir=დაყენების ადგილი:
-ReadyMemoType=დაყენების ტიპი:
-ReadyMemoComponents=არჩეული კომპონენტები:
-ReadyMemoGroup=დაწყების მენიუს საქაღალდე:
-ReadyMemoTasks=სხვა დავალებები:
-
-; *** "Preparing to Install" wizard page
-WizardPreparing=დაყნებისთვის მზადება
-PreparingDesc=დამყენებელი ემზადება [name]-ის დაყენებითვის.
-PreviousInstallNotCompleted=წინა დაყენება/წაშლა არ დამთავრებულა. თქვენ კომპიუტერი უნდა გადატვირთოთ მის დასამთავრებლად.%n%nგადატვირთვის შემდეგ, გაუშვი ისევ ეს დამყენებელი და დააყენე [name].
-CannotContinue=დაყენება ვერ გძელდება. დააჭირე გაჩერებას გასასვლელად.
-
-; *** "Installing" wizard page
-WizardInstalling=ყენდება
-InstallingLabel=მოიცადე სანამ დაყენება [name] შენ კომპიუტერზე.
-
-; *** "Setup Completed" wizard page
-FinishedHeadingLabel=ვამთავრებ [name] დაყენების ოსტატს
-FinishedLabelNoIcons=დასრულდა [name]-ის დაყენება.
-FinishedLabel=დასრულდა [name]-ის დაყენება. მისი გაშვება დაყენებული ხატულით შეგიძლიათ.
-ClickFinish=დააჭირე დასასრულს გასასვლელად.
-FinishedRestartLabel=[name]-ის დაყენების დასასრულებლად, საჭიროა კომპიუტერის გადატვირთვა. გინდა ახლა გადაიტვირთოს?
-FinishedRestartMessage=[name]-ის დაყენების დასასრულებლად უნდა გადატვირთო კომპიუტერი.%n%nგინდა ახლა გადაიტვირთოს?
-ShowReadmeCheck=დიახ,მე მსურს დოკუმენტაციის წაკითხვა
-YesRadio=&დიახ, ახლვე გადატვირთე კომპიუტერი
-NoRadio=&არა, გადატვირთე მოგვიანებით
-; used for example as 'Run MyProg.exe'
-RunEntryExec=გახსენი %1
-; used for example as 'View Readme.txt'
-RunEntryShellExec=მაჩვენე %1
-
-; *** "Setup Needs the Next Disk" stuff
-ChangeDiskTitle=დამყენებელს შემდეგი დისკი ჭირდება
-SelectDiskLabel2=გთხოვთ ჩადოთ დისკი %1 და დააჭიროთ კარგის.%n%nთუ ამ დისკი ფაილები სხვა საქაღალდეშია, ამოირჩიე ან მიუთითე სრული გზა.
-PathLabel=&მისამართი:
-FileNotInDir2=ფაილი "%1" ვერ ვიპოვე აქ: "%2". აირჩიე სწორი დისკი ან საქაღალდე.
-SelectDirectoryLabel=აირჩიე შემდეგი დისკი ადგილი.
-
-; *** Installation phase messages
-SetupAborted=ვერ დაყენდა.%n%nგაასწორე შეცდომა და ხელახლა გაუშვი.
-EntryAbortRetryIgnore=დააჭირე გამეორებას და ისევ ცადე, დააჭირე იგნორირებას გასაგრძელებალად, ან გარეჩერებას შეჩერებისთვის.
-
-; *** Installation status messages
-StatusCreateDirs=საქაღალდეები იქმნება...
-StatusExtractFiles=ფაილების განიკუმშება...
-StatusCreateIcons=მალმომხმობები იქმნება...
-StatusCreateIniEntries=INI  ჩანაწერები კეთდება...
-StatusCreateRegistryEntries=რეესტრის იცვლება...
-StatusRegisterFiles=ფაილების რეგისტრირდება...
-StatusSavingUninstall=ინახება წაშლის ინფორმაცია...
-StatusRunProgram=ჩადგმის დასრულება...
-StatusRollback=პარამეტრების უკან დაბრუნება...
-
-; *** Misc. errors
-ErrorInternal2=შიდა შეცდომა: %1
-ErrorFunctionFailedNoCode=%1 ჩაიშალა
-ErrorFunctionFailed=%1 ჩაიშალა; კოდი %2
-ErrorFunctionFailedWithMessage=%1 ჩაიშალა; კოდი %2.%n%3
-ErrorExecutingProgram=შეუძლებელია გაეშვას ფაილი:%n%1
-
-; *** Registry errors
-ErrorRegOpenKey=ვერ იკითხება რეესტრის გასაღები:%n%1\%2
-ErrorRegCreateKey=ვერ იქმენება რეესტრის გასაღები:%n%1\%2
-ErrorRegWriteKey=ვერ იწერება რეესტრის გასაღები:%n%1\%2
-
-; *** INI errors
-ErrorIniEntry=ვერ შეიქმნა INI ჩანაწერი ამ ფაილში: "%1".
-
-; *** File copying errors
-FileAbortRetryIgnore=დააჭირე განმეორებას კიდევ საცდელად, იგნორირებას გამოსატოვებლად (არაა რეკომენდირებული), ან გაჩერებას შესაწყვეტად.
-FileAbortRetryIgnore2=დააჭირე განმეორებას კიდევ საცდელად, იგნორირებას გამოსატოვებლად (არაა რეკომენდირებული), ან გაჩერებას შესაწყვეტად.
-SourceIsCorrupted=რესურსის ფაილი დაზიანებულია
-SourceDoesntExist=რესურსის ფაიალი "%1" არ არსებობს
-ExistingFileReadOnly=ფაილი მონიშნულია როგორც მხოლოდ წაკითხვადი.%n%nდააჭირე გაგაძელებას ამ მარკის მოსასხნელად და გასაგრძელებლად, იგნორირებას ფაილის გამოსატოვებლად, ან გაჩერებას შესაწყვეტად.
-ErrorReadingExistingDest=შეცდომა მოცემული ფაილის წაკთხვის დროს:
-FileExists=მოცემული ფაილი არსებობს.%n%nგინდა გადაეწეროს?
-ExistingFileNewer=მოცემული ფაილი იმაზე ახალია ვიდრე ახლა ყენდება. რეკომენდირებულია მისი შენარჩუნება.%n%nგინდა შეინარჩუნო?
-ErrorChangingAttr=შეცდომა ფაილის ატრიბუტის ცვლილებისას:
-ErrorCreatingTemp=შეცდომა ფაილის შემნისას მოცემულ საქაღალდეში:
-ErrorReadingSource=შეცდომა რესურსის ფაილის წაკითხვისას:
-ErrorCopying=შეცდომა ფაილის კოპირებისას:
-ErrorReplacingExistingFile=შეცდომა ფაილის გადაწერისას:
-ErrorRestartReplace=გადატვირთვითი გადაწერის შეცდომა:
-ErrorRenamingTemp=შეცდომა მოცემულ საქაღალდეში ფაილის გარდაქმევისას:
-ErrorRegisterServer=შეუძლებელია DLL/OCX-ის რეგისტრირება: %1
-ErrorRegSvr32Failed=RegSvr32 გაითიშა, შეცდომის კოდით %1
-ErrorRegisterTypeLib=შეუძლებებლია ბიბლოთეკის რეგიტრირება: %1
-
-; *** Post-installation errors
-ErrorOpeningReadme=შეცოდმა დოკუმენტაციის გახსნისას.
-ErrorRestartingComputer=შეცდომა კომპიუტერის გადატვირთვისას. გადატვირთეთ თვითონ.
-
-; *** Uninstaller messages
-UninstallNotFound=File "%1" არ არსებობს. შეუძლებელია წაშლა.
-UninstallOpenError=File "%1" ვერ იხსნება. შეუძლებელია წაშლა
-UninstallUnsupportedVer=წაშლის ჟურნალი "%1" ამ ვერსიის წამშლელთან არათავსებადია. შეუძლებელია წაშლა
-UninstallUnknownEntry=უცნობი ჩანაწერია (%1) ნაპოვნი ჟურნალში
-ConfirmUninstall=ნამდვიდალდ გსურს %1-ის წაშლა ყველა კომპონენეტით?
-UninstallOnlyOnWin64=ეს პროგრამა მარტო წაიშლება 64 თანრიგიანი Windows-დან.
-OnlyAdminCanUninstall=ამ პროგრამის წაშლას ადმინისტრატორის უფლებები ჭირდება.
-UninstallStatusLabel=მოითმინეთ, სანამ %1 წაიშლება.
-UninstalledAll=%1 წარმეტებით წაიშალა.
-UninstalledMost=%1 წაშლა დამთავრდა.%n%nმაგრამ ზოგიერთი კომპონენტი არ წაიშლა. ისინი შეგიძლიათ ხელით წაშალოთ.
-UninstalledAndNeedsRestart=%1-ის წაშლის დასასრულებლად კომპიუტერი უნდა გადაიტვირთოს.%n%nგნებავთ ახლა?
-UninstallDataCorrupted="%1"დაზიანებულია. შეუძლებელია წაშლა
-
-; *** Uninstallation phase messages
-ConfirmDeleteSharedFileTitle=წავშალო საზიარო ფაილი?
-ConfirmDeleteSharedFile2=სისტემამ დაადგინა რომ ამ გაზირებულ ფაილს არცერთი პროგრამა იყენებს. გინდა რომ ის წაიშალოს?%n%nთუ მაინც რომელიმე პროგრამა მას იყენებს, შეწყვეტს ფუნცინირებას. თუ არ იცი, არ წაშალო. მისი სისტემაში დატოვებით არაფერი მოხდება.
-SharedFileNameLabel=ფაილსი სახელი:
-SharedFileLocationLabel=ადგილი:
-WizardUninstalling=წაშლის მიმდინარეობა
-StatusUninstalling=იშლება %1...
-
-; The custom messages below aren't used by Setup itself, but if you make
-; use of them in your scripts, you'll want to translate them.
-
-[CustomMessages]
-
-NameAndVersion=%1 ვერსია %2
-AdditionalIcons=დამატებითი ხატულები:
-CreateDesktopIcon=შექმენი &სამუშაო დაფაზე ხატულა
-CreateQuickLaunchIcon=შექმენი ს&წრაფ გამოძახებაში ხატულა
-ProgramOnTheWeb=%1 ინტერნეტში
-UninstallProgram=წაშალე %1
-LaunchProgram=გაუშვი %1
-AssocFileExtension=&მიაბი %1-ის გაფართოება  %2-ს
-AssocingFileExtension=ვაბამ %1-ს %2-ზე...

+ 6 - 3
Files/Languages/Unofficial/Greek.isl

@@ -1,4 +1,4 @@
-; *** Inno Setup version 6.0.0+ Greek messages ***
+; *** Inno Setup version 6.0.3+ Greek messages ***
 ;
 ; To download user-contributed translations of this file, go to:
 ;   http://www.jrsoftware.org/files/istrans/
@@ -10,7 +10,7 @@
 ;
 ; Originally translated by Anastasis Chatzioglou, [email protected]
 ; Updated by XhmikosR [XhmikosR, my_nickname at yahoo dot com]
-; Updated to version 6.0.0+ by V. Karamichail, [email protected]
+; Updated to version 6.0.3+ by Vasileios Karamichail, [email protected]
 ;
 
 [LangOptions]
@@ -156,6 +156,7 @@ WizardSelectDir=Επιλογή Φακέλου Εγκατάστασης
 SelectDirDesc=Πού θέλετε να εγκατασταθεί το [name];
 SelectDirLabel3=Ο Οδηγός Εγκατάστασης θα εγκαταστήσει το [name] στον ακόλουθο φάκελο.
 SelectDirBrowseLabel=Για να συνεχίσετε, πατήστε Επόμενο. Εάν θέλετε να επιλέξετε διαφορετικό φάκελο, πατήστε Αναζήτηση.
+DiskSpaceGBLabel=Απαιτούνται τουλάχιστον [gb] GB ελεύθερου χώρου στο δίσκο.
 DiskSpaceMBLabel=Απαιτούνται τουλάχιστον [mb] MB ελεύθερου χώρου στο δίσκο.
 CannotInstallToNetworkDrive=Η εγκατάσταση δεν μπορεί να γίνει σε δίσκο δικτύου.
 CannotInstallToUNCPath=Η εγκατάσταση δεν μπορεί να γίνει σε διαδρομή UNC.
@@ -183,6 +184,7 @@ NoUninstallWarningTitle=Οι Λειτουργικές Μονάδες Υπάρχ
 NoUninstallWarning=Ο Οδηγός Εγκατάστασης εντόπισε ότι τα ακόλουθα στοιχεία είναι ήδη εγκατεστημένα στον υπολογιστή σας:%n%n%1%n%nΑποεπιλέγοντας αυτά τα στοιχεία δεν θα απεγκατασταθούν.%n%nΘέλετε να συνεχίσετε παρόλα αυτά;
 ComponentSize1=%1 KB
 ComponentSize2=%1 MB
+ComponentsDiskSpaceGBLabel=Η τρέχουσα επιλογή απαιτεί τουλάχιστον [gb] GB χώρου στο δίσκο.
 ComponentsDiskSpaceMBLabel=Η τρέχουσα επιλογή απαιτεί τουλάχιστον [mb] MB χώρου στο δίσκο.
 
 ; *** "Select Additional Tasks" wizard page
@@ -222,7 +224,8 @@ ApplicationsFound=Οι ακόλουθες εφαρμογές χρησιμοπο
 ApplicationsFound2=Οι ακόλουθες εφαρμογές χρησιμοποιούν αρχεία που πρέπει να ενημερωθούν από τον Οδηγό Εγκατάστασης. Συνιστάται να επιτρέψετε στον Οδηγό Εγκατάστασης να κλείσει αυτόματα αυτές τις εφαρμογές. Μετά την ολοκλήρωση της εγκατάστασης, ο Οδηγός Εγκατάστασης θα επιχειρήσει να κάνει επανεκκίνηση των εφαρμογών.
 CloseApplications=&Αυτόματο κλείσιμο των εφαρμογών
 DontCloseApplications=&Χωρίς κλείσιμο των εφαρμογών
-ErrorCloseApplications=Η εγκατάσταση δεν μπόρεσε να κλείσει αυτόματα όλες τις εφαρμογές. Συνιστάται να κλείσετε όλες τις εφαρμογές που χρησιμοποιούν αρχεία που πρέπει να ενημερωθούν από τον Οδηγό Εγκατάστασης προτού συνεχίσετε.
+ErrorCloseApplications=Ο Οδηγός Εγκατάστασης δεν μπόρεσε να κλείσει αυτόματα όλες τις εφαρμογές. Συνιστάται να κλείσετε όλες τις εφαρμογές που χρησιμοποιούν αρχεία που πρέπει να ενημερωθούν από τον Οδηγό Εγκατάστασης προτού συνεχίσετε.
+PrepareToInstallNeedsRestart=Ο Οδηγός Εγκατάστασης πρέπει να κάνει επανεκκίνηση του υπολογιστή σας. Μετά την επανεκκίνηση του υπολογιστή σας, εκτελέστε ξανά τον Οδηγό Εγκατάστασης για να ολοκληρώσετε την εγκατάσταση του [name].%n%nΘα θέλατε να κάνετε επανεκκίνηση τώρα;
 
 ; *** "Installing" wizard page
 WizardInstalling=Εγκατάσταση

+ 5 - 5
Files/Languages/Unofficial/Hungarian.isl

@@ -43,7 +43,7 @@ ErrorTitle=Hiba
 ; *** SetupLdr messages
 SetupLdrStartupMessage=%1 telepítve lesz. Szeretné folytatni?
 LdrCannotCreateTemp=Átmeneti fájl létrehozása nem lehetséges. A telepítés megszakítva
-LdrCannotExecTemp=Fájl futattása nem lehetséges az átmeneti könyvtárban. A telepítés megszakítva
+LdrCannotExecTemp=Fájl futtatása nem lehetséges az átmeneti könyvtárban. A telepítés megszakítva
 HelpTextNote=
 
 ; *** Startup error messages
@@ -222,7 +222,7 @@ ApplicationsFound2=A k
 CloseApplications=&Alkalmazások automatikus bezárása
 DontCloseApplications=&Ne zárja be az alkalmazásokat
 ErrorCloseApplications=A Telepítő nem tudott minden alkalmazást automatikusan bezárni. A folytatás előtt ajánlott minden, a Telepítő által frissítendő fájlokat használó alkalmazást bezárni.
-PrepareToInstallNeedsRestart=A telepítőnek újra kell indítania a számítógépet. Újaindítást követően, futassa újból a telepítőt, a [name] telepítésének befejezéséhez .%n%nÚjra szeretné indítani most a számítógépet?
+PrepareToInstallNeedsRestart=A telepítőnek újra kell indítania a számítógépet. Újraindítást követően, futtassa újból a telepítőt, a [name] telepítésének befejezéséhez .%n%nÚjra szeretné indítani most a számítógépet?
 
 ; *** "Installing" wizard page
 WizardInstalling=Telepítés
@@ -323,7 +323,7 @@ ErrorRestartingComputer=A Telep
 
 ; *** Uninstaller messages
 UninstallNotFound=A(z) "%1" fájl nem létezik. Nem távolítható el.
-UninstallOpenError=A(z) "%1" fájl nem nyitható meg. Nem távolítható el
+UninstallOpenError=A(z) "%1" fájl nem nyitható meg. Nem távolítható el.
 UninstallUnsupportedVer=A(z) "%1" eltávolítási naplófájl formátumát nem tudja felismerni az eltávolító jelen verziója. Az eltávolítás nem folytatható
 UninstallUnknownEntry=Egy ismeretlen bejegyzés (%1) található az eltávolítási naplófájlban
 ConfirmUninstall=Biztosan el kívánja távolítani a(z) %1 programot és minden összetevőjét?
@@ -331,7 +331,7 @@ UninstallOnlyOnWin64=Ezt a telep
 OnlyAdminCanUninstall=Ezt a telepítést csak adminisztrációs jogokkal rendelkező felhasználó távolíthatja el.
 UninstallStatusLabel=Legyen türelemmel, amíg a(z) %1 számítógépéről történő eltávolítása befejeződik.
 UninstalledAll=A(z) %1 sikeresen el lett távolítva a számítógépről.
-UninstalledMost=A(z) %1 eltávolítása befejeződött.%n%nNéhány elemet nem lehetetett eltávolítani. Törölje kézileg.
+UninstalledMost=A(z) %1 eltávolítása befejeződött.%n%nNéhány elemet nem lehetett eltávolítani. Törölje kézileg.
 UninstalledAndNeedsRestart=A(z) %1 eltávolításának befejezéséhez újra kell indítania a számítógépét.%n%nÚjraindítja most?
 UninstallDataCorrupted=A(z) "%1" fájl sérült. Nem távolítható el.
 
@@ -355,7 +355,7 @@ ShutdownBlockReasonUninstallingApp=%1 elt
 NameAndVersion=%1, verzió: %2
 AdditionalIcons=További parancsikonok:
 CreateDesktopIcon=&Asztali ikon létrehozása
-CreateQuickLaunchIcon=&Gyorsindítás parancsikon létrehozása
+CreateQuickLaunchIcon=&Gyorsindító parancsikon létrehozása
 ProgramOnTheWeb=%1 az interneten
 UninstallProgram=Eltávolítás - %1
 LaunchProgram=Indítás %1

+ 36 - 15
Files/Languages/Unofficial/Lithuanian.isl

@@ -1,7 +1,7 @@
-; *** Inno Setup version 6.0.3+ Lithuanian messages ***
+; *** Inno Setup version 6.1.0+ Lithuanian messages ***
 ;
 ; To download user-contributed translations of this file, go to:
-;   http://www.jrsoftware.org/files/istrans/
+;   https://jrsoftware.org/files/istrans/
 ;
 ; Note: When translating this text, do not add periods (.) to the end of
 ; messages that didn't have them already, because on those messages Inno
@@ -165,9 +165,9 @@ DiskSpaceWarning=Diegimui reikia bent %1 KB laisvos vietos, bet nurodytame diske
 DirNameTooLong=Katalogo pavadinimas ar kelias iki jo per ilgas.
 InvalidDirName=Nekorektiðkas katalogo pavadinimas.
 BadDirName32=Katalogo pavadinime neturi bûti simboliø:%n%n%1
-DirExistsTitle=Toks katalogas egzistuoja
-DirExists=Katalogas:%n%n%1%n%n jau egzistuoja. Vis tiek norite diegti programà tame kataloge?
-DirDoesntExistTitle=Toks katalogas neegzistuoja.
+DirExistsTitle=Tokio katalogo nëra
+DirExists=Katalogas:%n%n%1%n%n jau yra. Vis tiek norite diegti programà tame kataloge?
+DirDoesntExistTitle=Tokio katalogo nëra.
 DirDoesntExist=Katalogas:%n%n%1%n%n neegzistuoja. Norite kad katalogas bûtø sukurtas?
 
 ; *** "Select Components" wizard page
@@ -213,6 +213,18 @@ ReadyMemoComponents=Pasirinkti komponentai:
 ReadyMemoGroup=„Start Menu“ katalogas:
 ReadyMemoTasks=Papildomi veiksmai:
 
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Parsisiunèiami papildomi failai...
+ButtonStopDownload=&Stabdyti parsisiuntimà
+StopDownload=Ar tikrai norite sustabdyti parsisiuntimà?
+ErrorDownloadAborted=Parsisiuntimas nutrauktas
+ErrorDownloadFailed=Parsisiøsti nepavyko: %1 %2
+ErrorDownloadSizeFailed=Nepavyko gauti dydþio: %1 %2
+ErrorFileHash1=Failo patikrinimas nepavyko: %1
+ErrorFileHash2=Neteisinga failo „hash“ reikðmë: numatyta %1, rasta %2
+ErrorProgress=Netinkama eiga: %1 ið %2
+ErrorFileSize=Neteisingas failo dydis: numatytas %1, rastas %2
+
 ; *** "Preparing to Install" wizard page
 WizardPreparing=Pasirengimas diegimui
 PreparingDesc=Diegimo programa pasirengusi „[name]“ diegimui Jûsø kompiuteryje.
@@ -290,18 +302,27 @@ ErrorIniEntry=Klaida ra
 FileAbortRetryIgnoreSkipNotRecommended=Pralei&sti ðá failà (nerekomenduojama)
 FileAbortRetryIgnoreIgnoreNotRecommended=&Ignoruoti klaidà ir tæsti (nerekomenduojama)
 SourceIsCorrupted=Pradinis failas sugadintas
-SourceDoesntExist=Pradinis failas „%1“ neegzistuoja
-ExistingFileReadOnly2=Egzistuojantis failas yra paþymëtas „Tik skaitymui“ todël negali bûti pakeistas.
+SourceDoesntExist=Pradinio failo „%1“ nëra
+ExistingFileReadOnly2=Esamas failas yra paþymëtas „Tik skaitymui“ todël negali bûti pakeistas.
 ExistingFileReadOnlyRetry=Paðalinkite at&ributà „Tik skaitymui“ ir bandykite vël
-ExistingFileReadOnlyKeepExisting=Pali&kti egzistuojantá failà
-ErrorReadingExistingDest=Skaitant egzistuojantá failà ávyko klaida:
-FileExists=Toks failas jau egzistuoja.%n%nNorite, kad diegimo programa perraðytø failà?
-ExistingFileNewer=Egzistuojantis failas yra naujesnis uþ tà, kurá diegimo programa bando áraðyti. Rekomenduojama palikti esantá naujesná failà.%n%nNorite palikti naujesná failà?
+ExistingFileReadOnlyKeepExisting=Pali&kti esamà failà
+ErrorReadingExistingDest=Skaitant esamà failà ávyko klaida:
+FileExistsSelectAction=Pasirinkite veiksmà
+FileExists2=Toks failas jau yra.
+FileExistsOverwriteExisting=&Perraðyti esamà failà
+FileExistsKeepExisting=Pali&kti esamà failà
+FileExistsOverwriteOrKeepAll=&Daryti taip ir esant kitiems konfliktams
+ExistingFileNewerSelectAction=Pasirinkite veiksmà
+ExistingFileNewer=Esamas failas yra naujesnis uþ tà, kurá diegimo programa bando áraðyti. Rekomenduojama palikti esamà failà.%n%nPalikti naujesná failà?
+ExistingFileNewer2=Esamas failas yra naujesnis uþ tà, kurá diegimo programa bando áraðyti.
+ExistingFileNewerOverwriteExisting=&Perraðyti esamà failà
+ExistingFileNewerKeepExisting=Pali&kti esamà failà (rekomenduojama)
+ExistingFileNewerOverwriteOrKeepAll=&Daryti taip ir esant kitiems konfliktams
 ErrorChangingAttr=Keièiant failo atributus ávyko klaida:
 ErrorCreatingTemp=Kuriant failà pasirinktame kataloge ávyko klaida:
 ErrorReadingSource=Skaitant diegiamàjá failà ávyko klaida:
 ErrorCopying=Kopijuojant failà ávyko klaida:
-ErrorReplacingExistingFile=Perraðant egzistuojantá failà ávyko klaida:
+ErrorReplacingExistingFile=Perraðant esamà failà ávyko klaida:
 ErrorRestartReplace=Perkrovimas/Perraðymas nepavyko:
 ErrorRenamingTemp=Pervadinant failà pasirinktame kataloge ávyko klaida:
 ErrorRegisterServer=Nepavyko uþregistruoti DLL/OCX bibliotekos: „%1“
@@ -323,7 +344,7 @@ ErrorOpeningReadme=Bandant atidaryti 
 ErrorRestartingComputer=Diegimo programa negali perkrauti kompiuterio. Perkraukite kompiuterá áprastu bûdu.
 
 ; *** Uninstaller messages
-UninstallNotFound=„%1“ failas neegzistuoja. Paðalinti neámanoma.
+UninstallNotFound=„%1“ failo nëra. Paðalinti neámanoma.
 UninstallOpenError=„%1“ failas negali bûti atidarytas. Paðalinti neámanoma.
 UninstallUnsupportedVer=Paðalinimo þurnalo failas „%1“ yra paðalinimo programai nesuprantamo formato. Paðalinti neámanoma.
 UninstallUnknownEntry=Neþinomas áraðas (%1) rastas paðalinimo þurnalo faile.
@@ -362,6 +383,6 @@ UninstallProgram=Pa
 LaunchProgram=Paleisti „%1“
 AssocFileExtension=&Susieti „%1“ programà su failo plëtiniu %2
 AssocingFileExtension=„%1“ programa susiejama su failo plëtiniu %2...
-AutoStartProgramGroupDescription=Atomatinë paleistis:
-AutoStartProgram=Atomatiðkai paleisti „%1“
+AutoStartProgramGroupDescription=Automatinë paleistis:
+AutoStartProgram=Automatiðkai paleisti „%1“
 AddonHostProgramNotFound=„%1“ nerasta Jûsø nurodytame kataloge.%n%nVis tiek norite tæsti?

+ 34 - 8
Files/Languages/Unofficial/SerbianCyrillic.isl

@@ -1,9 +1,9 @@
-; *** Inno Setup version 5.5.3+ Serbian (Cyrillic) messages ***
+; *** Inno Setup version 6.0.3+ Serbian (Cyrillic) messages ***
 ;
 ; To download user-contributed translations of this file, go to:
 ;   http://www.jrsoftware.org/files/istrans/
 ;
-; Translated by Rancher ([email protected]).
+; Translated by Rancher ([email protected]) and Davor ([email protected]).
 ;
 ; Note: When translating this text, do not add periods (.) to the end of
 ; messages that didn't have them already, because on those messages Inno
@@ -44,6 +44,7 @@ ErrorTitle=
 SetupLdrStartupMessage=Инсталираћете %1. Желите ли да наставите?
 LdrCannotCreateTemp=Не могу да направим привремену датотеку. Инсталација је прекинута.
 LdrCannotExecTemp=Не могу да покренем датотеку у привременој фасцикли. Инсталација је прекинута.
+HelpTextNote=
 
 ; *** Startup error messages
 LastErrorMessage=%1.%n%nГрешка %2: %3
@@ -57,13 +58,21 @@ WindowsServicePackRequired=
 NotOnThisPlatform=Програм неће радити на %1.
 OnlyOnThisPlatform=Програм ће радити на %1.
 OnlyOnTheseArchitectures=Програм се може инсталирати само на издањима виндоуса који раде на следећим архитектурама процесора:%n%n%1
-MissingWOW64APIs=Издање виндоуса које користите не садржи функционалност потребну за извршавање 64-битних инсталација. Инсталирајте сервисни пакет %1 да бисте решили овај проблем.
 WinVersionTooLowError=Програм захтева %1, издање %2 или новије.
 WinVersionTooHighError=Програм не можете инсталирати на %1 издању %2 или новијем.
 AdminPrivilegesRequired=Морате бити пријављени као администратор да бисте инсталирали програм.
 PowerUserPrivilegesRequired=Морате бити пријављени као администратор или овлашћени корисник да бисте инсталирали програм.
 SetupAppRunningError=Програм %1 је тренутно покренут.%n%nЗатворите га и кликните на дугме „У реду“ да наставите или „Откажи“ да напустите инсталацију.
 UninstallAppRunningError=Програм %1 је тренутно покренут.%n%nЗатворите га и кликните на дугме „У реду“ да наставите или „Откажи“ да напустите инсталацију.
+; *** Startup questions
+PrivilegesRequiredOverrideTitle=Одаберите начин инсталације
+PrivilegesRequiredOverrideInstruction=Одаберите начин инсталације
+PrivilegesRequiredOverrideText1=%1 може бити инсталиран за све кориснике (захтева административне привилегије) или само за вас.
+PrivilegesRequiredOverrideText2=%1 може да се инсталира само за вас или за све кориснике (захтева административне привилегије).
+PrivilegesRequiredOverrideAllUsers=Инсталирај за &све кориснике
+PrivilegesRequiredOverrideAllUsersRecommended=Инсталирај за &све кориснике (препоручено)
+PrivilegesRequiredOverrideCurrentUser=Инсталирај само за &мене
+PrivilegesRequiredOverrideCurrentUserRecommended=Инсталирај само за &мене (препоручено)
 
 ; *** Misc. errors
 ErrorCreatingDir=Не могу да направим фасциклу „%1“.
@@ -76,7 +85,7 @@ AboutSetupMenuItem=&
 AboutSetupTitle=Подаци о програму
 AboutSetupMessage=%1 верзија %2%n%3%n%n%1 матична страница:%n%4
 AboutSetupNote=
-TranslatorNote=Serbian translation by Rancher.
+TranslatorNote=
 
 ; *** Buttons
 ButtonBack=< &Назад
@@ -170,6 +179,7 @@ NoUninstallWarningTitle=
 NoUninstallWarning=Следеће компоненте већ постоје на рачунару:%n%n%1%n%nДештриклирање ових компоненти их неће уклонити.%n%nЖелите ли да наставите?
 ComponentSize1=%1 kB
 ComponentSize2=%1 MB
+ComponentsDiskSpaceGBLabel=Изабране ставке захтевају најмање [gb] GB слободног простора.
 ComponentsDiskSpaceMBLabel=Изабране ставке захтевају најмање [mb] MB слободног простора.
 
 ; *** "Select Additional Tasks" wizard page
@@ -210,6 +220,7 @@ ApplicationsFound2=
 CloseApplications=&Затвори програме
 DontCloseApplications=&Не затварај програме
 ErrorCloseApplications=Не могу да затворим све програме. Пре него што наставите, препоручујемо вам да затворите све програме који користе датотеке које треба да ажурира инсталациони програм.
+PrepareToInstallNeedsRestart=Инсталација мора да поново покрене рачунар. Након поновног покретања рачунара, поново покрените инсталацију да бисте довршили инсталацију [name].%n%nЖелите ли поново покренути рачунар сада?
 
 ; *** "Installing" wizard page
 WizardInstalling=Инсталирање
@@ -239,7 +250,10 @@ SelectDirectoryLabel=
 
 ; *** Installation phase messages
 SetupAborted=Инсталација није завршена.%n%nИсправите проблем и покрените је поново.
-EntryAbortRetryIgnore=Кликните на „Покушај опет“ да поновите радњу, „Занемари“ да наставите у сваком случају или „Прекини“ да обуставите инсталацију.
+AbortRetryIgnoreSelectAction=Изаберите радњу
+AbortRetryIgnoreRetry=&Покушај опет
+AbortRetryIgnoreIgnore=&Занемари грешку и наставу
+AbortRetryIgnoreCancel=Прекини инсталацију
 
 ; *** Installation status messages
 StatusClosingApplications=Затварам програме…
@@ -270,11 +284,13 @@ ErrorRegWriteKey=
 ErrorIniEntry=Грешка при стварању INI уноса у датотеци „%1“.
 
 ; *** File copying errors
-FileAbortRetryIgnore=Кликните на „Покушај опет“ да поновите радњу, „Занемари“ да прескочите датотеку (не препоручује се) или „Прекини“ да обуставите инсталацију.
-FileAbortRetryIgnore2=Кликните на „Покушај опет“ да поновите радњу, „Занемари“ да наставите у сваком случају (не препоручује се) или „Прекини“ да обуставите инсталацију.
+FileAbortRetryIgnoreSkipNotRecommended=&Прескочите ову датотеку (не препоручује се)
+FileAbortRetryIgnoreIgnoreNotRecommended=&Занемари грешку и настави (не препоручује се)
 SourceIsCorrupted=Изворна датотека је оштећена
 SourceDoesntExist=Изворна датотека „%1“ не постоји
-ExistingFileReadOnly=Постојећа датотека је само за читање.%n%nКликните на „Покушај опет“ да уклоните особину „само за читање“ и поновите радњу, „Занемари“ да прескочите датотеку или „Прекини“ да обуставите инсталацију.
+ExistingFileReadOnly2=Постојећа датотека не може да се замени јер је само за читање.
+ExistingFileReadOnlyRetry=&Уклоните атрибут само за читање и покушајте поново
+ExistingFileReadOnlyKeepExisting=&Задржите постојећу датотеку
 ErrorReadingExistingDest=Дошло је до грешке при покушају читања постојеће датотеке:
 FileExists=Датотека већ постоји.%n%nЖелите ли да је замените?
 ExistingFileNewer=Постојећа датотека је новија од оне коју треба поставити. Препоручујемо вам да задржите постојећу датотеку.%n%nЖелите ли то да урадите?
@@ -289,6 +305,16 @@ ErrorRegisterServer=
 ErrorRegSvr32Failed=RegSvr32 није успео. Грешка %1
 ErrorRegisterTypeLib=Не могу да упишем библиотеку типова: %1
 
+; *** Uninstall display name markings
+; used for example as 'My Program (32-bit)'
+UninstallDisplayNameMark=%1 (%2)
+; used for example as 'My Program (32-bit, All users)'
+UninstallDisplayNameMarks=%1 (%2, %3)
+UninstallDisplayNameMark32Bit=32-bit
+UninstallDisplayNameMark64Bit=64-bit
+UninstallDisplayNameMarkAllUsers=Сви корисници
+UninstallDisplayNameMarkCurrentUser=Тренутни корисник
+
 ; *** Post-installation errors
 ErrorOpeningReadme=Дошло је до грешке при отварању текстуалне датотеке.
 ErrorRestartingComputer=Не могу поново да покренем рачунар. Урадите то сами.

+ 42 - 14
Files/Languages/Unofficial/SerbianLatin.isl

@@ -1,9 +1,9 @@
-; *** Inno Setup version 5.5.3+ Serbian (Latin) messages ***
+; *** Inno Setup version 6.0.3+ Serbian (Latin) messages ***
 ;
 ; To download user-contributed translations of this file, go to:
 ;   http://www.jrsoftware.org/files/istrans/
 ;
-; Translated by Rancher ([email protected]).
+; Translated by Rancher ([email protected]) and Davor ([email protected]).
 ;
 ; Note: When translating this text, do not add periods (.) to the end of
 ; messages that didn't have them already, because on those messages Inno
@@ -44,6 +44,7 @@ ErrorTitle=Gre
 SetupLdrStartupMessage=Instaliraćete %1. Želite li da nastavite?
 LdrCannotCreateTemp=Ne mogu da napravim privremenu datoteku. Instalacija je prekinuta.
 LdrCannotExecTemp=Ne mogu da pokrenem datoteku u privremenoj fascikli. Instalacija je prekinuta.
+HelpTextNote=
 
 ; *** Startup error messages
 LastErrorMessage=%1.%n%nGreška %2: %3
@@ -52,12 +53,11 @@ SetupFileCorrupt=Instalacione datoteke su o
 SetupFileCorruptOrWrongVer=Instalacione datoteke su oštećene ili nisu saglasne s ovom verzijom instalacije. Ispravite problem ili nabavite novi primerak programa.
 InvalidParameter=Neispravan parametar je prenet na komandnu liniju: %n%n%1
 SetupAlreadyRunning=Instalacija je već pokrenuta.
-WindowsVersionNotSupported=Program ne podržava izdanje vindousa koje koristite.
+WindowsVersionNotSupported=Program ne podržava izdanje Windows-a koje koristite.
 WindowsServicePackRequired=Program zahteva %1 servisni paket %2 ili noviji.
 NotOnThisPlatform=Program neće raditi na %1.
 OnlyOnThisPlatform=Program će raditi na %1.
-OnlyOnTheseArchitectures=Program se može instalirati samo na izdanjima vindousa koji rade na sledećim arhitekturama procesora:%n%n%1
-MissingWOW64APIs=Izdanje vindousa koje koristite ne sadrži funkcionalnost potrebnu za izvršavanje 64-bitnih instalacija. Instalirajte servisni paket %1 da biste rešili ovaj problem.
+OnlyOnTheseArchitectures=Program se može instalirati samo na izdanjima Windows-a koji rade na sledećim arhitekturama procesora:%n%n%1
 WinVersionTooLowError=Program zahteva %1, izdanje %2 ili novije.
 WinVersionTooHighError=Program ne možete instalirati na %1 izdanju %2 ili novijem.
 AdminPrivilegesRequired=Morate biti prijavljeni kao administrator da biste instalirali program.
@@ -65,6 +65,16 @@ PowerUserPrivilegesRequired=Morate biti prijavljeni kao administrator ili ovla
 SetupAppRunningError=Program %1 je trenutno pokrenut.%n%nZatvorite ga i kliknite na dugme „U redu“ da nastavite ili „Otkaži“ da napustite instalaciju.
 UninstallAppRunningError=Program %1 je trenutno pokrenut.%n%nZatvorite ga i kliknite na dugme „U redu“ da nastavite ili „Otkaži“ da napustite instalaciju.
 
+; *** Startup questions
+PrivilegesRequiredOverrideTitle=Odaberite način instalacije
+PrivilegesRequiredOverrideInstruction=Odaberite način instalacije
+PrivilegesRequiredOverrideText1=%1 može biti instaliran za sve korisnike (zahteva administrativne privilegije) ili samo za vas.
+PrivilegesRequiredOverrideText2=%1 može da se instalira samo za vas ili za sve korisnike (zahteva administrativne privilegije).
+PrivilegesRequiredOverrideAllUsers=Instaliraj za &sve korisnike
+PrivilegesRequiredOverrideAllUsersRecommended=Instaliraj za &sve korisnike (preporučeno)
+PrivilegesRequiredOverrideCurrentUser=Instaliraj samo za &mene
+PrivilegesRequiredOverrideCurrentUserRecommended=Instaliraj samo za &mene (preporučeno)
+
 ; *** Misc. errors
 ErrorCreatingDir=Ne mogu da napravim fasciklu „%1“.
 ErrorTooManyFilesInDir=Ne mogu da napravim datoteku u fascikli „%1“ jer sadrži previše datoteka.
@@ -74,9 +84,9 @@ ExitSetupTitle=Napu
 ExitSetupMessage=Instalacija nije završena. Ako sada izađete, program neće biti instaliran.%n%nInstalaciju možete pokrenuti i dovršiti nekom dugom prilikom.%n%nŽelite li da je zatvorite?
 AboutSetupMenuItem=&O programu
 AboutSetupTitle=Podaci o programu
-AboutSetupMessage=%1 verzija %2%n%3%n%n%1 matična stranica:%n%4
+AboutSetupMessage=%1 verzija %2%n%3%n%n%1 internet stranica:%n%4
 AboutSetupNote=
-TranslatorNote=Serbian translation by Rancher.
+TranslatorNote=
 
 ; *** Buttons
 ButtonBack=< &Nazad
@@ -89,13 +99,13 @@ ButtonYesToAll=D&a za sve
 ButtonNo=&Ne
 ButtonNoToAll=N&e za sve
 ButtonFinish=&Završi
-ButtonBrowse=&Potraži…
-ButtonWizardBrowse=&Potraži…
+ButtonBrowse=&Pretraži…
+ButtonWizardBrowse=&Pretraži…
 ButtonNewFolder=&Napravi fasciklu
 
 ; *** "Select Language" dialog messages
 SelectLanguageTitle=Odabir jezika
-SelectLanguageLabel=Izaberite jezik tokom instalacije:
+SelectLanguageLabel=Izaberite jezik za korišćenje tokom instalacije:
 
 ; *** Common wizard text
 ClickNext=Kliknite na „Dalje“ da nastavite ili „Otkaži“ da napustite instalaciju.
@@ -143,6 +153,7 @@ WizardSelectDir=Odabir odredi
 SelectDirDesc=Izaberite mesto na kom želite da instalirate [name].
 SelectDirLabel3=Program će instalirati [name] u sledeću fasciklu.
 SelectDirBrowseLabel=Kliknite na „Dalje“ da nastavite. Ako želite da izaberete drugu fasciklu, kliknite na „Potraži…“.
+DiskSpaceGBLabel=Potrebno je najmanje [gb] GB slobodnog prostora na disku.
 DiskSpaceMBLabel=Potrebno je najmanje [mb] MB slobodnog prostora na disku.
 CannotInstallToNetworkDrive=Ne mogu da instaliram na mrežnu jedinicu.
 CannotInstallToUNCPath=Ne mogu da instaliram na UNC putanju.
@@ -170,6 +181,7 @@ NoUninstallWarningTitle=Komponente ve
 NoUninstallWarning=Sledeće komponente već postoje na računaru:%n%n%1%n%nDeštrikliranje ovih komponenti ih neće ukloniti.%n%nŽelite li da nastavite?
 ComponentSize1=%1 kB
 ComponentSize2=%1 MB
+ComponentsDiskSpaceGBLabel=Izabrane stavke zahtevaju najmanje [gb] GB slobodnog prostora.
 ComponentsDiskSpaceMBLabel=Izabrane stavke zahtevaju najmanje [mb] MB slobodnog prostora.
 
 ; *** "Select Additional Tasks" wizard page
@@ -210,6 +222,7 @@ ApplicationsFound2=Slede
 CloseApplications=&Zatvori programe
 DontCloseApplications=&Ne zatvaraj programe
 ErrorCloseApplications=Ne mogu da zatvorim sve programe. Pre nego što nastavite, preporučujemo vam da zatvorite sve programe koji koriste datoteke koje treba da ažurira instalacioni program.
+PrepareToInstallNeedsRestart=Instalacija mora da ponovo pokrene računar. Nakon ponovnog pokretanja računara, ponovo pokrenite instalaciju da biste dovršili instalaciju [name].%n%nŽelite li da ponovo pokrenete računar sada?
 
 ; *** "Installing" wizard page
 WizardInstalling=Instaliranje
@@ -239,7 +252,10 @@ SelectDirectoryLabel=Izaberite mesto slede
 
 ; *** Installation phase messages
 SetupAborted=Instalacija nije završena.%n%nIspravite problem i pokrenite je ponovo.
-EntryAbortRetryIgnore=Kliknite na „Pokušaj opet“ da ponovite radnju, „Zanemari“ da nastavite u svakom slučaju ili „Prekini“ da obustavite instalaciju.
+AbortRetryIgnoreSelectAction=Odaberite radnju
+AbortRetryIgnoreRetry=&Pokušaj opet
+AbortRetryIgnoreIgnore=&Zanemari grešku i nastavi
+AbortRetryIgnoreCancel=Prekini instalaciju
 
 ; *** Installation status messages
 StatusClosingApplications=Zatvaram programe…
@@ -270,11 +286,13 @@ ErrorRegWriteKey=Gre
 ErrorIniEntry=Greška pri stvaranju INI unosa u datoteci „%1“.
 
 ; *** File copying errors
-FileAbortRetryIgnore=Kliknite na „Pokušaj opet“ da ponovite radnju, „Zanemari“ da preskočite datoteku (ne preporučuje se) ili „Prekini“ da obustavite instalaciju.
-FileAbortRetryIgnore2=Kliknite na „Pokušaj opet“ da ponovite radnju, „Zanemari“ da nastavite u svakom slučaju (ne preporučuje se) ili „Prekini“ da obustavite instalaciju.
+FileAbortRetryIgnoreSkipNotRecommended=&Preskočite ovu datoteku (ne preporučuje se)
+FileAbortRetryIgnoreIgnoreNotRecommended=&Zanemari grešku i nastavi (ne preporučuje se)
 SourceIsCorrupted=Izvorna datoteka je oštećena
 SourceDoesntExist=Izvorna datoteka „%1“ ne postoji
-ExistingFileReadOnly=Postojeća datoteka je samo za čitanje.%n%nKliknite na „Pokušaj opet“ da uklonite osobinu „samo za čitanje“ i ponovite radnju, „Zanemari“ da preskočite datoteku ili „Prekini“ da obustavite instalaciju.
+ExistingFileReadOnly2=Postojeća datoteka ne može da se zameni jer je samo za čitanje.
+ExistingFileReadOnlyRetry=&Uklonite atribut samo za čitanje i pokušajte ponovo
+ExistingFileReadOnlyKeepExisting=&Zadržite postojeću datoteku
 ErrorReadingExistingDest=Došlo je do greške pri pokušaju čitanja postojeće datoteke:
 FileExists=Datoteka već postoji.%n%nŽelite li da je zamenite?
 ExistingFileNewer=Postojeća datoteka je novija od one koju treba postaviti. Preporučujemo vam da zadržite postojeću datoteku.%n%nŽelite li to da uradite?
@@ -289,6 +307,16 @@ ErrorRegisterServer=Ne mogu da upi
 ErrorRegSvr32Failed=RegSvr32 nije uspeo. Greška %1
 ErrorRegisterTypeLib=Ne mogu da upišem biblioteku tipova: %1
 
+; *** Uninstall display name markings
+; used for example as 'My Program (32-bit)'
+UninstallDisplayNameMark=%1 (%2)
+; used for example as 'My Program (32-bit, All users)'
+UninstallDisplayNameMarks=%1 (%2, %3)
+UninstallDisplayNameMark32Bit=32-bit
+UninstallDisplayNameMark64Bit=64-bit
+UninstallDisplayNameMarkAllUsers=Svi korisnici
+UninstallDisplayNameMarkCurrentUser=Trenutni korisnik
+
 ; *** Post-installation errors
 ErrorOpeningReadme=Došlo je do greške pri otvaranju tekstualne datoteke.
 ErrorRestartingComputer=Ne mogu ponovo da pokrenem računar. Uradite to sami.

BIN
Files/isbunzip.dll


BIN
Files/isbzip.dll


BIN
Files/islzma.dll


BIN
Files/islzma32.exe


BIN
Files/islzma64.exe


BIN
Files/isscint.dll


BIN
Files/isunzlib.dll


BIN
Files/iszlib.dll


+ 2 - 4
ISHelp/Staging/contents.js

@@ -1,15 +1,13 @@
 /*
   Inno Setup
-  Copyright (C) 1997-2010 Jordan Russell
+  Copyright (C) 1997-2020 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
-  $jrsoftware: ishelp/Staging/contents.js,v 1.12 2010/04/26 19:37:55 jr Exp $
-
   JavaScript code used by contents.htm
 */
 
-var searchTabBaseUrl = "http://www.jrsoftware.org/ishelp/";
+var searchTabBaseUrl = "https://jrsoftware.org/ishelp/";
 
 function get_absolute_top(obj)
 {

+ 3 - 5
ISHelp/Staging/topic.js

@@ -1,11 +1,9 @@
 /*
   Inno Setup
-  Copyright (C) 1997-2010 Jordan Russell
+  Copyright (C) 1997-2020 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
-  $jrsoftware: ishelp/Staging/topic.js,v 1.7 2010/04/25 02:48:24 jr Exp $
-
   JavaScript code used by topic_*.htm
 */
 
@@ -76,8 +74,8 @@ function topic_loaded()
 	var matches;
 
 	if (window == window.top &&
-	    window.location.protocol == "http:" &&
-	    window.location.hostname == "www.jrsoftware.org" &&
+	    (window.location.protocol == "http:" || window.location.protocol == "https:") &&
+	    (window.location.hostname == "jrsoftware.org" || window.location.hostname == "www.jrsoftware.org") &&
 	    (matches = window.location.pathname.match(/^(\/.+\/)topic_([a-z0-9_\-]+)\.htm$/)) &&
 	    window.location.hash != "#noredir") {
 

+ 3 - 0
ISHelp/compile.bat

@@ -43,6 +43,9 @@ if not exist Staging\isetup.chm goto failed
 rem  HHC leaves behind a temporary file each time it runs...
 if exist "%TEMP%\~hh*.tmp" del /q "%TEMP%\~hh*.tmp"
 
+copy Staging\isetup.chm ..\Files\ISetup.chm
+if not exist ..\Files\ISetup.chm goto failed
+
 echo Success!
 exit /b 0
 

+ 79 - 57
ISHelp/isetup.xml

@@ -14,7 +14,6 @@
 
 <contents>
   <contentstopic title="What is Inno Setup?" topic="whatisinnosetup" />
-  <contentstopic title="Documentation Conventions" topic="conventions" />
   <contentstopic title="Creating Installations" topic="creatinginstallations" />
   <contentstopic title="Script Format Overview" topic="scriptformatoverview" />
   <contentstopic title="Parameters in Sections" topic="params" />
@@ -57,6 +56,7 @@
     <contentstopic title="Using COM Automation objects" topic="scriptautomation" />
   </contentsheading>
   <contentsheading title="Other Information">
+    <contentstopic title="Support Inno Setup" topic="donate" />
     <contentstopic title="Unicode Inno Setup" topic="unicode" />
     <contentstopic title="Non Administrative Install Mode" topic="admininstallmode" />
     <contentstopic title="64-bit Install Mode" topic="32vs64bitinstalls" />
@@ -73,7 +73,6 @@
     <contentstopic title="Example Scripts" topic="examples" />
     <contentstopic title="Frequently Asked Questions" topic="faq" />
     <contentstopic title="Contributors" topic="credits" />
-    <contentstopic title="Support Inno Setup" topic="donate" />
   </contentsheading>
 </contents>
 
@@ -86,10 +85,10 @@
 <body>
 
 <p>
-<b>Inno Setup version 6.0.3</b><br/>
+<b>Inno Setup version 6.1.0</b><br/>
 <b>Copyright &copy; 1997-2020 Jordan Russell. All rights reserved.</b><br/>
 <b>Portions Copyright &copy; 2000-2020 Martijn Laan. All rights reserved.</b><br/>
-<extlink href="http://www.jrsoftware.org/">Inno Setup home page</extlink>
+<extlink href="https://jrsoftware.org/">Inno Setup home page</extlink>
 </p>
 
 <p><br/>
@@ -139,7 +138,7 @@ Includes integrated support for "deflate", bzip2, and 7-Zip LZMA/LZMA2 file <lin
 
 <li>Full source code is available from <extlink href="https://github.com/jrsoftware/issrc">GitHub</extlink>.</li>
 
-<li>Tiny footprint: only about 1.3 mB overhead with all features included.</li>
+<li>Tiny footprint: only about 1.5 mB overhead with all features included.</li>
 
 <li>All features are fully documented.</li>
 
@@ -159,22 +158,6 @@ Includes integrated support for "deflate", bzip2, and 7-Zip LZMA/LZMA2 file <lin
 
 
 
-<topic name="conventions" title="Documentation Conventions">
-<keyword value="Documentation Conventions" />
-<body>
-
-<table>
-<tr>
-  <td><tt>monospaced text</tt></td>
-  <td><p>When you see monospaced text in the documentation, it refers to text you would type in a <link topic="creatinginstallations">script</link> file.</p></td>
-</tr>
-</table>
-
-</body>
-</topic>
-
-
-
 <topic name="creatinginstallations" title="Creating Installations">
 <keyword value="Creating Installations" />
 <body>
@@ -320,6 +303,7 @@ This " contains " embedded " quotes
 <keyword value="{autocf64}" anchor="autocf64" />
 <keyword value="{autodesktop}" anchor="autodesktop" />
 <keyword value="{autodocs}" anchor="autodocs" />
+<keyword value="{autofonts}" anchor="autofonts" />
 <keyword value="{autopf}" anchor="autopf" />
 <keyword value="{autopf32}" anchor="autopf32" />
 <keyword value="{autopf64}" anchor="autopf64" />
@@ -348,9 +332,11 @@ This " contains " embedded " quotes
 <keyword value="{dotnet2032}" anchor="dotnet2032" />
 <keyword value="{dotnet2064}" anchor="dotnet2064" />
 <keyword value="{dotnet40}" anchor="dotnet40" />
+<keyword value=".NET install root" anchor="dotnet40" />
 <keyword value="{dotnet4032}" anchor="dotnet4032" />
 <keyword value="{dotnet4064}" anchor="dotnet4064" />
 <keyword value="{drive:...}" anchor="drive" />
+<keyword value="{commonfonts}" anchor="commonfonts" />
 <keyword value="{fonts}" anchor="fonts" />
 <keyword value="{group}" anchor="group" />
 <keyword value="{groupname}" anchor="groupname" />
@@ -382,6 +368,7 @@ This " contains " embedded " quotes
 <keyword value="{userdesktop}" anchor="userdesktop" />
 <keyword value="{userdocs}" anchor="userdocs" />
 <keyword value="{userfavorites}" anchor="userfavorites" />
+<keyword value="{userfonts}" anchor="userfonts" />
 <keyword value="{userinfoname}" anchor="userinfoname" />
 <keyword value="{userinfoorg}" anchor="userinfoorg" />
 <keyword value="{userinfoserial}" anchor="userinfoserial" />
@@ -486,9 +473,9 @@ For example: If you used <tt>{src}\MYPROG.EXE</tt> on an entry and the user is i
 <p>Temporary directory used by Setup or Uninstall. This is <i>not</i> the value of the user's TEMP environment variable. It is a subdirectory of the user's temporary directory which is created by Setup or Uninstall at startup (with a name like "C:\WINDOWS\TEMP\IS-xxxxx.tmp"). All files and subdirectories in this directory are deleted when Setup or Uninstall exits. During Setup, this is primarily useful for extracting files that are to be executed in the [Run] section but aren't needed after the installation.</p>
 </dd>
 
-<dt><b><a name="fonts">{fonts}</a></b></dt>
+<dt><b><a name="commonfonts">{commonfonts}</a></b></dt>
 <dd>
-<p>Fonts directory. Normally named "FONTS" under the Windows directory.</p>
+<p>Fonts directory. Normally named "Fonts" under the Windows directory.</p>
 </dd>
 
 <dt><b><a name="dao">{dao}</a></b></dt>
@@ -498,43 +485,44 @@ For example: If you used <tt>{src}\MYPROG.EXE</tt> on an entry and the user is i
 
 <dt><b><a name="dotnet11">{dotnet11}</a></b></dt>
 <dd>
-<p>32-bit .NET Framework version 1.1 root directory.</p>
+<p>32-bit .NET Framework version 1.1 install root directory.</p>
 <p>An exception will be raised if an attempt is made to expand this constant on a system with no .NET Framework version 1.1 present.</p>
 </dd>
 
 <dt><b><a name="dotnet20">{dotnet20}</a></b></dt>
 <dd>
-<p>.NET Framework version 2.0-3.5 root directory. <tt>{dotnet20}</tt> is equivalent to <tt>{dotnet2032}</tt> unless the install is running in <link topic="32vs64bitinstalls">64-bit install mode</link>, in which case it is equivalent to <tt>{dotnet2064}</tt>.</p>
+<p>.NET Framework version 2.0-3.5 install root directory. <tt>{dotnet20}</tt> is equivalent to <tt>{dotnet2032}</tt> unless the install is running in <link topic="32vs64bitinstalls">64-bit install mode</link>, in which case it is equivalent to <tt>{dotnet2064}</tt>.</p>
 <p>An exception will be raised if an attempt is made to expand this constant on a system with no .NET Framework version 2.0-3.5 present.</p>
 </dd>
 
 <dt><b><a name="dotnet2032">{dotnet2032}</a></b></dt>
 <dd>
-<p>32-bit .NET Framework version 2.0-3.5 root directory.</p>
+<p>32-bit .NET Framework version 2.0-3.5 install root directory.</p>
 <p>An exception will be raised if an attempt is made to expand this constant on a system with no .NET Framework version 2.0-3.5 present.</p>
 </dd>
 
 <dt><b><a name="dotnet2064">{dotnet2064}</a></b></dt>
 <dd>
-<p>64-bit Windows only: 64-bit .NET Framework version 2.0-3.5 root directory.</p>
+<p>64-bit Windows only: 64-bit .NET Framework version 2.0-3.5 install root directory.</p>
 <p>An exception will be raised if an attempt is made to expand this constant on a system with no .NET Framework version 2.0-3.5 present.</p>
 </dd>
 
 <dt><b><a name="dotnet40">{dotnet40}</a></b></dt>
 <dd>
-<p>.NET Framework version 4.0 and later root directory. <tt>{dotnet40}</tt> is equivalent to <tt>{dotnet4032}</tt> unless the install is running in <link topic="32vs64bitinstalls">64-bit install mode</link>, in which case it is equivalent to <tt>{dotnet4064}</tt>.</p>
+<p>.NET Framework version 4.0 and later install root directory. <tt>{dotnet40}</tt> is equivalent to <tt>{dotnet4032}</tt> unless the install is running in <link topic="32vs64bitinstalls">64-bit install mode</link>, in which case it is equivalent to <tt>{dotnet4064}</tt>.</p>
 <p>An exception will be raised if an attempt is made to expand this constant on a system with no .NET Framework version 4.0 or later present.</p>
+<p>Also see <link topic="isxfunc_IsDotNetInstalled">IsDotNetInstalled</link>.</p>
 </dd>
 
 <dt><b><a name="dotnet4032">{dotnet4032}</a></b></dt>
 <dd>
-<p>32-bit .NET Framework version 4.0 and later root directory.</p>
+<p>32-bit .NET Framework version 4.0 and later install root directory.</p>
 <p>An exception will be raised if an attempt is made to expand this constant on a system with no .NET Framework version 4.0 or later present.</p>
 </dd>
 
 <dt><b><a name="dotnet4064">{dotnet4064}</a></b></dt>
 <dd>
-<p>64-bit Windows only: 64-bit .NET Framework version 4.0 and later root directory.</p>
+<p>64-bit Windows only: 64-bit .NET Framework version 4.0 and later install root directory.</p>
 <p>An exception will be raised if an attempt is made to expand this constant on a system with no .NET Framework version 4.0 or later present.</p>
 </dd>
 
@@ -587,6 +575,11 @@ For example: If you used <tt>{src}\MYPROG.EXE</tt> on an entry and the user is i
 <p>The path to the current user's Favorites folder. (There is no common Favorites folder.)</p>
 </dd>
 
+<dt><b><a name="userfonts">{userfonts}</a></b></dt>
+<dd>
+<p>The path to the current user's Fonts folder. Only Windows 10 Version 1803 and later supports <tt>{userfonts}</tt>. Same directory as <tt>{localappdata}\Microsoft\Windows\Fonts</tt>.</p>
+</dd>
+
 <dt><b><a name="userpf">{userpf}</a></b></dt>
 <dd>
 <p>The path to the current user's Program Files directory. Only Windows 7 and later supports <tt>{userpf}</tt>; if used on previous Windows versions, it will translate to the same directory as <tt>{localappdata}\Programs</tt>.</p>
@@ -638,6 +631,7 @@ For example: If you used <tt>{src}\MYPROG.EXE</tt> on an entry and the user is i
 <tr><td><tt><a name="autocf64">autocf64</a></tt></td><td><tt>commoncf64</tt></td><td><tt>usercf</tt></td></tr>
 <tr><td><tt><a name="autodesktop">autodesktop</a></tt></td><td><tt>commondesktop</tt></td><td><tt>userdesktop</tt></td></tr>
 <tr><td><tt><a name="autodocs">autodocs</a></tt></td><td><tt>commondocs</tt></td><td><tt>userdocs</tt></td></tr>
+<tr><td><tt><a name="autofonts">autofonts</a></tt></td><td><tt>commonfonts</tt></td><td><tt>userfonts</tt></td></tr>
 <tr><td><tt><a name="autopf">autopf</a></tt></td><td><tt>commonpf</tt></td><td><tt>userpf</tt></td></tr>
 <tr><td><tt><a name="autopf32">autopf32</a></tt></td><td><tt>commonpf32</tt></td><td><tt>userpf</tt></td></tr>
 <tr><td><tt><a name="autopf64">autopf64</a></tt></td><td><tt>commonpf64</tt></td><td><tt>userpf</tt></td></tr>
@@ -658,6 +652,7 @@ For example: If you used <tt>{src}\MYPROG.EXE</tt> on an entry and the user is i
 <tr><td><tt><a name="cf">cf</a></tt></td><td><tt>commoncf</tt></td></tr>
 <tr><td><tt><a name="cf32">cf32</a></tt></td><td><tt>commoncf32</tt></td></tr>
 <tr><td><tt><a name="cf64">cf64</a></tt></td><td><tt>commoncf64</tt></td></tr>
+<tr><td><tt><a name="fonts">fonts</a></tt></td><td><tt>commonfonts</tt></td></tr>
 <tr><td><tt><a name="pf">pf</a></tt></td><td><tt>commonpf</tt></td></tr>
 <tr><td><tt><a name="pf32">pf32</a></tt></td><td><tt>commonpf32</tt></td></tr>
 <tr><td><tt><a name="pf64">pf64</a></tt></td><td><tt>commonpf64</tt></td></tr>
@@ -980,6 +975,7 @@ DefaultGroupName=My Program
 <li><link topic="setup_lzmanumfastbytes">LZMANumFastBytes</link></li>
 <li><link topic="setup_lzmauseseparateprocess">LZMAUseSeparateProcess</link></li>
 <li><link topic="setup_mergeduplicatefiles">MergeDuplicateFiles</link></li>
+<li><link topic="setup_missingrunonceidswarning">MissingRunOnceIdsWarning</link></li>
 <li><link topic="setup_output">Output</link></li>
 <li><link topic="setup_outputbasefilename">OutputBaseFilename</link></li>
 <li><link topic="setup_outputdir">OutputDir</link></li>
@@ -1622,11 +1618,11 @@ ExternalSize: 1048576; Flags: external
 <param name="FontInstall">
 <p>Tells Setup the file is a font that needs to be installed. The value of this parameter is the name of the font as stored in the registry or WIN.INI. This must be exactly the same name as you see when you double-click the font file in Explorer. Note that Setup will automatically append " (TrueType)" to the end of the name.</p>
 <p>If the file is not a TrueType font, you must specify the flag <tt>fontisnttruetype</tt> in the Flags parameter.</p>
-<p>It's recommended that you use the flags <tt>onlyifdoesntexist</tt> and <tt>uninsneveruninstall</tt> when installing fonts to the {fonts} directory.</p>
-<p>To successfully install a font, the user must be a member of the Administrators groups.</p>
-<p>For compatibility with 64-bit Windows, fonts should not be installed to the <tt>{sys}</tt> directory. Use <tt>{fonts}</tt> as the destination directory instead.</p>
+<p>It's recommended that you use the flags <tt>onlyifdoesntexist</tt> and <tt>uninsneveruninstall</tt> when installing fonts to the <tt>{autofonts}</tt> directory.</p>
+<p>If the installation is running in <link topic="admininstallmode">non administrative install mode</link>, Windows 10 Version 1803 or later is required to successfully install a font.</p>
+<p>For compatibility with 64-bit Windows, fonts should not be installed to the <tt>{sys}</tt> directory. Use <tt>{autofonts}</tt> as the destination directory instead.</p>
 <example>
-<pre>Source: "OZHANDIN.TTF"; DestDir: "{fonts}"; FontInstall: "Oz Handicraft BT"; Flags: onlyifdoesntexist uninsneveruninstall</pre>
+<pre>Source: "OZHANDIN.TTF"; DestDir: "{autofonts}"; FontInstall: "Oz Handicraft BT"; Flags: onlyifdoesntexist uninsneveruninstall</pre>
 </example>
 </param>
 
@@ -1926,6 +1922,13 @@ Filename: "http://www.example.com/"
 </example>
 </param>
 
+<param name="AppUserModelToastActivatorCLSID">
+<p>Specifies the Windows 10 (or later) Application User Model Toast Activator CLSID for the shortcut. Ignored on earlier Windows versions.</p>
+<example>
+<pre>AppUserModelToastActivatorCLSID: "B784B1A4-D682-4FE6-BDBA-21EDDAE42795"</pre>
+</example>
+</param>
+
 <param name="Flags">
 <p>This parameter is a set of extra options. Multiple options may be used by separating them by spaces. The following options are supported:</p>
 
@@ -2575,7 +2578,7 @@ Filename: "{app}\MYPROG.EXE"; Description: "Launch application"; Flags: postinst
 </param>
 
 <param name="RunOnceId">
-<p>Valid only in an <tt>[UninstallRun]</tt> section. If the <link topic="sameappnotes">same application</link> is installed more than once, "run" entries will be duplicated in the uninstall log file. By assigning a string to <tt>RunOnceId</tt>, you can ensure that a particular <tt>[UninstallRun]</tt> entry will only be executed once during uninstallation. For example, if two or more "run" entries in the uninstall log have a <tt>RunOnceId</tt> setting of "DelService", only the latest entry with a <tt>RunOnceId</tt> setting of "DelService" will be executed; the rest will be ignored. Note that <tt>RunOnceId</tt> comparisons are case-sensitive.</p>
+<p>Valid only in an <tt>[UninstallRun]</tt> section. If the <link topic="sameappnotes">same application</link> is installed more than once, "run" entries will be duplicated in the uninstall log file. By assigning a string to <tt>RunOnceId</tt>, you can ensure that a particular <tt>[UninstallRun]</tt> entry will only be executed once during uninstallation. For example, if two or more "run" entries in the uninstall log have a <tt>RunOnceId</tt> setting of "DelService", only the latest entry with a <tt>RunOnceId</tt> setting of "DelService" will be executed; the rest will be ignored. Note that <tt>RunOnceId</tt> comparisons are case-sensitive. If you don't assign a string to <tt>RunOnceId</tt>, the compiler will warn you about this, which can be disabled using <link topic="setup_missingrunonceidswarning">MissingRunOnceIdsWarning</link>.</p>
 <example>
 <pre>RunOnceId: "DelService"</pre>
 </example>
@@ -2601,6 +2604,9 @@ Filename: "{app}\MYPROG.EXE"; Description: "Launch application"; Flags: postinst
 <p>This flag can only be used when Setup is running on 64-bit Windows, otherwise an error will occur. On an installation supporting both 32- and 64-bit architectures, it is possible to avoid the error by adding a <tt>Check: IsWin64</tt> parameter, which will cause the entry to be silently skipped when running on 32-bit Windows.</p>
 <p>This flag cannot be combined with the <tt>shellexec</tt> flag.</p>
 </flag>
+<flag name="dontlogparameters">
+<p>If this flag is specified, the command line parameters for the program will not be included in the log file.</p>
+</flag>
 <flag name="hidewizard">
 <p>If this flag is specified, the wizard will be hidden while the program is running.</p>
 </flag>
@@ -2746,7 +2752,7 @@ Type: files; Name: "{win}\MYPROG.INI"
 <body>
 
 <p>Prior to Inno Setup 6 two versions of Inno Setup were available: Non Unicode Inno Setup and Unicode Inno Setup. Starting with Inno Setup 6 there's only one version available: Unicode Inno Setup.</p>
-<p>Key features of Unicode Inno Setup are its ability to display any language on any system regardless of the system code page, and its ability to work with Unicode filenames. One could consider Unicode Inno Setup as the new standard Inno Setup and Non Unicode Inno Setup as an old special Inno Setup for those who want the very smallest size possible.</p>
+<p>Key features of Unicode Inno Setup are its ability to display any language on any system regardless of the system code page, and its ability to work with Unicode filenames.</p>
 <p>If you don't remember which version you installed, click the "Inno Setup Compiler" shortcut created in the Start Menu. If the version number displayed in its title bar says "(a)" you are running Non Unicode Inno Setup. If it says "(u)" you are running Unicode Inno Setup.</p>
 <p>For the most part the two versions are used identically, and any differences between them are noted throughout the help file. However, the following overview lists the primary differences:</p>
   <ul>
@@ -2786,7 +2792,7 @@ Type: files; Name: "{win}\MYPROG.INI"
 
 <p>The Frequently Asked Questions is now located in a separate document. Please click the "Inno Setup FAQ" shortcut created in the Start Menu when you installed Inno Setup, or open the "isfaq.url" file in your Inno Setup directory.</p>
 
-<p>For the most recent Frequently Asked Questions, go to <extlink href="http://www.jrsoftware.org/isfaq.php">http://www.jrsoftware.org/isfaq.php</extlink></p>
+<p>For the most recent Frequently Asked Questions, go to <extlink href="https://jrsoftware.org/isfaq.php">https://jrsoftware.org/isfaq.php</extlink></p>
 
 </body>
 </topic>
@@ -2957,14 +2963,14 @@ Filename: "{win}\MYPROG.INI"; Section: "InstallSettings"; Key: "InstallPath"; St
 <ul>
 <li>The <tt>{group}</tt> folder is created in the <i>All Users</i> profile.</li>
 <li>The "auto" form of the directory and Shell Folder constants is mapped to the "common" form.</li>
-<li>The <link topic="registrysection">HKA</link> and uninstall info root keys will be HKEY_LOCAL_MACHINE.</li>
+<li>The <link topic="registrysection">HKA</link>, uninstall info, and font install root keys will be HKEY_LOCAL_MACHINE.</li>
 </ul>
 
 <p>In non administrative install mode:</p>
 <ul>
 <li>The <tt>{group}</tt> folder is created in the current user's profile.</li>
 <li>The "auto" form of the directory and Shell Folder constants is mapped to the "user" form.</li>
-<li>The <link topic="registrysection">HKA</link> and uninstall info root keys will be HKEY_CURRENT_USER.</li>
+<li>The <link topic="registrysection">HKA</link>, uninstall info, and font install root keys will be HKEY_CURRENT_USER.</li>
 </ul>
 
 <p><b>Notes:</b></p>
@@ -3077,7 +3083,7 @@ Filename: "{win}\MYPROG.INI"; Section: "InstallSettings"; Key: "InstallPath"; St
 
 <li>Inno Setup's own installers accept an additional /PORTABLE=1 command line parameter to enable portable mode which causes the installers to not create an uninstaller nor an entry in the Add/Remove Programs Control Panel applet.</li>
 
-<li>The Inno Setup backup website can be found at <extlink href="http://www.innosetup.nl/">www.innosetup.nl</extlink>. Normally this link will simply redirect you to the main website at <extlink href="http://www.jrsoftware.org/">www.jrsoftware.org</extlink> but in case of emergencies this redirect will be disabled.</li>
+<li>The Inno Setup backup website can be found at <extlink href="http://www.innosetup.nl/">www.innosetup.nl</extlink>. Normally this link will simply redirect you to the main website at <extlink href="https://jrsoftware.org/">jrsoftware.org</extlink> but in case of emergencies this redirect will be disabled.</li>
 
 </ul>
 
@@ -3162,6 +3168,7 @@ Filename: "{win}\MYPROG.INI"; Section: "InstallSettings"; Key: "InstallPath"; St
 <keyword value="/NOCLOSEAPPLICATIONS" anchor="NOCLOSEAPPLICATIONS" />
 <keyword value="/FORCECLOSEAPPLICATIONS" anchor="FORCECLOSEAPPLICATIONS" />
 <keyword value="/NOFORCECLOSEAPPLICATIONS" anchor="NOFORCECLOSEAPPLICATIONS" />
+<keyword value="/LOGCLOSEAPPLICATIONS" anchor="LOGCLOSEAPPLICATIONS" />
 <keyword value="/RESTARTAPPLICATIONS" anchor="RESTARTAPPLICATIONS" />
 <keyword value="/NORESTARTAPPLICATIONS" anchor="NORESTARTAPPLICATIONS" />
 <keyword value="/LOADINF=" anchor="LOADINF" />
@@ -3286,9 +3293,14 @@ Filename: "{win}\MYPROG.INI"; Section: "InstallSettings"; Key: "InstallPath"; St
 <p>Prevents Setup from force closing when closing applications. If /FORCECLOSEAPPLICATIONS was also used, this command line parameter is ignored.</p>
 </dd>
 
+<dt><b><a name="LOGCLOSEAPPLICATIONS">/LOGCLOSEAPPLICATIONS</a></b></dt>
+<dd>
+<p>Instructs Setup to create extra logging when closing applications for debugging purposes.</p>
+</dd>
+
 <dt><b><a name="RESTARTAPPLICATIONS">/RESTARTAPPLICATIONS</a></b></dt>
 <dd>
-<p>Instructs Setup to restart applications if possible. Only has an effect when combined with '/CLOSEAPPLICATIONS'.</p>
+<p>Instructs Setup to restart applications if possible.</p>
 </dd>
 
 <dt><b><a name="NORESTARTAPPLICATIONS">/NORESTARTAPPLICATIONS</a></b></dt>
@@ -3618,7 +3630,7 @@ Keep the default set of selected tasks, but deselect the "desktopicon" task:<br/
 
 <li>Martijn Laan: Rich Edit 2.0 &amp; URL detection support (1.3.13); Silent uninstallation (1.3.25); System image list support in drive and directory lists (1.3.25); Silent installation (2.0); The <tt>[Types]</tt>, <tt>[Components]</tt> and <tt>[Tasks]</tt> sections (2.0); The <tt>postinstall</tt> flag (2.0); The <tt>[Code]</tt> section (4.0); Subcomponents and subtasks support (4.0); Many other features after 4.0.</li>
 
-<li>Alex Yackimoff: Portions of <link topic="scriptclasses" anchor="TNewCheckListBox">TNewCheckListBox</link> (4.0).</li>
+<li>Alex Yackimoff: Portions of <link topic="scriptclasses" anchor="TNewCheckListBox">TNewCheckListBox</link> (4.0); ISPP (5.4.1).</li>
 
 <li>Carlo Kok: <extlink href="http://www.remobjects.com/ps">RemObjects Pascal Script</extlink> (4.0).</li>
 
@@ -3628,16 +3640,22 @@ Keep the default set of selected tasks, but deselect the "desktopicon" task:<br/
 
 <li>Creators of <extlink href="http://www.scintilla.org/">Scintilla</extlink>: The syntax-highlighting editor used in the Compiler (5.4).</li>
 
-<li>Motaz Alnuweiri: 128x128 and 256x256 sizes of the compiler and document icons.</li>
+<li>Zaher Dirkey: Initial work on improved right-to-left languages support (5.2.3).</li>
 
-<li>Zaher Dirkey: Initial work on improved right-to-left languages support.</li>
+<li>Evgeny Karpov of RemObjects Software: Initial work on Unicode support (5.3).</li>
 
-<li>Evgeny Karpov of RemObjects Software: Initial work on Unicode support.</li>
+<li>Motaz Alnuweiri: 128x128 and 256x256 sizes of the compiler and document icons (5.5.3).</li>
 
-<li>DRON: Code for the improved image stretching (5.6.0).</li>
+<li>DRON: Code for the improved image stretching (5.6).</li>
 
 <li>Sherlock Software: Most of the code for the <tt>CreateCallback</tt> support function (6.0).</li>
 
+<li>Vizit0r: Code for the "Debug Call Stack" view (6.0.3).</li>
+
+<li>Cristoph Nahr: Code for the .NET version detection (6.0.4).</li>
+
+<li>Sergii Leonov: Code for the Compiler IDE's MessageBox Designer (6.1.0).</li>
+
 </ul>
 
 </body>
@@ -3650,7 +3668,8 @@ Keep the default set of selected tasks, but deselect the "desktopicon" task:<br/
 <body>
 
 <p>To support Inno Setup, go to this page:<br/>
-<extlink href="http://www.jrsoftware.org/isdonate.php">http://www.jrsoftware.org/isdonate.php</extlink></p>
+<extlink href="https://jrsoftware.org/isdonate.php">https://jrsoftware.org/isdonate.php</extlink></p>
+<p>Thank you in advance for your support!</p>
 
 </body>
 </topic>
@@ -3779,7 +3798,7 @@ CreateMutex 0&amp;, 0&amp;, "MyProgramsMutexName"
 <p>Note that mutex name comparison in Windows is <i>case sensitive.</i></p>
 <p>To specify a mutex name containing a comma, escape the comma with a backslash.</p>
 <p>See the topic for CreateMutex in the MS SDK help for more information on mutexes.</p>
-<example><pre>AppMutex=MyProgramsMutexName</pre></example>
+<example><pre>AppMutex=MyProgramsMutexName,Global\MyProgramsMutexName</pre></example>
 <p><b>See also:</b><br/>
 <link topic="setup_setupmutex">SetupMutex</link><br/>
 <link topic="setup_closeapplications">CloseApplications</link></p>
@@ -3951,6 +3970,14 @@ Name: portablemode; Description: "Portable Mode"</pre></example>
 </body>
 </setuptopic>
 
+<setuptopic directive="MissingRunOnceIdsWarning">
+<setupvalid><link topic="yesnonotes"><tt>yes</tt> or <tt>no</tt></link></setupvalid>
+<setupdefault><tt>yes</tt></setupdefault>
+<body>
+<p>This directive lets you disable the missing RunOnceIds warning. See <link topic="runsection" anchor="RunOnceId">RunOnceId</link> for more information.</p>
+</body>
+</setuptopic>
+
 <setuptopic directive="UsedUserAreasWarning">
 <setupvalid><link topic="yesnonotes"><tt>yes</tt> or <tt>no</tt></link></setupvalid>
 <setupdefault><tt>yes</tt></setupdefault>
@@ -4914,7 +4941,6 @@ DiskSliceSize=1457664
 <setupdefault><link topic="setup_apppublisher">AppPublisher</link> if <link topic="setup_apppublisher">AppPublisher</link> doesn't include constants, an empty string otherwise</setupdefault>
 <body>
 <p>Specifies the company name value for the Setup version info.</p>
-<p>This setting has no effect if <tt>UseSetupLdr</tt> is set to <tt>no</tt>.</p>
 </body>
 </setuptopic>
 
@@ -4922,7 +4948,6 @@ DiskSliceSize=1457664
 <setupdefault><link topic="setup_appcopyright">AppCopyright</link> if <link topic="setup_appcopyright">AppCopyright</link> doesn't include constants, an empty string otherwise</setupdefault>
 <body>
 <p>Specifies the copyright value for the Setup version info.</p>
-<p>This setting has no effect if <tt>UseSetupLdr</tt> is set to <tt>no</tt>.</p>
 </body>
 </setuptopic>
 
@@ -4937,7 +4962,6 @@ DiskSliceSize=1457664
 <setuptopic directive="VersionInfoOriginalFileName">
 <body>
 <p>Specifies the original file name value for the Setup version info.</p>
-<p>This setting has no effect if <tt>UseSetupLdr</tt> is set to <tt>no</tt>.</p>
 </body>
 </setuptopic>
 
@@ -4945,7 +4969,6 @@ DiskSliceSize=1457664
 <setupdefault><link topic="setup_appname">AppName</link> if <link topic="setup_appname">AppName</link> doesn't include constants, an empty string otherwise</setupdefault>
 <body>
 <p>Specifies the product name value for the Setup version info.</p>
-<p>This setting has no effect if <tt>UseSetupLdr</tt> is set to <tt>no</tt>.</p>
 </body>
 </setuptopic>
 
@@ -4953,7 +4976,6 @@ DiskSliceSize=1457664
 <setupdefault><link topic="setup_versioninfoproductversion">VersionInfoProductVersion</link> if set, else <link topic="setup_appversion">AppVersion</link> if set and does not include constants, else <link topic="setup_versioninfotextversion">VersionInfoTextVersion</link></setupdefault>
 <body>
 <p>Specifies the textual product version value for the Setup version info.</p>
-<p>This setting has no effect if <tt>UseSetupLdr</tt> is set to <tt>no</tt>.</p>
 </body>
 </setuptopic>
 
@@ -4964,7 +4986,6 @@ DiskSliceSize=1457664
 <p>Specifies the binary product version value for the Setup version info.</p>
 <p>Partial version numbers are allowed. Missing numbers will be appended as zero's.</p>
 <p>Note that this value is only known to be displayed by Explorer on Windows Vista SP2. Other versions display the textual product version value (<link topic="setup_versioninfoproducttextversion">VersionInfoProductTextVersion</link>) instead.</p>
-<p>This setting has no effect if <tt>UseSetupLdr</tt> is set to <tt>no</tt>.</p>
 </body>
 </setuptopic>
 
@@ -5036,7 +5057,7 @@ DiskSliceSize=1457664
 <setupdefault><tt>no</tt></setupdefault>
 <body>
 <p>If set to <tt>yes</tt>, files that are compiled into the installation (via [Files] section entries) will be encrypted using ARCFOUR encryption, with a 160-bit key derived from the value of the <link topic="setup_password">Password</link> [Setup] section directive.</p>
-<p>Because of encryption import/export laws in some countries, encryption support is not included in the main Inno Setup installer and must be downloaded and installed separately if you wish to use it. See the <extlink href="http://www.jrsoftware.org/isdl.php">Inno Setup Downloads</extlink> page for more information.</p>
+<p>Because of encryption import/export laws in some countries, encryption support is not included in the main Inno Setup installer and must be downloaded and installed separately if you wish to use it. See the <extlink href="https://jrsoftware.org/isdl.php">Inno Setup Downloads</extlink> page for more information.</p>
 <p>If encryption is enabled and you call the <link topic="isxfunc_ExtractTemporaryFile">ExtractTemporaryFile</link> function from the [Code] section prior to the user entering the correct password, the function will fail unless the <tt>noencryption</tt> flag is used on the [Files] section entry for the file.</p>
 <p>The key used for encryption is a 160-bit SHA-1 hash of 64-bit random salt plus the value of <link topic="setup_password">Password</link>.</p>
 </body>
@@ -5144,7 +5165,7 @@ DiskSliceSize=1457664
 <body>
 <p>Specifies whether the uninstaller program (unins???.exe) should be deployed with a digital signature attached. When the uninstaller has a valid digital signature, users will not see an "unknown publisher" warning when launching it.</p>
 <p>The first time you compile a script with this directive set to <tt>yes</tt>, a uniquely-named copy of the uninstaller EXE file will be created in the directory specified by the <link topic="setup_signeduninstallerdir">SignedUninstallerDir</link> directive (which defaults to the <link topic="setup_outputdir">output directory</link>). Depending on the <link topic="setup_signtool">SignTool</link> setting, you will either then be prompted to attach a digital signature to this file using an external code-signing tool (such as Microsoft's signtool.exe) or the file will be automatically signed on the fly. On subsequent compiles, the signature from the file will be embedded into the compiled installations' uninstallers.</p>
-<p>Upgrading to a newer version of Inno Setup, or changing certain [Setup] section directives that affect the contents of the uninstaller EXE file (such as <link topic="setup_setupiconfile">SetupIconFile</link>), will cause a new file to be created under a different name.</p>
+<p>Upgrading to a newer version of Inno Setup, or changing certain [Setup] section directives that affect the contents of the uninstaller EXE file (such as <link topic="setup_setupiconfile">SetupIconFile</link> and VersionInfo directives), will cause a new file to be created under a different name.</p>
 <p>If a file generated by this directive is deleted, it will be recreated automatically if necessary on the next compile.</p>
 <p>When the uninstaller has a digital signature, Setup will write the messages from the active language into a separate file (unins???.msg). It cannot embed the messages into the EXE file because doing so would invalidate the digital signature.</p>
 <p>When set to <tt>yes</tt>, any temporary self-copies used by Setup are digitally signed too.</p>
@@ -5368,7 +5389,7 @@ SignTool=byparam format c:
 <setupvalid>A list of file name wildcards, separated by commas</setupvalid>
 <setupdefault><tt>*.exe,*.dll,*.chm</tt></setupdefault>
 <body>
-<p>Controls which files Setup will check for being in use.</p>
+<p>Limits which [Files] and [InstallDelete] entries Setup will check for being in use. Only files matching one of the wildcards will be checked.</p>
 <p>Setting this to <tt>*.*</tt> can provide better checking at the expense of speed.</p>
 <p><b>See also:</b><br/>
 <link topic="setup_closeapplications">CloseApplications</link><br/>
@@ -5483,6 +5504,7 @@ SignTool=byparam format c:
 <tr><td>10.0.17763</td><td>Windows 10 Version 1809 (October 2018 Update)<br/>or Windows Server 2019</td></tr>
 <tr><td>10.0.18362</td><td>Windows 10 Version 1903 (May 2019 Update)</td></tr>
 <tr><td>10.0.18363</td><td>Windows 10 Version 1909 (November 2019 Update)</td></tr>
+<tr><td>10.0.19041</td><td>Windows 10 Version 2004 (May 2020 Update)</td></tr>
 </table>
 <p>Note that there is normally no need to specify the build numbers (i.e., you may simply use "6.2" for Windows 8).</p>
 </body>

+ 1 - 1
ISHelp/isxclasses.header2

@@ -10,4 +10,4 @@
 
 <p>One special constant is available: <tt>crHand</tt> of type <tt>TControl.Cursor</tt>.</p>
 
-<p>Note: you may find it useful to also refer to the Delphi Visual Component Library (VCL) Help files by Embarcadero Technologies, since the classes below are mostly simple wrappers around the VCL classes Inno Setup uses internally. See <extlink href="http://docs.embarcadero.com/products/rad_studio/">http://docs.embarcadero.com/products/rad_studio/</extlink>.</p>
+<p>Note: you may find it useful to also refer to the Delphi Visual Component Library (VCL) Help files by Embarcadero Technologies, since the classes below are mostly simple wrappers around the VCL classes Inno Setup uses internally. See <extlink href="https://docwiki.embarcadero.com/RADStudio/Rio/en/VCL">http://docwiki.embarcadero.com/RADStudio/Rio/en/VCL</extlink>.</p>

+ 11 - 2
ISHelp/isxclasses.pas

@@ -150,9 +150,12 @@ TGraphic = class(TPersistent)
   property OnChange: TNotifyEvent; read write;
 end;
 
+TAlphaFormat = (afIgnored, afDefined, afPremultiplied);
+
 TBitmap = class(TGraphic)
   procedure LoadFromStream(Stream: TStream);
   procedure SaveToStream(Stream: TStream);
+  property AlphaFormat: TAlphaFormat; read write;
   property Canvas: TCanvas; read write;
   property Handle: HBITMAP; read write;
 end;
@@ -624,8 +627,6 @@ TStartMenuFolderTreeView = class(TCustomFolderTreeView)
   property OnRename: TFolderRenameEvent; read write;
 end;
 
-TAlphaFormat = (afIgnored, afDefined, afPremultiplied);
-
 TBitmapImage = class(TGraphicControl)
   property Anchors: TAnchors; read write;
   property AutoSize: Boolean; read write;
@@ -728,10 +729,18 @@ TOutputProgressWizardPage = class(TWizardPage)
   procedure Show;
 end;
 
+TDownloadWizardPage = class(TOutputProgressWizardPage)
+  property AbortButton: TNewButton; read;
+  procedure Add(const Url, BaseName, RequiredSHA256OfFile: String);
+  procedure Clear;
+  function Download: Int64;
+end;
+
 TUIStateForm = class(TForm)
 end;
 
 TSetupForm = class(TUIStateForm)
+  function CalculateButtonWidth(const ButtonCaptions: array of String): Integer;
   function ShouldSizeX: Boolean;
   function ShouldSizeY: Boolean;
   procedure FlipSizeAndCenterIfNeeded(const ACenterInsideControl: Boolean; const CenterInsideControlCtl: TWinControl; const CenterInsideControlInsideClientArea: Boolean);

+ 282 - 100
ISHelp/isxfunc.xml

@@ -2,7 +2,7 @@
 <isxhelp version="1.0">
 <copyright>
   Inno Setup
-  Copyright (C) 1997-2012 Jordan Russell
+  Copyright (C) 1997-2020 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 </copyright>
@@ -208,71 +208,6 @@ end;</pre></example>
 <p>An exception will be raised if there was an error expanding the constants.</p></description>
       </function>
     </subcategory>
-    <subcategory>
-      <function>
-        <name>ExtractTemporaryFile</name>
-        <prototype>procedure ExtractTemporaryFile(const FileName: String);</prototype>
-        <description><p>Extracts the specified file from the [Files] section to a temporary directory. To find the location of the temporary directory, use <tt>ExpandConstant('{tmp}')</tt>.</p>
-<p>The extracted files are automatically deleted when Setup exits.</p>
-<p>An exception will be raised if the file wasn't extracted successfully, if the file wasn't found, or if the file was found but couldn't be processed because of its MinVersion and/or OnlyBelowVersion parameters.</p></description>
-        <remarks><p>Use <tt>Flags: dontcopy</tt> in the [Files] section to tell Setup to skip the file during the normal file copying stage.</p>
-<p>Use <tt>Flags: noencryption</tt> in the [Files] section if encryption is enabled and you call the ExtractTemporaryFile function prior to the user entering the correct password.</p>
-<p>When solid compression is enabled, be sure to list your temporary files at (or near) the top of the [Files] section. In order to extract an arbitrary file in a solid-compressed installation, Setup must first decompress all prior files (to a temporary buffer in memory). This can result in a substantial delay if a number of other files are listed above the specified file in the [Files] section.</p></remarks>
-        <seealso><p><link topic="isxfunc_ExtractTemporaryFiles">ExtractTemporaryFiles</link></p></seealso>
-        <example><pre>[Files]
-Source: "Readme.txt"; Flags: dontcopy noencryption
-
-[Code]
-function InitializeSetup: Boolean;
-var
-  S: AnsiString;
-begin
-  // Show the contents of Readme.txt (non Unicode) in a message box
-  ExtractTemporaryFile('Readme.txt');
-  if LoadStringFromFile(ExpandConstant('{tmp}\Readme.txt'), S) then
-  begin
-    MsgBox(S, mbInformation, MB_OK);
-  end;
-
-  Result := True;
-end;</pre></example>
-      </function>
-      <function>
-        <name>ExtractTemporaryFiles</name>
-        <prototype>function ExtractTemporaryFiles(const Pattern: String): Integer;</prototype>
-        <description><p>Extracts the files matching the wildcard specified by Pattern from the [Files] section to a temporary directory. Returns the number of extracted files. To find the location of the temporary directory, use <tt>ExpandConstant('{tmp}')</tt>.</p>
-<p>The extracted files are automatically deleted when Setup exits.</p>
-<p>An exception will be raised if no files were extracted successfully, no files were found, or if files were found but none could be processed because of their MinVersion and/or OnlyBelowVersion parameters.</p></description>
-        <remarks><p>Use <tt>Flags: dontcopy</tt> in the [Files] section to tell Setup to skip the file during the normal file copying stage.</p>
-<p>When solid compression is enabled, be sure to list your temporary files at (or near) the top of the [Files] section. In order to extract an arbitrary file in a solid-compressed installation, Setup must first decompress all prior files (to a temporary buffer in memory). This can result in a substantial delay if a number of other files are listed above the specified file in the [Files] section.</p></remarks>
-        <seealso><p><link topic="isxfunc_ExtractTemporaryFile">ExtractTemporaryFile</link></p></seealso>
-        <example><pre>[Files]
-Source: "Readme.txt"; Flags: dontcopy
-Source: "MyProg.exe"; DestDir: "{app}"
-Source: "MyProg.chm"; DestDir: "{app}"
-
-[Code]
-function InitializeSetup: Boolean;
-var
-  S: AnsiString;
-  ResultCode: Integer;
-begin
-  // Show the contents of Readme.txt (non Unicode) in a message box
-  ExtractTemporaryFiles('{tmp}\Readme.txt');
-  if LoadStringFromFile(ExpandConstant('{tmp}\Readme.txt'), S) then
-  begin
-    MsgBox(S, mbInformation, MB_OK);
-  end;
-
-  // Extract all MyProg files and launch it. Note how {app} is left unexpanded.
-  ExtractTemporaryFiles('{app}\MyProg.*');
-  ExecAsOriginalUser(ExpandConstant('{tmp}\')+'{app}\MyProg.exe', '', '',
-    SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
-
-  Result := True;
-end;</pre></example>
-      </function>
-    </subcategory>
     <subcategory>
       <function>
         <name>GetPreviousData</name>
@@ -296,7 +231,7 @@ end;</pre></example>
       <function>
         <name>RegisterExtraCloseApplicationsResource</name>
         <prototype>function RegisterExtraCloseApplicationsResource(const DisableFsRedir: Boolean; const AFilename: String): Boolean;</prototype>
-        <description><p>Register an extra file which Setup should check for being in-use. Call RegisterExtraCloseApplicationsResource inside a RegisterExtraCloseApplicationsResources event function, once per file. Returns True if successful.</p></description>
+        <description><p>Register an extra file which Setup should check for being in-use. Call RegisterExtraCloseApplicationsResource inside a RegisterExtraCloseApplicationsResources event function, once per file. Ignores <link topic="setup_closeapplicationsfilter">CloseApplicationsFilter</link>. Returns True if successful.</p></description>
       </function>
       <function>
         <name>RmSessionStarted</name>
@@ -634,6 +569,19 @@ end;</pre></example>
         <seealso><p><link topic="isxfunc_GetWindowsVersion">GetWindowsVersion</link><br />
 <link topic="isxfunc_GetWindowsVersionEx">GetWindowsVersionEx</link></p></seealso>
       </function>
+      <function>
+        <name>IsDotNetInstalled</name>
+        <prototype>function IsDotNetInstalled(const MinVersion: TDotNetVersion; const MinServicePack: Cardinal): Boolean;</prototype>
+        <description><p>Returns True if the .NET Framework with the specified MinVersion and MinServicePack parameters is installed.</p>
+<p>TDotNetVersion is defined as:</p>
+<p><tt>TDotNetVersion = (net11, net20, net30, net35, net4Client, net4Full, net45, net451, net452, net46, net461, net462, net47, net471, net472, net48);</tt></p></description>
+        <example><pre>function InitializeSetup: Boolean;
+begin
+  Result := IsDotNetInstalled(net462, 0); //Returns True if .NET Framework version 4.6.2 is installed, or a compatible version such as 4.8
+  if not Result then
+    SuppressibleMsgBox(FmtMessage(SetupMessage(msgWinVersionTooLowError), ['.NET Framework', '4.6.2']), mbCriticalError, MB_OK, IDOK);
+end;</pre></example>
+      </function>    
     </subcategory>
     <subcategory>
       <function>
@@ -927,7 +875,7 @@ end;</pre></example>
       <function>
         <name>SameText</name>
         <prototype>function SameText(const S1, S2: string): Boolean;</prototype>
-        <description><p>Compares the strings S1 and S2 and returns True if they are equal.  The SameText function is not case-sensitive.</p></description>
+        <description><p>Compares the strings S1 and S2 and returns True if they are equal. The SameText function is not case-sensitive.</p></description>
       </function>
       <function>
         <name>SameStr</name>
@@ -999,12 +947,12 @@ end;</pre></example>
       <function>
         <name>StrToInt64Def</name>
         <prototype>function StrToInt64Def(s: string; def: Int64): Int64;</prototype>
-        <description><p>The StrToInt64Def function converts the string passed in S into a 64-bit number. If S does not represent a valid 64-bit number, StrToInt returns the 64-bit number passed in Def.</p><p>Requires Unicode Inno Setup.</p></description>
+        <description><p>The StrToInt64Def function converts the string passed in S into a 64-bit number. If S does not represent a valid 64-bit number, StrToInt returns the 64-bit number passed in Def.</p></description>
       </function>
       <function>
         <name>StrToInt64</name>
         <prototype>function StrToInt64(s: string): Int64;</prototype>
-        <description><p>The StrToInt64 function converts the string passed in S into a 64-bit number.</p><p>Requires Unicode Inno Setup.</p></description>
+        <description><p>The StrToInt64 function converts the string passed in S into a 64-bit number.</p></description>
         <remarks><p>Use of <link topic="isxfunc_StrToInt64Def">StrToInt64Def</link> instead of StrToInt64 is recommended.</p></remarks>
       </function>
       <function>
@@ -1015,12 +963,12 @@ end;</pre></example>
       <function>
         <name>IntToStr</name>
         <prototype>function IntToStr(i: Int64): String;</prototype>
-        <description><p>The IntToStr function converts an 32-bit or 64-bit number into a string.</p><p>64-bit numbers require Unicode Inno Setup.</p></description>
+        <description><p>The IntToStr function converts a 64-bit number into a string.</p></description>
       </function>
       <function>
         <name>FloatToStr</name>
         <prototype>function FloatToStr(e: extended): String;</prototype>
-        <description><p>The FloatToStr function converts a floating point number into a string.</p><p>Unicode Inno Setup: the character used for the decimal point will always be a dot. Non-Unicode Inno Setup: the character used for the decimal point is locale-dependant.</p></description>
+        <description><p>The FloatToStr function converts a floating point number into a string.</p><p>The character used for the decimal point will always be a dot.</p></description>
       </function>
     </subcategory>
     <subcategory>
@@ -1209,7 +1157,7 @@ end;
       <function>
         <name>GetMD5OfUnicodeString</name>
         <prototype>function GetMD5OfUnicodeString(const S: String): String;</prototype>
-        <description><p>Gets the MD5 sum of the specified string, as a string.</p><p>Causes an internal error if called by non Unicode Setup or Uninstall.</p></description>
+        <description><p>Gets the MD5 sum of the specified string, as a string.</p></description>
         <example><pre>var
   MD5: String;
 begin
@@ -1233,13 +1181,37 @@ end;
       <function>
         <name>GetSHA1OfUnicodeString</name>
         <prototype>function GetSHA1OfUnicodeString(const S: String): String;</prototype>
-        <description><p>Gets the SHA-1 hash of the specified string, as a string.</p><p>Causes an internal error if called by non Unicode Setup or Uninstall.</p></description>
+        <description><p>Gets the SHA-1 hash of the specified string, as a string.</p></description>
         <example><pre>var
   SHA1: String;
 begin
   SHA1 := GetSHA1OfUnicodeString('Test');
   // SHA1 = '9ab696a37604d665dc97134dbee44cfe70451b1a'
 end;
+</pre></example>
+      </function>
+      <function>
+        <name>GetSHA256OfString</name>
+        <prototype>function GetSHA256OfString(const S: AnsiString): String;</prototype>
+        <description><p>Gets the SHA-256 hash of the specified string, as a string.</p></description>
+        <example><pre>var
+  SHA256: String;
+begin
+  SHA256 := GetSHA256OfString('Test');
+  // SHA256 = '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'
+end;
+</pre></example>
+      </function>
+      <function>
+        <name>GetSHA256OfUnicodeString</name>
+        <prototype>function GetSHA256OfUnicodeString(const S: String): String;</prototype>
+        <description><p>Gets the SHA-256 hash of the specified string, as a string.</p></description>
+        <example><pre>var
+  SHA256: String;
+begin
+  SHA256 := GetSHA256OfUnicodeString('Test');
+  // SHA256 = 'fe520676b1a1d93dabab2319eea03674f3632eaeeb163d1e88244f5eb1de10eb'
+end;
 </pre></example>
       </function>
     </subcategory>
@@ -1294,14 +1266,13 @@ end;
       <function>
         <name>VarIsEmpty</name>
         <prototype>function VarIsEmpty(const V: Variant): Boolean;</prototype>
-        <description><p>Non Unicode Inno Setup: Returns True if the specified variant's value is undefined. Unicode Inno Setup: Returns True if the specified variant is unassigned.</p></description>
+        <description><p>Returns True if the specified variant is unassigned.</p></description>
         <seealso><p><link topic="isxfunc_VarIsClear">VarIsClear</link></p></seealso>
       </function>
       <function>
         <name>VarIsClear</name>
         <prototype>function VarIsClear(const V: Variant): Boolean;</prototype>
         <description><p>Returns True if the specified variant's value is undefined.</p></description>
-        <remarks><p>Requires Unicode Inno Setup.</p></remarks>
         <seealso><p><link topic="isxfunc_VarIsEmpty">VarIsEmpty</link></p></seealso>
       </function>
       <function>
@@ -1362,7 +1333,12 @@ const
       <function>
         <name>FileSize</name>
         <prototype>function FileSize(const Name: String; var Size: Integer): Boolean;</prototype>
-        <description><p>Sets Size to the size of the specified file in bytes. Returns True if the file size was set successfully and False otherwise. Only supports file sizes smaller than 2 GB. To get all 64 bits of the file size, use <link topic="isxfunc_FindFirst">FindFirst</link>/<link topic="isxfunc_FindClose">FindClose</link> instead.</p></description>
+        <description><p>Sets Size to the size of the specified file in bytes. Returns True if the file size was set successfully and False otherwise. Only supports file sizes smaller than 2 GB. To get all 64 bits of the file size, use <link topic="isxfunc_FileSize64">FileSize64</link> instead.</p></description>
+      </function>
+      <function>
+        <name>FileSize64</name>
+        <prototype>function FileSize64(const Name: String; var Size: Int64): Boolean;</prototype>
+        <description><p>Sets Size to the size of the specified file in bytes. Returns True if the file size was set successfully and False otherwise.</p></description>
       </function>
       <function>
         <name>GetSpaceOnDisk</name>
@@ -1390,7 +1366,6 @@ end;</pre></example>
         <name>GetSpaceOnDisk64</name>
         <prototype>function GetSpaceOnDisk64(const Path: String; var Free, Total: Int64): Boolean;</prototype>
         <description><p>Returns the number of free and total bytes on a drive. Path specifies a directory on the drive or UNC share to check; it can be either the root (e.g. <tt>C:\</tt>) or an existing subdirectory. Returns True if successful, False otherwise.</p></description>
-        <remarks><p>Requires Unicode Inno Setup.</p></remarks>
         <example><pre>var
   Path: String;
   FreeBytes, TotalBytes: Int64;
@@ -1577,18 +1552,6 @@ end;</pre></example>
         <description><p>Generates a unique filename for a file in the specified path with the specified extension.</p></description>
       </function>
     </subcategory>
-    <subcategory>
-      <function>
-        <name>GetVersionNumbers</name>
-        <prototype>function GetVersionNumbers(const Filename: String; var VersionMS, VersionLS: Cardinal): Boolean;</prototype>
-        <description><p>Gets the file version numbers of the specified file.</p></description>
-      </function>
-      <function>
-        <name>GetVersionNumbersString</name>
-        <prototype>function GetVersionNumbersString(const Filename: String; var Version: String): Boolean;</prototype>
-        <description><p>Gets the file version numbers of the specified file, as a string.</p></description>
-      </function>
-    </subcategory>
     <subcategory>
       <function>
         <name>IsProtectedSystemFile</name>
@@ -1607,6 +1570,11 @@ end;</pre></example>
         <prototype>function GetSHA1OfFile(const Filename: String): String;</prototype>
         <description><p>Gets the SHA-1 hash of the specified file, as a string. An exception will be raised upon failure.</p></description>
       </function>
+      <function>
+        <name>GetSHA256OfFile</name>
+        <prototype>function GetSHA256OfFile(const Filename: String): String;</prototype>
+        <description><p>Gets the SHA-256 hash of the specified file, as a string. An exception will be raised upon failure.</p></description>
+      </function>
     </subcategory>
     <subcategory>
       <function>
@@ -1709,6 +1677,118 @@ end;</pre></example>
 <p>Refer to the <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381.aspx">system error codes on MSDN</a>.</p></remarks>
       </function>
     </subcategory>
+    <subcategory>
+      <function>
+        <name>ExtractTemporaryFile</name>
+        <prototype>procedure ExtractTemporaryFile(const FileName: String);</prototype>
+        <description><p>Extracts the specified file from the [Files] section to a temporary directory. To find the location of the temporary directory, use <tt>ExpandConstant('{tmp}')</tt>.</p>
+<p>The extracted files are automatically deleted when Setup exits.</p>
+<p>An exception will be raised if the file wasn't extracted successfully, if the file wasn't found, or if the file was found but couldn't be processed because of its MinVersion and/or OnlyBelowVersion parameters.</p></description>
+        <remarks><p>Use <tt>Flags: dontcopy</tt> in the [Files] section to tell Setup to skip the file during the normal file copying stage.</p>
+<p>Use <tt>Flags: noencryption</tt> in the [Files] section if encryption is enabled and you call the ExtractTemporaryFile function prior to the user entering the correct password.</p>
+<p>When solid compression is enabled, be sure to list your temporary files at (or near) the top of the [Files] section. In order to extract an arbitrary file in a solid-compressed installation, Setup must first decompress all prior files (to a temporary buffer in memory). This can result in a substantial delay if a number of other files are listed above the specified file in the [Files] section.</p></remarks>
+        <seealso><p><link topic="isxfunc_ExtractTemporaryFiles">ExtractTemporaryFiles</link><br />
+<link topic="isxfunc_DownloadTemporaryFile">DownloadTemporaryFile</link></p></seealso>
+        <example><pre>[Files]
+Source: "Readme.txt"; Flags: dontcopy noencryption
+
+[Code]
+function InitializeSetup: Boolean;
+var
+  S: AnsiString;
+begin
+  // Show the contents of Readme.txt (non Unicode) in a message box
+  ExtractTemporaryFile('Readme.txt');
+  if LoadStringFromFile(ExpandConstant('{tmp}\Readme.txt'), S) then
+  begin
+    MsgBox(S, mbInformation, MB_OK);
+  end;
+
+  Result := True;
+end;</pre></example>
+      </function>
+      <function>
+        <name>ExtractTemporaryFiles</name>
+        <prototype>function ExtractTemporaryFiles(const Pattern: String): Integer;</prototype>
+        <description><p>Extracts the files matching the wildcard specified by Pattern from the [Files] section to a temporary directory. Returns the number of extracted files. To find the location of the temporary directory, use <tt>ExpandConstant('{tmp}')</tt>.</p>
+<p>The extracted files are automatically deleted when Setup exits.</p>
+<p>An exception will be raised if no files were extracted successfully, no files were found, or if files were found but none could be processed because of their MinVersion and/or OnlyBelowVersion parameters.</p></description>
+        <remarks><p>Use <tt>Flags: dontcopy</tt> in the [Files] section to tell Setup to skip the file during the normal file copying stage.</p>
+<p>When solid compression is enabled, be sure to list your temporary files at (or near) the top of the [Files] section. In order to extract an arbitrary file in a solid-compressed installation, Setup must first decompress all prior files (to a temporary buffer in memory). This can result in a substantial delay if a number of other files are listed above the specified file in the [Files] section.</p></remarks>
+        <seealso><p><link topic="isxfunc_ExtractTemporaryFile">ExtractTemporaryFile</link></p></seealso>
+        <example><pre>[Files]
+Source: "Readme.txt"; Flags: dontcopy
+Source: "MyProg.exe"; DestDir: "{app}"
+Source: "MyProg.chm"; DestDir: "{app}"
+
+[Code]
+function InitializeSetup: Boolean;
+var
+  S: AnsiString;
+  ResultCode: Integer;
+begin
+  // Show the contents of Readme.txt (non Unicode) in a message box
+  ExtractTemporaryFiles('{tmp}\Readme.txt');
+  if LoadStringFromFile(ExpandConstant('{tmp}\Readme.txt'), S) then
+  begin
+    MsgBox(S, mbInformation, MB_OK);
+  end;
+
+  // Extract all MyProg files and launch it. Note how {app} is left unexpanded.
+  ExtractTemporaryFiles('{app}\MyProg.*');
+  ExecAsOriginalUser(ExpandConstant('{tmp}\')+'{app}\MyProg.exe', '', '',
+    SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
+
+  Result := True;
+end;</pre></example>
+      </function>
+      <function>
+        <name>DownloadTemporaryFile</name>
+        <prototype>function DownloadTemporaryFile(const Url, FileName, RequiredSHA256OfFile: String; const OnDownloadProgress: TOnDownloadProgress): Int64;</prototype>
+        <description><p>Downloads the file from the specified URL to a temporary directory using the specified name. To find the location of the temporary directory, use <tt>ExpandConstant('{tmp}')</tt>.</p>
+<p>If RequiredSHA256OfFile is set it will compare this to the SHA-256 of the downloaded file and raise an exception if the hashes don't match.</p>
+<p>An exception will be raised if there was an error. Otherwise, returns the number of bytes downloaded. Returns 0 if RequiredSHA256OfFile is set and the file was already downloaded.</p>
+<p>Supports HTTPS (but not expired or self-signed certificates) and HTTP. Redirects are automatically followed and proxy settings are automatically used. Safe to use from services.</p>
+<p>For basic authentication use a special URL format like this: http://username:[email protected]/</p>
+<p>Set OnDownloadProgress to a function to be informed of progress, or <tt>nil</tt> otherwise.</p></description>
+        <remarks><p>TOnDownloadProgress is defined as:</p>
+<p><tt>TOnDownloadProgress = function(const Url, FileName: string; const Progress, ProgressMax: Int64): Boolean;</tt></p>
+<p>ProgressMax will be 0 if the file size is still unknown. Return True to allow the download to continue, False otherwise.</p></remarks>
+        <seealso><p><link topic="isxfunc_DownloadTemporaryFileSize">DownloadTemporaryFileSize</link><br />
+<link topic="isxfunc_CreateDownloadPage">CreateDownloadPage</link><br />
+<link topic="isxfunc_ExtractTemporaryFile">ExtractTemporaryFile</link></p></seealso>
+        <example><pre>
+[Code]
+function OnDownloadProgress(const Url, Filename: string; const Progress, ProgressMax: Int64): Boolean;
+begin
+  if ProgressMax &lt;&gt; 0 then
+    Log(Format('  %d of %d bytes done.', [Progress, ProgressMax]))
+  else
+    Log(Format('  %d bytes done.', [Progress]));
+  Result := True;
+end;
+
+function InitializeSetup: Boolean;
+begin
+  try
+    DownloadTemporaryFile('https://jrsoftware.org/download.php/is.exe', 'innosetup-latest.exe', '', @OnDownloadProgress);
+    DownloadTemporaryFile('https://jrsoftware.org/download.php/iscrypt.dll', 'ISCrypt.dll', '2f6294f9aa09f59a574b5dcd33be54e16b39377984f3d5658cda44950fa0f8fc', @OnDownloadProgress);
+    Result := True;
+  except
+    Log(GetExceptionMessage);
+    Result := False;
+  end;
+end;</pre>
+<p>See <i>CodeDownloadFiles.iss</i> for another example which uses <link topic="isxfunc_CreateDownloadPage">CreateDownloadPage</link> instead.</p></example>
+      </function>
+      <function>
+        <name>DownloadTemporaryFileSize</name>
+        <prototype>function DownloadTemporaryFileSize(const Url): Int64;</prototype>
+        <description><p>Returns the size of the file from the specified URL, without downloading the file. If the server does not provide the file size, -1 will be returned.</p>
+<p>An exception will be raised if there was an error.</p>
+<p>See <link topic="isxfunc_DownloadTemporaryFile">DownloadTemporaryFile</link> for other considerations.</p></description>
+      </function>
+    </subcategory>
     <subcategory>
       <function>
         <name>RenameFile</name>
@@ -1764,7 +1844,7 @@ end;</pre></example>
       <function>
         <name>SaveStringsToUTF8File</name>
         <prototype>function SaveStringsToUTF8File(const FileName: String; const S: TArrayOfString; const Append: Boolean): Boolean;</prototype>
-        <description><p>Saves the specified string array to the specified file with UTF8 encoding. If Append is True and the specified file already exists, it will be appended to instead of overwritten. Returns True if successful, False otherwise.</p><p>Causes an internal error if called by non Unicode Setup or Uninstall.</p></description>
+        <description><p>Saves the specified string array to the specified file with UTF8 encoding. If Append is True and the specified file already exists, it will be appended to instead of overwritten. Returns True if successful, False otherwise.</p></description>
         <seealso><p><link topic="isxfunc_SaveStringsToFile">SaveStringsToFile</link></p></seealso>
       </function>
     </subcategory>
@@ -1891,7 +1971,7 @@ end;</pre>
       </function>
       <function>
         <name>UnregisterFont</name>
-        <prototype>procedure UnregisterFont(const FontName, FontFilename: String);</prototype>
+        <prototype>procedure UnregisterFont(const FontName, FontFilename: String; const PerUserFont: Boolean);</prototype>
         <description><p>Unregisters the font with the specified face and filename.</p></description>
       </function>
       <function>
@@ -1901,6 +1981,92 @@ end;</pre>
       </function>
     </subcategory>
   </category>
+  <category>
+    <description><p>File Version</p></description>
+    <subcategory>
+      <function>
+        <name>GetVersionNumbers</name>
+        <prototype>function GetVersionNumbers(const Filename: String; var VersionMS, VersionLS: Cardinal): Boolean;</prototype>
+        <description><p>Gets the version numbers of the specified file. Returns True if successful, False otherwise.</p></description>
+        <seealso><p><link topic="isxfunc_PackVersionNumbers">PackVersionNumbers</link></p></seealso>
+      </function>
+      <function>
+        <name>GetVersionComponents</name>
+        <prototype>function GetVersionComponents(const Filename: String; var Major, Minor, Revision, Build: Word): Boolean;</prototype>
+        <description><p>Gets the individual version components of the specified file. Returns True if successful, False otherwise.</p></description>
+        <seealso><p><link topic="isxfunc_PackVersionComponents">PackVersionComponents</link></p></seealso>
+      </function>
+      <function>
+        <name>GetVersionNumbersString</name>
+        <prototype>function GetVersionNumbersString(const Filename: String; var Version: String): Boolean;</prototype>
+        <description><p>Gets the version of the specified file as a string (in "0.0.0.0" format). Returns True if successful, False otherwise.</p></description>
+      </function>
+      <function>
+        <name>GetPackedVersion</name>
+        <prototype>function GetPackedVersion(const Filename: String; var Version: Int64): Boolean;</prototype>
+        <description><p>Gets the packed version of the specified file. Returns True if successful, False otherwise.</p>
+<p>Always use <link topic="isxfunc_ComparePackedVersion">ComparePackedVersion</link> or <link topic="isxfunc_SamePackedVersion">SamePackedVersion</link> to compare packed versions.</p></description>
+        <seealso><p><link topic="isxfunc_PackVersionComponents">PackVersionComponents</link></p></seealso>
+      </function>
+    </subcategory>
+    <subcategory>
+      <function>
+        <name>PackVersionNumbers</name>
+        <prototype>function PackVersionNumbers(const VersionMS, VersionLS: Cardinal): Int64;</prototype>
+        <description><p>Packs version numbers into a single value.</p>
+<p>Always use <link topic="isxfunc_ComparePackedVersion">ComparePackedVersion</link> or <link topic="isxfunc_SamePackedVersion">SamePackedVersion</link> to compare packed versions.</p></description>
+        <seealso><p><link topic="isxfunc_GetVersionNumbers">GetVersionNumbers</link><br />
+<link topic="isxfunc_PackVersionComponents">PackVersionComponents</link><br />
+<link topic="isxfunc_UnpackVersionNumbers">UnpackVersionNumbers</link></p></seealso>
+      </function>
+      <function>
+        <name>PackVersionComponents</name>
+        <prototype>function PackVersionComponents(const Major, Minor, Revision, Build: Word): Int64;</prototype>
+        <description><p>Packs individual version components into a single value.</p>
+<p>Always use <link topic="isxfunc_ComparePackedVersion">ComparePackedVersion</link> or <link topic="isxfunc_SamePackedVersion">SamePackedVersion</link> to compare packed versions.</p></description>
+        <seealso><p><link topic="isxfunc_GetVersionComponents">GetVersionComponents</link><br />
+<link topic="isxfunc_PackVersionNumbers">PackVersionNumbers</link><br />
+<link topic="isxfunc_UnpackVersionComponents">UnpackVersionComponents</link></p></seealso>
+      </function>
+    </subcategory>
+    <subcategory>
+      <function>
+        <name>ComparePackedVersion</name>
+        <prototype>function ComparePackedVersion(const Version1, Version2: Int64): Integer;</prototype>
+        <description><p>Compares Version1 to Version2. The return value is less than 0 if Version1 is less than Version2, 0 if Version1 equals Version2, or greater than 0 if Version1 is greater than Version2.</p></description>
+      </function>
+      <function>
+        <name>SamePackedVersion</name>
+        <prototype>function SamePackedVersion(const Version1, Version2: Int64): Boolean;</prototype>
+        <description><p>Compares the packed versions Version1 and Version2 and returns True if they are equal.</p></description>
+      </function>
+    </subcategory>
+    <subcategory>
+      <function>
+        <name>UnpackVersionNumbers</name>
+        <prototype>procedure UnpackVersionNumbers(const Version: Int64; var VersionMS, VersionLS: Cardinal);</prototype>
+        <description><p>Unpacks a packed version into version numbers.</p></description>
+        <seealso><p><link topic="isxfunc_UnpackVersionComponents">UnpackVersionComponents</link><br />
+<link topic="isxfunc_PackVersionNumbers">PackVersionNumbers</link></p></seealso>
+      </function>
+      <function>
+        <name>UnpackVersionComponents</name>
+        <prototype>procedure UnpackVersionComponents(const Version: Int64; var Major, Minor, Revision, Build: Word);</prototype>
+        <description><p>Unpacks a packed version into individual version components.</p></description>
+        <seealso><p><link topic="isxfunc_UnpackVersionNumbers">UnpackVersionNumbers</link><br />
+<link topic="isxfunc_PackVersionComponents">PackVersionComponents</link></p></seealso>
+      </function>
+    </subcategory>
+    <subcategory>
+      <function>
+        <name>VersionToStr</name>
+        <prototype>function VersionToStr(const Version: Int64): String;</prototype>
+        <description><p>Returns the specified packed version as a string (in "0.0.0.0" format).</p></description>
+        <seealso><p><link topic="isxfunc_PackVersionNumbers">PackVersionNumbers</link><br />
+<link topic="isxfunc_PackVersionComponents">PackVersionComponents</link></p></seealso>
+      </function>
+    </subcategory>
+  </category>
   <category>
     <description><p>Registry</p></description>
     <subcategory>
@@ -2324,6 +2490,22 @@ Page := CreateOutputMsgMemoPage(wpWelcome,
         <example><p>See <i>CodeDlg.iss</i> and <i>AllPagesExample.iss</i> for examples.</p></example>
         <seealso><p><link topic="scriptclasses" anchor="TOutputProgressWizardPage">TOutputProgressWizardPage</link></p></seealso>
       </function>
+      <function>
+        <name>CreateDownloadPage</name>
+        <prototype>function CreateDownloadPage(const ACaption, ADescription: String; const OnDownloadProgress: TOnDownloadProgress): TDownloadWizardPage;</prototype>
+        <description><p>Creates a wizard page to download files and show progress.</p>
+<p>Set OnDownloadProgress to a function to be informed of progress, or <tt>nil</tt> otherwise.</p>    
+<p>Unlike the other types of wizard pages, progress pages are not displayed as part of the normal page sequence (note that there is no <tt>AfterID</tt> parameter). A progress page can only be displayed programmatically by calling its <tt>Show</tt> method.</p></description>
+        <remarks><p>Call the <tt>Show</tt> method to activate and show the page. When you're finished with it, call the <tt>Hide</tt> method to revert to the previous page.</p>
+<p>Always put the <tt>Hide</tt> call inside the <tt>finally</tt> part of a <tt>try..finally</tt> language construct, as demonstrated in <i>CodeDownloadFiles.iss</i>. Not calling <tt>Hide</tt> will result in the wizard being permanently stuck on the progress page.</p>
+<p>To add a new file to download, call the <tt>Add</tt> method. Always call the <tt>Clear</tt> method before adding the first file.</p>
+<p>To start the download, call the <tt>Download</tt> method. An exception will be raised if there was an error. Otherwise, <tt>Download</tt> returns the number of bytes downloaded.</p>
+<p>See <link topic="isxfunc_DownloadTemporaryFile">DownloadTemporaryFile</link> for other considerations and the definition of <tt>TOnDownloadProgress</tt>.</p></remarks>
+        <example><p>See <i>CodeDownloadFiles.iss</i> for an example.</p></example>
+        <seealso><p><link topic="scriptclasses" anchor="TDownloadWizardPage">TDownloadWizardPage</link><br />
+<link topic="isxfunc_DownloadTemporaryFile">DownloadTemporaryFile</link><br />
+<link topic="isxfunc_CreateOutputProgressPage">CreateOutputProgressPage</link></p></seealso>
+      </function>
       <function>
         <name>CreateCustomPage</name>
         <prototype>function CreateCustomPage(const AfterID: Integer; const ACaption, ADescription: String): TWizardPage;</prototype>
@@ -2679,6 +2861,10 @@ end;</pre></example>
      <description>CurPage values</description>
      <values>wpWelcome, wpLicense, wpPassword, wpInfoBefore, wpUserInfo, wpSelectDir, wpSelectComponents, wpSelectProgramGroup, wpSelectTasks, wpReady, wpPreparing, wpInstalling, wpInfoAfter, wpFinished</values>
   </enum>
+  <enum>
+     <description>Exec and ShellExec - ShowCmd values</description>
+     <values>SW_SHOW, SW_SHOWNORMAL, SW_SHOWMAXIMIZED, SW_SHOWMINIMIZED, SW_SHOWMINNOACTIVE, SW_HIDE</values>
+  </enum>
   <enum>
      <description>TMsgBoxType</description>
      <values>mbInformation, mbConfirmation, mbError, mbCriticalError</values>
@@ -2691,25 +2877,21 @@ end;</pre></example>
      <description>MsgBox - return values</description>
      <values>IDOK, IDCANCEL, IDABORT, IDRETRY, IDIGNORE, IDYES, IDNO</values>
   </enum>
-  <enum>
-     <description>TShellFolderID</description>
-     <values>sfDesktop, sfStartMenu, sfPrograms, sfStartup, sfSendTo, sfFonts, sfAppData, sfDocs, sfTemplates, sfFavorites, sfLocalAppData</values>
-  </enum>
   <enum>
      <description>Reg* - RootKey values (also see the <link topic="registrysection" window="main">[Registry]</link> section documentation)</description>
      <values>HKEY_AUTO, HKEY_AUTO_32, HKEY_AUTO_64,<br />HKEY_CLASSES_ROOT, HKEY_CLASSES_ROOT_32, HKEY_CLASSES_ROOT_64,<br />HKEY_CURRENT_USER, HKEY_CURRENT_USER_32, HKEY_CURRENT_USER_64,<br />HKEY_LOCAL_MACHINE, HKEY_LOCAL_MACHINE_32, HKEY_LOCAL_MACHINE_64,<br />HKEY_USERS, HKEY_USERS_32, HKEY_USERS_64,<br />HKEY_PERFORMANCE_DATA,<br />HKEY_CURRENT_CONFIG, HKEY_CURRENT_CONFIG_32, HKEY_CURRENT_CONFIG_64,<br />HKEY_DYN_DATA,<br />HKA, HKA32, HKA64, HKCR, HKCR32, HKCR64, HKCU, HKCU32, HKCU64, HKLM, HKLM32, HKLM64, HKU, HKU32, HKU64, HKCC, HKCC32, HKCC64</values>
   </enum>
   <enum>
-     <description>TShouldProcessEntryResult</description>
-     <values>srNo, srYes, srUnknown</values>
+     <description>TShellFolderID</description>
+     <values>sfDesktop, sfStartMenu, sfPrograms, sfStartup, sfSendTo, sfFonts, sfAppData, sfDocs, sfTemplates, sfFavorites, sfLocalAppData</values>
   </enum>
   <enum>
      <description>TSetupMessageID</description>
      <values>Use 'msg' + the message name. Example: <i>SetupMessage(msgSetupAppTitle)</i></values>
   </enum>
   <enum>
-     <description>Exec and ShellExec - ShowCmd values</description>
-     <values>SW_SHOW, SW_SHOWNORMAL, SW_SHOWMAXIMIZED, SW_SHOWMINIMIZED, SW_SHOWMINNOACTIVE, SW_HIDE</values>
+     <description>TShouldProcessEntryResult</description>
+     <values>srNo, srYes, srUnknown</values>
   </enum>
 </isxenum>
 </isxhelp>

+ 2 - 4
ISHelp/isxfunc.xsl

@@ -7,13 +7,11 @@
 
 <xsl:comment>
   Inno Setup
-  Copyright (C) 1997-2006 Jordan Russell
-  Portions by Martijn Laan
+  Copyright (C) 1997-2020 Jordan Russell
+  Portions Copyright (C) 2000-2020 Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
   This file is automatically generated. Do not edit.
-
-  $jrsoftware: ishelp/isxfunc.xsl,v 1.30 2009/11/05 13:59:15 mlaan Exp $
 </xsl:comment>
 
 <ishelp version="1">

+ 1 - 1
Projects/CompFileAssoc.pas

@@ -2,7 +2,7 @@ unit CompFileAssoc;
 
 {
   Inno Setup
-  Copyright (C) 1997-2018 Jordan Russell
+  Copyright (C) 1997-2020 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 

+ 17 - 8
Projects/CompForm.dfm

@@ -339,7 +339,7 @@ object CompileForm: TCompileForm
       object N1: TMenuItem
         Caption = '-'
       end
-      object FMRUSep: TMenuItem
+      object FMRUFilesSep: TMenuItem
         Caption = '-'
         Visible = False
       end
@@ -584,6 +584,11 @@ object CompileForm: TCompileForm
         ShortCut = 24647
         OnClick = TGenerateGUIDClick
       end
+      object TInsertMsgBox: TMenuItem
+        Caption = '&MessageBox Designer...'
+        ShortCut = 24653
+        OnClick = TInsertMsgBoxClick
+      end
       object N7: TMenuItem
         Caption = '-'
       end
@@ -602,6 +607,13 @@ object CompileForm: TCompileForm
     object HMenu: TMenuItem
       Caption = '&Help'
       OnClick = HMenuClick
+      object HDonate: TMenuItem
+        Caption = 'D&onate - Thank you!'
+        OnClick = HDonateClick
+      end
+      object N14: TMenuItem
+        Caption = '-'
+      end
       object HDoc: TMenuItem
         Caption = 'Inno Setup &Documentation'
         OnClick = HDocClick
@@ -614,6 +626,10 @@ object CompileForm: TCompileForm
         Caption = 'Inno Setup &FAQ'
         OnClick = HFaqClick
       end
+      object HMailingList: TMenuItem
+        Caption = 'Inno Setup &Mailing List'
+        OnClick = HMailingListClick
+      end
       object HWhatsNew: TMenuItem
         Caption = 'Inno Setup &Revision History'
         OnClick = HWhatsNewClick
@@ -639,13 +655,6 @@ object CompileForm: TCompileForm
       object N6: TMenuItem
         Caption = '-'
       end
-      object HDonate: TMenuItem
-        Caption = 'D&onate'
-        OnClick = HDonateClick
-      end
-      object N14: TMenuItem
-        Caption = '-'
-      end
       object HAbout: TMenuItem
         Caption = '&About Inno Setup'
         OnClick = HAboutClick

+ 149 - 58
Projects/CompForm.pas

@@ -25,7 +25,7 @@ uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   UIStateForm, StdCtrls, ExtCtrls, Menus, Buttons, ComCtrls, CommCtrl,
   ScintInt, ScintEdit, ScintStylerInnoSetup, NewTabSet, ModernColors,
-  DebugStruct, CompInt, UxTheme, System.ImageList, ImgList, ToolWin,
+  DebugStruct, CompInt, UxTheme, ImageList, ImgList, ToolWin,
   VirtualImageList, BaseImageCollection, ImageCollection;
 
 const
@@ -54,6 +54,8 @@ type
 
   TStatusMessageKind = (smkStartEnd, smkNormal, smkWarning, smkError);
 
+  TMRUItemCompareProc = function(const S1, S2: String): Integer;
+
   TCompileForm = class(TUIStateForm)
     MainMenu1: TMainMenu;
     FMenu: TMenuItem;
@@ -82,7 +84,7 @@ type
     HDoc: TMenuItem;
     N6: TMenuItem;
     HAbout: TMenuItem;
-    FMRUSep: TMenuItem;
+    FMRUFilesSep: TMenuItem;
     VCompilerOutput: TMenuItem;
     FindDialog: TFindDialog;
     ReplaceDialog: TReplaceDialog;
@@ -177,7 +179,9 @@ type
     PListSelectAll: TMenuItem;
     DebugCallStackList: TListBox;
     VDebugCallStack: TMenuItem;
+    TInsertMsgBox: TMenuItem;
     ToolBarPanel: TPanel;
+    HMailingList: TMenuItem;
     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
     procedure FExitClick(Sender: TObject);
     procedure FOpenClick(Sender: TObject);
@@ -262,14 +266,17 @@ type
     procedure DebugCallStackListDrawItem(Control: TWinControl; Index: Integer; Rect: TRect;
       State: TOwnerDrawState);
     procedure VDebugCallStackClick(Sender: TObject);
+    procedure HMailingListClick(Sender: TObject);
+    procedure TInsertMsgBoxClick(Sender: TObject);
   private
     { Private declarations }
     FCompilerVersion: PCompilerVersionInfo;
     FFilename: String;
     FFileLastWriteTime: TFileTime;
     FSaveInUTF8Encoding: Boolean;
-    FMRUMenuItems: array[0..MRUListMaxCount-1] of TMenuItem;
-    FMRUList: TStringList;
+    FMRUFilesMenuItems: array[0..MRUListMaxCount-1] of TMenuItem;
+    FMRUFilesList: TStringList;
+    FMRUParametersList: TStringList;
     FOptions: record
       ShowStartupForm: Boolean;
       UseWizard: Boolean;
@@ -372,14 +379,19 @@ type
       Line: Integer);
     procedure MemoModifiedChange(Sender: TObject);
     procedure MemoUpdateUI(Sender: TObject);
-    procedure ModifyMRUList(const AFilename: String; const AddNewItem: Boolean);
+    procedure ModifyMRUList(const MRUList: TStringList; const Section, Ident: String;
+      const AItem: String; const AddNewItem: Boolean; CompareProc: TMRUItemCompareProc);
+    procedure ModifyMRUFilesList(const AFilename: String; const AddNewItem: Boolean);
+    procedure ModifyMRUParametersList(const AParameter: String; const AddNewItem: Boolean);
     procedure MoveCaret(const LineNumber: Integer; const AlwaysResetColumn: Boolean);
     procedure NewFile;
     procedure NewWizardFile;
     procedure OpenFile(AFilename: String; const AddToRecentDocs: Boolean);
     procedure OpenMRUFile(const AFilename: String);
     procedure ParseDebugInfo(DebugInfo: Pointer);
-    procedure ReadMRUList;
+    procedure ReadMRUList(const MRUList: TStringList; const Section, Ident: String);
+    procedure ReadMRUFilesList;
+    procedure ReadMRUParametersList;
     procedure ResetLineState;
     procedure StartProcess;
     function SaveFile(const SaveAs: Boolean): Boolean;
@@ -450,7 +462,7 @@ type
 
 var
   CompileForm: TCompileForm;
-
+  MSGTextInsert: TStringList;
   CommandLineFilename, CommandLineWizardName: String;
   CommandLineCompile: Boolean;
   CommandLineWizard: Boolean;
@@ -459,6 +471,8 @@ function GenerateGuid: String;
 function ISPPInstalled: Boolean;
 function ISCryptInstalled: Boolean;
 procedure InitFormFont(Form: TForm);
+procedure OpenDonateSite;
+procedure OpenMailingListSite;
 
 implementation
 
@@ -467,7 +481,7 @@ uses
   PathFunc, CmnFunc, CmnFunc2, FileClass, CompMsgs, TmSchema, BrowseFunc,
   HtmlHelpFunc, TaskbarProgressFunc,
   {$IFDEF STATICCOMPILER} Compile, {$ENDIF}
-  CompOptions, CompStartup, CompWizard, CompSignTools, CompTypes;
+  CompOptions, CompStartup, CompWizard, CompSignTools, CompTypes, CompInputQueryCombo, CompMessageBoxDesigner;
 
 {$R *.DFM}
 
@@ -959,13 +973,14 @@ begin
   Application.OnActivate := AppOnActivate;
   Application.OnIdle := AppOnIdle;
 
-  FMRUList := TStringList.Create;
-  for I := 0 to High(FMRUMenuItems) do begin
+  FMRUFilesList := TStringList.Create;
+  for I := 0 to High(FMRUFilesMenuItems) do begin
     NewItem := TMenuItem.Create(Self);
     NewItem.OnClick := FMRUClick;
-    FMenu.Insert(FMenu.IndexOf(FMRUSep), NewItem);
-    FMRUMenuItems[I] := NewItem;
+    FMenu.Insert(FMenu.IndexOf(FMRUFilesSep), NewItem);
+    FMRUFilesMenuItems[I] := NewItem;
   end;
+  FMRUParametersList := TStringList.Create;
 
   FSignTools := TStringList.Create;
 
@@ -1038,8 +1053,9 @@ begin
   FBreakPoints.Free;
   DestroyDebugInfo;
   FSignTools.Free;
-  FMRUList.Free;
- 
+  FMRUParametersList.Free;
+  FMRUFilesList.Free;
+
   inherited;
 end;
 
@@ -1255,7 +1271,7 @@ begin
   Memo.ClearUndo;
   FFilename := AFilename;
   UpdateCaption;
-  ModifyMRUList(AFilename, True);
+  ModifyMRUFilesList(AFilename, True);
   if AddToRecentDocs then
     AddFileToRecentDocs(AFilename);
 end;
@@ -1270,7 +1286,7 @@ begin
     Application.HandleException(Self);
     if MsgBoxFmt('There was an error opening the file. Remove it from the list?',
        [AFilename], SCompilerFormCaption, mbError, MB_YESNO) = IDYES then
-      ModifyMRUList(AFilename, False);
+      ModifyMRUFilesList(AFilename, False);
   end;
 end;
 
@@ -1366,7 +1382,7 @@ begin
   if not FOptions.UndoAfterSave then
     Memo.ClearUndo;
   Result := True;
-  ModifyMRUList(FFilename, True);
+  ModifyMRUFilesList(FFilename, True);
 end;
 
 function TCompileForm.ConfirmCloseFile(const PromptToSave: Boolean): Boolean;
@@ -1398,8 +1414,8 @@ begin
   end;
 end;
 
-procedure TCompileForm.ReadMRUList;
-{ Loads the list of MRU items from the registry }
+procedure TCompileForm.ReadMRUList(const MRUList: TStringList; const Section, Ident: String);
+{ Loads a list of MRU items from the registry }
 var
   Ini: TConfigIniFile;
   I: Integer;
@@ -1408,53 +1424,49 @@ begin
   try
     Ini := TConfigIniFile.Create;
     try
-      FMRUList.Clear;
-      for I := 0 to High(FMRUMenuItems) do begin
-        S := Ini.ReadString('ScriptFileHistoryNew', 'History' + IntToStr(I), '');
-        if S <> '' then FMRUList.Add(S);
+      MRUList.Clear;
+      for I := 0 to MRUListMaxCount-1 do begin
+        S := Ini.ReadString(Section, Ident + IntToStr(I), '');
+        if S <> '' then MRUList.Add(S);
       end;
     finally
       Ini.Free;
     end;
   except
-    { Ignore any exceptions; don't want to hold up the display of the
-      File menu. }
+    { Ignore any exceptions. }
   end;
 end;
 
-procedure TCompileForm.ModifyMRUList(const AFilename: String;
-  const AddNewItem: Boolean);
+procedure TCompileForm.ModifyMRUList(const MRUList: TStringList; const Section, Ident: String;
+  const AItem: String; const AddNewItem: Boolean; CompareProc: TMRUItemCompareProc);
 var
   I: Integer;
   Ini: TConfigIniFile;
   S: String;
 begin
   try
-    { Load most recent items first, just in case they've changed }
-    ReadMRUList;
-
     I := 0;
-    while I < FMRUList.Count do begin
-      if PathCompare(FMRUList[I], AFilename) = 0 then
-        FMRUList.Delete(I)
+    while I < MRUList.Count do begin
+      if CompareProc(MRUList[I], AItem) = 0 then
+        MRUList.Delete(I)
       else
         Inc(I);
     end;
     if AddNewItem then
-      FMRUList.Insert(0, AFilename);
-    while FMRUList.Count > High(FMRUMenuItems)+1 do
-      FMRUList.Delete(FMRUList.Count-1);
+      MRUList.Insert(0, AItem);
+    while MRUList.Count > MRUListMaxCount do
+      MRUList.Delete(MRUList.Count-1);
 
     { Save new MRU items }
     Ini := TConfigIniFile.Create;
     try
       { MRU list }
-      for I := 0 to High(FMRUMenuItems) do begin
-        if I < FMRUList.Count then
-          S := FMRUList[I]
+      for I := 0 to MRUListMaxCount-1 do begin
+        if I < MRUList.Count then
+          S := MRUList[I]
         else
           S := '';
-        Ini.WriteString('ScriptFileHistoryNew', 'History' + IntToStr(I), S);
+        Ini.WriteString(Section, Ident + IntToStr(I), S);
       end;
     finally
       Ini.Free;
@@ -1466,6 +1478,32 @@ begin
   end;
 end;
 
+procedure TCompileForm.ReadMRUFilesList;
+begin
+  ReadMRUList(FMRUFilesList, 'ScriptFileHistoryNew', 'History');
+end;
+
+procedure TCompileForm.ModifyMRUFilesList(const AFilename: String;
+  const AddNewItem: Boolean);
+begin
+  { Load most recent items first, just in case they've changed }
+  ReadMRUFilesList;
+  ModifyMRUList(FMRUFilesList, 'ScriptFileHistoryNew', 'History', AFileName, AddNewItem, @PathCompare);
+end;
+
+procedure TCompileForm.ReadMRUParametersList;
+begin
+  ReadMRUList(FMRUParametersList, 'ParameterHistory', 'History');
+end;
+
+procedure TCompileForm.ModifyMRUParametersList(const AParameter: String;
+  const AddNewItem: Boolean);
+begin
+  { Load most recent items first, just in case they've changed }
+  ReadMRUParametersList;
+  ModifyMRUList(FMRUParametersList, 'ParameterHistory', 'History', AParameter, AddNewItem, @CompareText);
+end;
+
 type
   TAddLinesPrefix = (alpNone, alpTimestamp, alpCountdown);
 
@@ -1919,13 +1957,13 @@ var
 begin
   FSaveEncodingAuto.Checked := not FSaveInUTF8Encoding;
   FSaveEncodingUTF8.Checked := FSaveInUTF8Encoding;
-  ReadMRUList;
-  FMRUSep.Visible := FMRUList.Count <> 0;
-  for I := 0 to High(FMRUMenuItems) do
-    with FMRUMenuItems[I] do begin
-      if I < FMRUList.Count then begin
+  ReadMRUFilesList;
+  FMRUFilesSep.Visible := FMRUFilesList.Count <> 0;
+  for I := 0 to High(FMRUFilesMenuItems) do
+    with FMRUFilesMenuItems[I] do begin
+      if I < FMRUFilesList.Count then begin
         Visible := True;
-        Caption := '&' + IntToStr((I+1) mod 10) + ' ' + DoubleAmp(FMRUList[I]);
+        Caption := '&' + IntToStr((I+1) mod 10) + ' ' + DoubleAmp(FMRUFilesList[I]);
       end
       else
         Visible := False;
@@ -1986,9 +2024,9 @@ var
   I: Integer;
 begin
   if ConfirmCloseFile(True) then
-    for I := 0 to High(FMRUMenuItems) do
-      if FMRUMenuItems[I] = Sender then begin
-        OpenMRUFile(FMRUList[I]);
+    for I := 0 to High(FMRUFilesMenuItems) do
+      if FMRUFilesMenuItems[I] = Sender then begin
+        OpenMRUFile(FMRUFilesList[I]);
         Break;
       end;
 end;
@@ -2257,10 +2295,21 @@ end;
 
 procedure TCompileForm.HWebsiteClick(Sender: TObject);
 begin
-  ShellExecute(Application.Handle, 'open', 'http://www.innosetup.com/', nil,
+  ShellExecute(Application.Handle, 'open', 'https://jrsoftware.org/isinfo.php', nil,
+    nil, SW_SHOW);
+end;
+
+procedure OpenMailingListSite;
+begin
+  ShellExecute(Application.Handle, 'open', 'https://jrsoftware.org/ismail.php', nil,
     nil, SW_SHOW);
 end;
 
+procedure TCompileForm.HMailingListClick(Sender: TObject);
+begin
+  OpenMailingListSite;
+end;
+
 procedure TCompileForm.HPSWebsiteClick(Sender: TObject);
 begin
   ShellExecute(Application.Handle, 'open', 'http://www.remobjects.com/ps', nil,
@@ -2273,12 +2322,17 @@ begin
     HtmlHelp(GetDesktopWindow, PChar(GetHelpFile + '::/hh_isppredirect.xhtm'), HH_DISPLAY_TOPIC, 0);
 end;
 
-procedure TCompileForm.HDonateClick(Sender: TObject);
+procedure OpenDonateSite;
 begin
-  ShellExecute(Application.Handle, 'open', 'http://www.jrsoftware.org/isdonate.php', nil,
+  ShellExecute(Application.Handle, 'open', 'https://jrsoftware.org/isdonate.php', nil,
     nil, SW_SHOW);
 end;
 
+procedure TCompileForm.HDonateClick(Sender: TObject);
+begin
+  OpenDonateSite;
+end;
+
 procedure TCompileForm.HAboutClick(Sender: TObject);
 var
   S: String;
@@ -2295,9 +2349,9 @@ begin
     'Portions Copyright (C) 2000-2020 Martijn Laan' + SNewLine +
     'All rights reserved.' + SNewLine2 +
     'Inno Setup home page:' + SNewLine +
-    'http://www.innosetup.com/' + SNewLine2 +
+    'https://www.innosetup.com/' + SNewLine2 +
     'RemObjects Pascal Script home page:' + SNewLine +
-    'http://www.remobjects.com/ps' + SNewLine2 +
+    'https://www.remobjects.com/ps' + SNewLine2 +
     'Refer to LICENSE.TXT for conditions of distribution and use.');
   MsgBox(S, 'About ' + FCompilerVersion.Title, mbInformation, MB_OK);
 end;
@@ -2344,10 +2398,10 @@ procedure TCompileForm.WMStartNormally(var Message: TMessage);
     StartupForm: TStartupForm;
     Ini: TConfigIniFile;
   begin
-    ReadMRUList;
+    ReadMRUFilesList;
     StartupForm := TStartupForm.Create(Application);
     try
-      StartupForm.MRUList := FMRUList;
+      StartupForm.MRUFilesList := FMRUFilesList;
       StartupForm.StartupCheck.Checked := not FOptions.ShowStartupForm;
       if StartupForm.ShowModal = mrOK then begin
         if FOptions.ShowStartupForm <> not StartupForm.StartupCheck.Checked then begin
@@ -2582,6 +2636,21 @@ begin
     Memo.SelText := GenerateGuid;
 end;
 
+procedure TCompileForm.TInsertMsgBoxClick(Sender: TObject);
+var
+  MsgBoxForm: TMBDForm;
+begin
+  MsgBoxForm := TMBDForm.Create(Application);
+  MSGTextInsert := TStringList.Create;
+  try
+    if MsgBoxForm.ShowModal = mrOk then
+      Memo.SelText := MSGTextInsert.GetText;
+  finally
+    MSGTextInsert.Free;
+    MsgBoxForm.Free;
+  end;
+end;
+
 procedure TCompileForm.TSignToolsClick(Sender: TObject);
 var
   SignToolsForm: TSignToolsForm;
@@ -3617,10 +3686,22 @@ begin
 end;
 
 procedure TCompileForm.UpdateTheme;
+
+  procedure SetControlTheme(const WinControl: TWinControl);
+  begin
+    if UseThemes then begin
+      if FTheme.Dark then
+        SetWindowTheme(WinControl.Handle, 'DarkMode_Explorer', nil)
+      else
+        SetWindowTheme(WinControl.Handle, nil, nil);
+    end;
+  end;
+
 begin
   FTheme.Typ := FOptions.ThemeType;
   Memo.UpdateThemeColors;
   Memo.UpdateStyleAttributes;
+  SetControlTheme(Memo);
   ToolBarPanel.ParentBackground := False;
   ToolBarPanel.Color := FTheme.Colors[tcToolBack];
   if FTheme.Dark then
@@ -3630,15 +3711,22 @@ begin
   Bevel1.Visible := FTheme.Colors[tcMarginBack] = ToolBarPanel.Color;
   SplitPanel.ParentBackground := False;
   SplitPanel.Color := FTheme.Colors[tcSplitterBack];
+  if FTheme.Dark then
+    TabSet.Theme := FTheme
+  else
+    TabSet.Theme := nil;
   CompilerOutputList.Font.Color := FTheme.Colors[tcFore];
   CompilerOutputList.Color := FTheme.Colors[tcBack];
   CompilerOutputList.Invalidate;
+  SetControlTheme(CompilerOutputList);
   DebugOutputList.Font.Color := FTheme.Colors[tcFore];
   DebugOutputList.Color := FTheme.Colors[tcBack];
   DebugOutputList.Invalidate;
+  SetControlTheme(DebugOutputList);
   DebugCallStackList.Font.Color := FTheme.Colors[tcFore];
   DebugCallStackList.Color := FTheme.Colors[tcBack];
   DebugCallStackList.Invalidate;
+  SetControlTheme(DebugCallStackList);
 end;
 
 procedure TCompileForm.UpdateThemeData(const Close, Open: Boolean);
@@ -3819,8 +3907,11 @@ end;
 
 procedure TCompileForm.RParametersClick(Sender: TObject);
 begin
-  InputQuery('Run Parameters', 'Command line parameters for ' + DebugTargetStrings[dtSetup] +
-    ' and ' + DebugTargetStrings[dtUninstall] + ':', FRunParameters);
+  ReadMRUParametersList;
+  InputQueryCombo('Run Parameters', 'Command line parameters for ' + DebugTargetStrings[dtSetup] +
+    ' and ' + DebugTargetStrings[dtUninstall] + ':', FRunParameters, FMRUParametersList);
+  if FRunParameters <> '' then
+    ModifyMRUParametersList(FRunParameters, True);
 end;
 
 procedure TCompileForm.RPauseClick(Sender: TObject);

+ 62 - 0
Projects/CompInputQueryCombo.dfm

@@ -0,0 +1,62 @@
+object InputQueryCombo: TInputQueryCombo
+  Left = 330
+  Top = 188
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsDialog
+  Caption = '...'
+  ClientHeight = 73
+  ClientWidth = 582
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'MS Sans Serif'
+  Font.Style = []
+  OldCreateOrder = True
+  Position = poScreenCenter
+  OnCreate = FormCreate
+  DesignSize = (
+    582
+    73)
+  PixelsPerInch = 96
+  TextHeight = 13
+  object PromptLabel: TLabel
+    Left = 8
+    Top = 11
+    Width = 265
+    Height = 13
+    AutoSize = False
+    Caption = '...'
+    FocusControl = ValueComboBox
+  end
+  object OKButton: TButton
+    Left = 421
+    Top = 43
+    Width = 73
+    Height = 23
+    Anchors = [akRight, akBottom]
+    Caption = 'OK'
+    Default = True
+    ModalResult = 1
+    TabOrder = 0
+  end
+  object CancelButton: TButton
+    Left = 501
+    Top = 43
+    Width = 73
+    Height = 23
+    Anchors = [akRight, akBottom]
+    Cancel = True
+    Caption = 'Cancel'
+    ModalResult = 2
+    TabOrder = 1
+  end
+  object ValueComboBox: TComboBox
+    Left = 279
+    Top = 8
+    Width = 295
+    Height = 21
+    Anchors = [akLeft, akTop, akRight]
+    TabOrder = 2
+  end
+end

+ 86 - 0
Projects/CompInputQueryCombo.pas

@@ -0,0 +1,86 @@
+unit CompInputQueryCombo;
+
+{
+  Inno Setup
+  Copyright (C) 1997-2020 Jordan Russell
+  Portions by Martijn Laan
+  For conditions of distribution and use, see LICENSE.TXT.
+
+  InputQuery with a TComboBox instead of a TEdit
+}
+
+interface
+
+uses
+  Classes, Controls, StdCtrls, UIStateForm;
+
+type
+  TInputQueryCombo = class(TUIStateForm)
+    OKButton: TButton;
+    CancelButton: TButton;
+    PromptLabel: TLabel;
+    ValueComboBox: TComboBox;
+    procedure FormCreate(Sender: TObject);
+  private
+    function GetValue: String;
+    procedure SetPrompt(const APrompt: String);
+    procedure SetValue(const AValue: String);
+    procedure SetValues(const AValues: TStringList);
+  public
+    property Prompt: String write SetPrompt;
+    property Value: String read GetValue write SetValue;
+    property Values: TStringList write SetValues;
+  end;
+
+function InputQueryCombo(const ACaption, APrompt: String; var AValue: String; const AValues: TStringList): Boolean;
+
+implementation
+
+uses
+  Windows, Messages, CompForm, Forms;
+
+{$R *.DFM}
+
+function InputQueryCombo(const ACaption, APrompt: String; var AValue: String; const AValues: TStringList): Boolean;
+begin
+  with TInputQueryCombo.Create(Application) do try
+    Caption := ACaption;
+    Prompt := APrompt;
+    Value := AValue;
+    Values := AValues;
+    if ShowModal = mrOk then begin
+      AValue := Value;
+      Result := True;
+    end else
+      Result := False;
+  finally
+    Free;
+  end;
+end;
+
+procedure TInputQueryCombo.FormCreate(Sender: TObject);
+begin
+  InitFormFont(Self);
+end;
+
+function TInputQueryCombo.GetValue: String;
+begin
+  Result := ValueComboBox.Text;
+end;
+
+procedure TInputQueryCombo.SetPrompt(const APrompt: String);
+begin
+  PromptLabel.Caption := APrompt;
+end;
+
+procedure TInputQueryCombo.SetValue(const AValue: String);
+begin
+  ValueComboBox.Text := AValue;
+end;
+
+procedure TInputQueryCombo.SetValues(const AValues: TStringList);
+begin
+  ValueComboBox.Items := AValues;
+end;
+
+end.

+ 725 - 0
Projects/CompMessageBoxDesigner.dfm

@@ -0,0 +1,725 @@
+object MBDForm: TMBDForm
+  Left = 0
+  Top = 0
+  BorderStyle = bsDialog
+  Caption = 'MessageBox Designer'
+  ClientHeight = 380
+  ClientWidth = 548
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'MS Sans Serif'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poScreenCenter
+  OnCreate = FormCreate
+  DesignSize = (
+    548
+    380)
+  PixelsPerInch = 96
+  TextHeight = 13
+  object TaskInstructionLabel: TNewStaticText
+    Left = 18
+    Top = 14
+    Width = 50
+    Height = 14
+    Caption = 'Instruction'
+    TabOrder = 11
+  end
+  object TaskInstructionText: TEdit
+    Left = 89
+    Top = 10
+    Width = 449
+    Height = 21
+    Anchors = [akLeft, akTop, akRight]
+    TabOrder = 1
+  end
+  object TaskMesssageLabel: TNewStaticText
+    Left = 18
+    Top = 40
+    Width = 49
+    Height = 14
+    Caption = 'Messsage'
+    TabOrder = 12
+  end
+  object TaskMesssageText: TEdit
+    Left = 89
+    Top = 36
+    Width = 449
+    Height = 21
+    Anchors = [akLeft, akTop, akRight]
+    TabOrder = 2
+  end
+  object Button1Label: TNewStaticText
+    Left = 18
+    Top = 66
+    Width = 62
+    Height = 14
+    Caption = 'Text Button1'
+    TabOrder = 13
+  end
+  object Button1Text: TEdit
+    Left = 89
+    Top = 62
+    Width = 159
+    Height = 21
+    TabOrder = 3
+  end
+  object Button2Label: TNewStaticText
+    Left = 258
+    Top = 67
+    Width = 62
+    Height = 14
+    Caption = 'Text Button2'
+    TabOrder = 14
+  end
+  object Button2Text: TEdit
+    Left = 334
+    Top = 62
+    Width = 204
+    Height = 21
+    Anchors = [akLeft, akTop, akRight]
+    TabOrder = 4
+  end
+  object GroupBox1: TGroupBox
+    Left = 8
+    Top = 8
+    Width = 532
+    Height = 81
+    Anchors = [akLeft, akTop, akRight]
+    Caption = ' Message '
+    TabOrder = 0
+    DesignSize = (
+      532
+      81)
+    object MSGText: TMemo
+      Left = 7
+      Top = 20
+      Width = 519
+      Height = 53
+      Anchors = [akLeft, akTop, akRight, akBottom]
+      ScrollBars = ssVertical
+      TabOrder = 0
+      OnKeyPress = MSGTextKeyPress
+    end
+  end
+  object GroupBox6: TGroupBox
+    Left = 8
+    Top = 93
+    Width = 240
+    Height = 60
+    Caption = ' Type'
+    TabOrder = 5
+    object cb_Suppressible: TCheckBox
+      Left = 14
+      Top = 24
+      Width = 86
+      Height = 17
+      Caption = 'Suppressible'
+      TabOrder = 0
+      OnClick = cb_SuppressibleClick
+    end
+    object cb_MsgBox: TRadioButton
+      Left = 115
+      Top = 13
+      Width = 115
+      Height = 17
+      Caption = 'MsgBox'
+      Checked = True
+      TabOrder = 1
+      TabStop = True
+      OnClick = cb_MsgBoxClick
+    end
+    object cb_TaskDialogMsgBox: TRadioButton
+      Left = 115
+      Top = 36
+      Width = 115
+      Height = 17
+      Caption = 'TaskDialogMsgBox'
+      TabOrder = 2
+      TabStop = True
+      OnClick = cb_TaskDialogMsgBoxClick
+    end
+  end
+  object GroupBox5: TGroupBox
+    Left = 258
+    Top = 93
+    Width = 282
+    Height = 60
+    Anchors = [akLeft, akTop, akRight]
+    Caption = ' Flags '
+    TabOrder = 6
+    object NewStaticText1: TNewStaticText
+      Left = 14
+      Top = 26
+      Width = 68
+      Height = 14
+      Caption = 'Default button'
+      TabOrder = 3
+    end
+    object NewEdit1: TEdit
+      Left = 97
+      Top = 22
+      Width = 21
+      Height = 21
+      Alignment = taRightJustify
+      NumbersOnly = True
+      ReadOnly = True
+      TabOrder = 0
+      Text = '1'
+    end
+    object UpDown1: TUpDown
+      Left = 118
+      Top = 22
+      Width = 16
+      Height = 21
+      Associate = NewEdit1
+      Min = 1
+      Max = 3
+      Position = 1
+      TabOrder = 1
+      OnChanging = UpDown1Changing
+    end
+    object cb_MB_SETFOREGROUND: TCheckBox
+      Left = 140
+      Top = 24
+      Width = 135
+      Height = 17
+      Caption = 'MB_SETFOREGROUND'
+      TabOrder = 2
+    end
+  end
+  object GroupBox2: TGroupBox
+    Left = 8
+    Top = 157
+    Width = 160
+    Height = 174
+    Anchors = [akLeft, akTop, akBottom]
+    Caption = ' Icon '
+    TabOrder = 7
+    DesignSize = (
+      160
+      174)
+    object IMGmbInformation: TImage
+      Left = 10
+      Top = 23
+      Width = 32
+      Height = 32
+      AutoSize = True
+      Picture.Data = {
+        0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000
+        00200806000000737A7AF4000003A54944415478DAC5974D4F134118C767BBED
+        F62DC105696340494B4810D0848331DCA0A8C1C4C4183D889E163F01C40F60FC
+        00A67E02DA937A32440FC6042DE8CD48E2453829B5221A0A02625FB6A55D9F67
+        B6BBDD6D77BB03419D64E86CBBECEFBFCFFF99676638F29F1BC77A63E0E25D11
+        3EAE411F851E813ED670CB02F434F445E873F9F9073B4722A0068E23BCEA6B17
+        2B6DDDA41A0C131813C5E5511F52291157719BB87259C2EFADC17807E173D067
+        9C84700EF069F8B8B7DF1E15CBE1B344F104D41F14E35D8AF91AC65CF937F164
+        3F12F76E1AE1F741C4C30309D0DE5A118252E9E408A904C275AA03DCF8050F11
+        11BEBF0341B9A45D34381B780A423C2CF78E43988543C1B521DAE3CD2C1097BC
+        F3012E638D22AC0424002E39C1F9DC06F51C5B35108228859AE09A48AE5AD644
+        2441C094AD00F41CC21E2FF65D767C73F4B8F448A2DF08B713A4DC396409D741
+        1009DF9779B463C698139C018EA15F957B2F882C9E5B0AB0811345BDE00B59E2
+        FDBA881644352B8C021290ED52A97B84C9736A417EA366419854FCA19670AD09
+        3FDE13F7AFB46E05677CFB42FF559175AAF17983007FB89603ADE1EA14CD117F
+        FA851E054D8004899728F64D30C1F18F67132D50F349B885160C3AC2B5812FF3
+        0A13720A042435018972F88C049D79AA3509383EC804A7FFBBB5423C3F97A90D
+        9A80941C1D1F5393CF194E1F8249F8D84280039CDA87C9F8EDCD020888690294
+        C2C00DBDB6B314191A8146010C706C5817FC9F9F1110C0E902F24393CC70DD02
+        A3808E0126B816A5C0A7A75602D8E06A122ED7054CCE36E4406B3865360A289C
+        BE6EB0A0359C5AB0652380014E2D587D6E12909223B17A123AC0A905560218E0
+        D8F8C226F1AE9B9330510EC1340C0D31C1F51C7872A72EA06390094EA3B7BD82
+        DD340DA1108989627482098E0FA4116812E00CC7E65B834254DA351522B514F7
+        5D81521C7484EB1698040C30C1B97D28C59997E652ACD9B07F2C2295BACE3BC2
+        6D0538C071206497887B2F635E8C8C51907B6222CBC262127073D65C076CE07C
+        1193EFADF5725C13310D16C48B914B0D53B2B9C2412DB7166003C7A9E75B7B0D
+        16E4AD3724462BAA5E51927BC6541136E5952FE072BC49C7557FA7BA1F680187
+        37C7C46BBD253358910211C3F2A9518BE2641830786E80B36D4A0D22E2608754
+        3A71AEF6760787A3E7C2C612863D4958B7E50D42D483495B44448F2D774B3653
+        0D8B0D64FBE10E2656D1207834F38A6225D8453D87315138B7FA1008B34BDE25
+        2E58E7F9DC3A86FB688E661642FEFDE1F46FB73FA626C73F4C6061F500000000
+        49454E44AE426082}
+    end
+    object IMGmbConfirmation: TImage
+      Left = 10
+      Top = 60
+      Width = 32
+      Height = 32
+      AutoSize = True
+      Picture.Data = {
+        0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000
+        00200806000000737A7AF4000004DF4944415478DAC5576D6C5355187E6FEF6E
+        BF966C774A5BB28DD18D05990CB798612689FB0205E38246493031C68E9825FE
+        6341C5F8430331F84170FB4316FDD3256A42FC4118981817B0ED16FDE120D990
+        0F11EBC61873B485756EEB6D6FD7D6F79CBB76F7B6F7B67704F524273DF7F4E4
+        3CCF799FE7BCE71C06FEE7C2E81D68DD7588C79F97B0B66275626DCB1AE2C53A
+        89D587F54CE4FC89F04321B002DC4BC093E6323E515201C9623B601B52064E9A
+        242182213A0786A520B00BD3D80E13F033587B0A11610A801FC49F0F97CBAAF9
+        B87D1BA438ABF4474A3E2AA5FCC636135F042E78158AE62709F81124D1B72602
+        E955A78CC52EB1B2191256FB2A6A017079078B1131FEF50B125A1AD08A06A301
+        EEC11037C66A3A30CC464D708310062629D2FEA499CF48221F4BE4314D79C110
+        0B8FE1677B360935026E04776981E36A800B5C811A6B045AEAAB60E3FA32DA7F
+        F98F19181C0B80E86884A48957448849C6D324069040972601A23986BD375ABB
+        47159C186D3B7B038E773F0FCF346CCA91EED6DD39D87FF41B188D6F4612A58A
+        889148986F9D270BE8917B82918113DA13B19A9DBC96E6ECD25D38DAC2C1FBAF
+        3F07F38B020C5FF6C3AFFE19E8DC510F4F6C2AA76348FF96037D306BEF90C921
+        4DC20A4130DDF61109AAD352C809B8D1ED2EB1A2595373762940096C43B0EEBE
+        EF2064AC84146E4776E10EB89A4AE18B77F6D391EFF60FC2E7A32C9AD796014F
+        17E3EC4528FA7B322305235FBDF0D85E3EDF56632301D82C8C833F5A0262F953
+        8ABF8D8131183DD649233132EE879D9F0C43FC913AA54629C94396C9EF335148
+        1370A1F1DCD1DADD9AE092040160C31339E0A470A1AB70E1BD16EA0D4AE0631F
+        C41F7D3C671C6998A72E104376218181340177DC5EEFC29A779F1323A96D3569
+        522FFCF665376C7494C1B1AF86E0034F0C12165BCE384AF6DE75E0EE5FA332A4
+        097862D51D6D92F9D4C1B3938C7C52CC78D0F3B4193E7BEB45DA53F7C671B861
+        6D96C8668153298919EF0C7B91407B9A404AA87B45B6BA3580DFBF09071AB98C
+        014F9E1E819E6F6F4AE15701A791C4BC60F9F32C2001264320B2F5D5358373A1
+        6BD0F5A43503FEF5D04578B37F1862E53B34C1A5760AACFED36A04F483933CBF
+        6F43084E1D7129C045C776652455C02966360161CBCB2A065307A7DB6E76147E
+        3FF91A35DDB99FAFC0BE135E10D737155C79468289730A029E98B37DD58405C0
+        4931DFF682307898B6F7BCDD0F438BF5BA564E0A2B84C034A334A13B6EC36D68
+        DBAA0B3C9B80A5F3238856EDD2054EFAB9B9EBA42AB6212622DE1DADDEAD0B9C
+        4CE8B8F713CC9E3A2411D8FB29442B5B758153F2D39888C4794522925271ED0B
+        988A8B0B824B93F832FD494CDFA2A3491738B38CA978EA07652A4ECBB05CEA74
+        D1345B009C1463709CDCFD240278F48AB68682E0A4610C5E82A28529E561248F
+        42ACAA9DA7A7581E70C9033E10CE1E5E95A0A2A520381B25E61B513F8E57481C
+        44097AA3CE67B3B6A4129C4C4A245025A0014EB69E79FA479420A27E21914B81
+        572A57ACAA6D2597E7824B128CE18936BF2AC1BA86BCE0B87262BCFC57329914
+        1E24D118DBD0AA79FA29BF410FB8BE4BA98C442FCAE122D98D1EAB0F004E3437
+        062E91B00F80DE6B791611E96152E2E4C9ED46F5B6A4B1D548B241B73FD8C344
+        2D1A409E66269E4F149743D2B28E5EBD534C9134098699F8C180E73CBB3443C2
+        FD709E662A44FEFBC7E9BF5DFE01E32FFB3F42F099B90000000049454E44AE42
+        6082}
+    end
+    object IMGmbError: TImage
+      Left = 10
+      Top = 97
+      Width = 32
+      Height = 32
+      AutoSize = True
+      Picture.Data = {
+        0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000
+        00200806000000737A7AF40000033A4944415478DAD597DD4E135110C7678556
+        935E5883B12636E982893591160D91822602811B4D84F5014CE0D23B7D02F109
+        F4CE4B487C001645A2494D8BC634944F294DFC82564193E2572536428BA933BB
+        3DBBDDEE6E778950E2C92673F69493FF6FE6CCF967E1609F07F7DF023CB80103
+        18864BAF83D7EFC348CD00509CC7900A0679E97D71314DA11121D2B5021876B9
+        0E0D08423B40B108E2D814E4729B230830B8E70028DE8521D2D9D90CDE130DD2
+        DADADA57987C9EA469374244F71A20E2F1B8BB7A7B5A34EBE167AF2093C94611
+        A07BCF0058F6BDBD2DE039E6D6FC86E212C44EABB0538094D77B94EFBC7446FF
+        23F6C2E48B241EC7B7340234EE3A00BB76427F08B00175E234B011417C18A7A9
+        ED6B690B00C5A9DEA9D37EAFBBB5F5A4BCB16E53235EFC2343CDCE2DC3EB379F
+        B2205FCBEC6E010C399DF5B7FBFB42805101E02E4CC9E22FDB14807C7E1BC61E
+        C529DE4180A17F0660D90703BC3B10F0A91B0FFC06EE625C074015492C7D84C5
+        A50FB6AA600740329D2B975B95EC4944AA402540E938F2856D9878326FCB9C38
+        0B719EB2EF68F74353D371455C39827280ED839ABD2BA90CC4A6DE025858B415
+        C028662F50E7978B5B0314A5471C9FA12A8808706DC7003AD32913AF0E208BD3
+        C8ACFF84702441535373AA06A05A6E85B839802ACE06012088A9451B0230D3A1
+        C63BE27619974E07E0D489D3F891FD05134F17686A684E6600296C3ABE2374CA
+        B83C740BEAB7B40005A7D11F4A4F2CFE0E56D2EB8616AD0340F19B18EE0A7D6D
+        7ACB2D894B1B2D01D4E3C8E5B6407C3C43D35B0871CF1440351D9F3BD0EC3315
+        B706D0F7422289E6945CD5995325806CB957DB54D33110AF0E5034EC857CA100
+        63E37364521A8BE6CAC4790CF386D9EB6E01F5405EBB2201188BB3C544729555
+        E11C33A77200F93B0FCFDE4A9C1ECE5109E0A82ACE8238314B3DA1583457123F
+        4BD94B96DBE8B114973622807A04E7A198775A8AD3C0DB00B1E9F750AAC20203
+        88A0DBA1E9046D89DB03D08BB397703409992F1B9239718AE5F690E51EB625CE
+        00CA17B500E6E214501CC293F25734018C62F68292BD0D71CBF52AE26C100082
+        880410F17A1BBA3A427E703AEA6A224EDF0BB1E96558FBFC3D4A0002AE8D42ED
+        075DC7C17DFFEFF82F44FFE05EBAD2EA730000000049454E44AE426082}
+    end
+    object IMGmbCriticalError: TImage
+      Left = 10
+      Top = 135
+      Width = 32
+      Height = 32
+      AutoSize = True
+      Picture.Data = {
+        0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000
+        00200806000000737A7AF40000022B4944415478DACD97312C035118C7BFD75E
+        A5AAD14B6B301818DA49824D24A235582C62B5B4BB049B8930D990D8AF8B552C
+        16835624624362626030185468AA15DA9EEF6BEE5D9E7375774D79BEE4E5AECD
+        DDFBFFEEFB7FEFBB770C2407737BE16E22A6E26106C7048E7E1C49CB25791C77
+        388E71ECCF5D179EDB0260086F9278B7C2D4DE0E06D100033C878071F7870E50
+        ACEAF084270FEF3A9D93F83E8E252710E620BE8887D5BEA04F4D847CD0E97397
+        AD4A1DE0BA5C87FBB73A89AF21C4962700FED49D7E961E0AFB201670EDD49728
+        60462E4B75A8D4F46CB36C7C9BD910CF618A8747237E6851DB0CB2E7ECA546B6
+        5CE0CF9415C20E4043F1743BC46D20B20890690A409E63DA37C7D5F6898B1027
+        CF35B26349AC0953C648FD2D3EB92A7ACEC211086D68F0B6BD02B59B2B5762FE
+        F8200417D6A1BC9C01BDF462FE4F358199200B06B815228086D5DE283A31BA76
+        F6401919C3898AF03A3FEB0841E2740F0B7743F5FCB4718F185494B83A4C2B98
+        F8F4935145B52E357142270837D7D2123D7AAA9A59E000692C3C8DBC6F75622F
+        A0540B58901904C872000D1B4D3A1E6ADE697E12F0224E71834D0A1B55C3060E
+        90C3E24B3A351C3B215E276EC5298C62CC23408A03E85331C5D5D2B342340AC9
+        8338052DC9C3421510809900D33D8AB3BA0D048517711E078FFF0D40B605D28B
+        50FA3294DE88E4B6626E83B49791980569AF630342DE8644B442DA964CB042DE
+        A6548090B32DB780C8F930B1CB06C8F834B301F9FB8FD3DF8E4F1B53543FEFB0
+        D5E80000000049454E44AE426082}
+    end
+    object rb_mbInformation: TRadioButton
+      Left = 53
+      Top = 31
+      Width = 99
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'mbInformation'
+      Checked = True
+      TabOrder = 0
+      TabStop = True
+    end
+    object rb_mbConfirmation: TRadioButton
+      Left = 53
+      Top = 68
+      Width = 99
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'mbConfirmation'
+      TabOrder = 1
+      TabStop = True
+    end
+    object rb_mbError: TRadioButton
+      Left = 53
+      Top = 105
+      Width = 99
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'mbError'
+      TabOrder = 2
+      TabStop = True
+    end
+    object rb_mbCriticalError: TRadioButton
+      Left = 53
+      Top = 142
+      Width = 99
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'mbCriticalError'
+      TabOrder = 3
+      TabStop = True
+    end
+  end
+  object GroupBox3: TGroupBox
+    Left = 179
+    Top = 157
+    Width = 169
+    Height = 174
+    Anchors = [akLeft, akTop, akBottom]
+    Caption = ' Buttons '
+    TabOrder = 8
+    DesignSize = (
+      169
+      174)
+    object rbMB_OK: TRadioButton
+      Left = 14
+      Top = 23
+      Width = 147
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'MB_OK'
+      Checked = True
+      TabOrder = 0
+      TabStop = True
+      OnClick = rbMB_OKClick
+    end
+    object rbMB_OKCANCEL: TRadioButton
+      Left = 14
+      Top = 46
+      Width = 147
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'MB_OKCANCEL'
+      TabOrder = 1
+      TabStop = True
+      OnClick = rbMB_OKCANCELClick
+    end
+    object rbMB_YESNO: TRadioButton
+      Left = 14
+      Top = 70
+      Width = 147
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'MB_YESNO'
+      TabOrder = 2
+      TabStop = True
+      OnClick = rbMB_YESNOClick
+    end
+    object rbMB_YESNOCANCEL: TRadioButton
+      Left = 14
+      Top = 94
+      Width = 147
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'MB_YESNOCANCEL'
+      TabOrder = 3
+      TabStop = True
+      OnClick = rbMB_YESNOCANCELClick
+    end
+    object rbMB_RETRYCANCEL: TRadioButton
+      Left = 14
+      Top = 118
+      Width = 147
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'MB_RETRYCANCEL'
+      TabOrder = 4
+      TabStop = True
+      OnClick = rbMB_RETRYCANCELClick
+    end
+    object rbMB_ABORTRETRYIGNORE: TRadioButton
+      Left = 14
+      Top = 142
+      Width = 147
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'MB_ABORTRETRYIGNORE'
+      TabOrder = 5
+      TabStop = True
+      OnClick = rbMB_ABORTRETRYIGNOREClick
+    end
+  end
+  object GroupBox4: TGroupBox
+    Left = 359
+    Top = 157
+    Width = 181
+    Height = 174
+    Anchors = [akLeft, akTop, akBottom]
+    Caption = ' Return values '
+    TabOrder = 9
+    object cb_IDOK: TCheckBox
+      Left = 16
+      Top = 23
+      Width = 80
+      Height = 17
+      Caption = 'IDOK'
+      TabOrder = 0
+    end
+    object cb_IDCANCEL: TCheckBox
+      Left = 16
+      Top = 42
+      Width = 80
+      Height = 17
+      Caption = 'IDCANCEL'
+      TabOrder = 1
+    end
+    object cb_IDYES: TCheckBox
+      Left = 16
+      Top = 62
+      Width = 80
+      Height = 17
+      Caption = 'IDYES'
+      TabOrder = 2
+    end
+    object cb_IDNO: TCheckBox
+      Left = 16
+      Top = 82
+      Width = 80
+      Height = 17
+      Caption = 'IDNO'
+      TabOrder = 3
+    end
+    object cb_IDABORT: TCheckBox
+      Left = 16
+      Top = 102
+      Width = 80
+      Height = 17
+      Caption = 'IDABORT'
+      TabOrder = 4
+    end
+    object cb_IDRETRY: TCheckBox
+      Left = 16
+      Top = 122
+      Width = 80
+      Height = 17
+      Caption = 'IDRETRY'
+      TabOrder = 5
+    end
+    object cb_IDIGNORE: TCheckBox
+      Left = 16
+      Top = 142
+      Width = 80
+      Height = 17
+      Caption = 'IDIGNORE'
+      TabOrder = 6
+    end
+    object rb_IDOK: TCheckBox
+      Left = 100
+      Top = 23
+      Width = 16
+      Height = 17
+      TabOrder = 7
+      Visible = False
+      OnClick = rb_IDOKClick
+    end
+    object rb_IDCANCEL: TCheckBox
+      Left = 100
+      Top = 42
+      Width = 16
+      Height = 17
+      TabOrder = 8
+      Visible = False
+      OnClick = rb_IDCANCELClick
+    end
+    object rb_IDYES: TCheckBox
+      Left = 100
+      Top = 62
+      Width = 16
+      Height = 17
+      TabOrder = 9
+      Visible = False
+      OnClick = rb_IDYESClick
+    end
+    object rb_IDNO: TCheckBox
+      Left = 100
+      Top = 82
+      Width = 16
+      Height = 17
+      TabOrder = 10
+      Visible = False
+      OnClick = rb_IDNOClick
+    end
+    object rb_IDABORT: TCheckBox
+      Left = 100
+      Top = 102
+      Width = 16
+      Height = 17
+      TabOrder = 11
+      Visible = False
+      OnClick = rb_IDABORTClick
+    end
+    object rb_IDRETRY: TCheckBox
+      Left = 100
+      Top = 122
+      Width = 16
+      Height = 17
+      TabOrder = 12
+      Visible = False
+      OnClick = rb_IDRETRYClick
+    end
+    object rb_IDIGNORE: TCheckBox
+      Left = 100
+      Top = 142
+      Width = 16
+      Height = 17
+      TabOrder = 13
+      Visible = False
+      OnClick = rb_IDIGNOREClick
+    end
+    object cb_DefIDOK: TRadioButton
+      Left = 147
+      Top = 23
+      Width = 17
+      Height = 17
+      TabOrder = 14
+      TabStop = True
+      Visible = False
+    end
+    object cb_DefIDCANCEL: TRadioButton
+      Left = 147
+      Top = 42
+      Width = 17
+      Height = 17
+      TabOrder = 15
+      TabStop = True
+      Visible = False
+    end
+    object cb_DefIDYES: TRadioButton
+      Left = 147
+      Top = 62
+      Width = 17
+      Height = 17
+      TabOrder = 16
+      TabStop = True
+      Visible = False
+    end
+    object cb_DefIDNO: TRadioButton
+      Left = 147
+      Top = 82
+      Width = 17
+      Height = 17
+      TabOrder = 17
+      TabStop = True
+      Visible = False
+    end
+    object cb_DefIDABORT: TRadioButton
+      Left = 147
+      Top = 102
+      Width = 17
+      Height = 17
+      TabOrder = 18
+      TabStop = True
+      Visible = False
+    end
+    object cb_DefIDRETRY: TRadioButton
+      Left = 147
+      Top = 122
+      Width = 17
+      Height = 17
+      TabOrder = 19
+      TabStop = True
+      Visible = False
+    end
+    object cb_DefIDIGNORE: TRadioButton
+      Left = 147
+      Top = 142
+      Width = 17
+      Height = 17
+      TabOrder = 20
+      TabStop = True
+      Visible = False
+    end
+  end
+  object Panel1: TPanel
+    Left = 0
+    Top = 338
+    Width = 548
+    Height = 42
+    Align = alBottom
+    BevelOuter = bvNone
+    TabOrder = 10
+    DesignSize = (
+      548
+      42)
+    object Bevel1: TBevel
+      Left = 0
+      Top = 0
+      Width = 548
+      Height = 3
+      Align = alTop
+      Shape = bsBottomLine
+      ExplicitLeft = 168
+      ExplicitWidth = 50
+    end
+    object MBDButtonPreview: TButton
+      Left = 10
+      Top = 11
+      Width = 80
+      Height = 25
+      Anchors = [akLeft, akBottom]
+      Caption = '&Preview'
+      TabOrder = 0
+      OnClick = MBDButtonPreviewClick
+    end
+    object MBDButtonOK: TButton
+      Left = 379
+      Top = 11
+      Width = 75
+      Height = 25
+      Anchors = [akRight, akBottom]
+      Caption = 'OK'
+      Default = True
+      ModalResult = 1
+      TabOrder = 1
+      OnClick = MBDButtonOKClick
+    end
+    object MBDButtonCancel: TButton
+      Left = 463
+      Top = 11
+      Width = 75
+      Height = 25
+      Anchors = [akRight, akBottom]
+      Cancel = True
+      Caption = 'Cancel'
+      ModalResult = 2
+      TabOrder = 2
+    end
+  end
+end

+ 1259 - 0
Projects/CompMessageBoxDesigner.pas

@@ -0,0 +1,1259 @@
+unit CompMessageBoxDesigner;
+
+{
+  Inno Setup
+  Copyright (C) 1997-2020 Jordan Russell
+  Portions by Martijn Laan
+  For conditions of distribution and use, see LICENSE.TXT.
+
+  MessageBox Designer form
+  
+  Originally contributed by leserg73
+}
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+  UIStateForm, StdCtrls, ExtCtrls, NewStaticText, ComCtrls, pngimage;
+
+type
+  TMBDForm = class(TUIStateForm)
+    IMGmbInformation: TImage;
+    IMGmbConfirmation: TImage;
+    IMGmbError: TImage;
+    IMGmbCriticalError: TImage;
+    Panel1: TPanel;
+    GroupBox1: TGroupBox;
+    GroupBox2: TGroupBox;
+    MSGText: TMemo;
+    rb_mbInformation: TRadioButton;
+    rb_mbConfirmation: TRadioButton;
+    rb_mbError: TRadioButton;
+    rb_mbCriticalError: TRadioButton;
+    GroupBox3: TGroupBox;
+    MBDButtonOK: TButton;
+    MBDButtonCancel: TButton;
+    MBDButtonPreview: TButton;
+    Bevel1: TBevel;
+    rbMB_OK: TRadioButton;
+    rbMB_OKCANCEL: TRadioButton;
+    rbMB_YESNO: TRadioButton;
+    rbMB_YESNOCANCEL: TRadioButton;
+    rbMB_RETRYCANCEL: TRadioButton;
+    rbMB_ABORTRETRYIGNORE: TRadioButton;
+    GroupBox4: TGroupBox;
+    cb_IDOK: TCheckBox;
+    cb_IDCANCEL: TCheckBox;
+    cb_IDYES: TCheckBox;
+    cb_IDNO: TCheckBox;
+    cb_IDABORT: TCheckBox;
+    cb_IDRETRY: TCheckBox;
+    cb_IDIGNORE: TCheckBox;
+    GroupBox5: TGroupBox;
+    cb_MB_SETFOREGROUND: TCheckBox;
+    NewStaticText1: TNewStaticText;
+    NewEdit1: TEdit;
+    UpDown1: TUpDown;
+    GroupBox6: TGroupBox;
+    cb_MsgBox: TRadioButton;
+    cb_TaskDialogMsgBox: TRadioButton;
+    rb_IDOK: TCheckBox;
+    rb_IDCANCEL: TCheckBox;
+    rb_IDYES: TCheckBox;
+    rb_IDNO: TCheckBox;
+    rb_IDABORT: TCheckBox;
+    rb_IDRETRY: TCheckBox;
+    rb_IDIGNORE: TCheckBox;
+    TaskInstructionLabel: TNewStaticText;
+    TaskMesssageLabel: TNewStaticText;
+    TaskInstructionText: TEdit;
+    TaskMesssageText: TEdit;
+    Button1Text: TEdit;
+    Button2Text: TEdit;
+    Button1Label: TNewStaticText;
+    Button2Label: TNewStaticText;
+    cb_Suppressible: TCheckBox;
+    cb_DefIDOK: TRadioButton;
+    cb_DefIDCANCEL: TRadioButton;
+    cb_DefIDYES: TRadioButton;
+    cb_DefIDNO: TRadioButton;
+    cb_DefIDABORT: TRadioButton;
+    cb_DefIDRETRY: TRadioButton;
+    cb_DefIDIGNORE: TRadioButton;
+    procedure FormCreate(Sender: TObject);
+    procedure UpDown1Changing(Sender: TObject; var AllowChange: Boolean);
+    procedure rbMB_OKClick(Sender: TObject);
+    procedure rbMB_OKCANCELClick(Sender: TObject);
+    procedure rbMB_YESNOClick(Sender: TObject);
+    procedure rbMB_RETRYCANCELClick(Sender: TObject);
+    procedure rbMB_YESNOCANCELClick(Sender: TObject);
+    procedure rbMB_ABORTRETRYIGNOREClick(Sender: TObject);
+    procedure MBDButtonPreviewClick(Sender: TObject);
+    procedure cb_TaskDialogMsgBoxClick(Sender: TObject);
+    procedure cb_MsgBoxClick(Sender: TObject);
+    procedure rb_IDOKClick(Sender: TObject);
+    procedure rb_IDCANCELClick(Sender: TObject);
+    procedure rb_IDNOClick(Sender: TObject);
+    procedure rb_IDYESClick(Sender: TObject);
+    procedure rb_IDRETRYClick(Sender: TObject);
+    procedure rb_IDIGNOREClick(Sender: TObject);
+    procedure rb_IDABORTClick(Sender: TObject);
+    procedure MBDButtonOKClick(Sender: TObject);
+    procedure cb_SuppressibleClick(Sender: TObject);
+    procedure MSGTextKeyPress(Sender: TObject; var Key: Char);
+  private
+    procedure CreateScriptMSG;
+  public
+    { Public declarations }
+  end;
+
+implementation
+
+uses
+  CmnFunc, CmnFunc2, CompForm, TaskDialog, Msgs;
+
+{$R *.DFM}
+
+procedure TMBDForm.FormCreate(Sender: TObject);
+begin
+  InitFormFont(Self);
+
+  cb_Suppressible.Checked := True;
+  MSGText.Lines[MSGText.CaretPos.Y] := '<Enter your text here...>';
+  MSGText.SelStart := MSGText.Perform(EM_LINEINDEX, 0, 0);
+  MSGText.SelLength := Length(MSGText.Lines[0]);
+  cb_IDCANCEL.Enabled := False;
+  cb_IDABORT.Enabled := False;
+  cb_IDRETRY.Enabled := False;
+  cb_IDIGNORE.Enabled := False;
+  cb_IDYES.Enabled := False;
+  cb_IDNO.Enabled := False;
+  NewStaticText1.Enabled := False;
+  NewEdit1.Enabled := False;
+  UpDown1.Enabled := False;
+  TaskInstructionLabel.Visible := False;
+  TaskMesssageLabel.Visible := False;
+  TaskInstructionText.Visible := False;
+  TaskMesssageText.Visible := False;
+  Button1Text.Visible := False;
+  Button2Text.Visible := False;
+  Button1Label.Visible := False;
+  Button2Label.Visible := False;
+end;
+
+procedure TMBDForm.rbMB_OKClick(Sender: TObject);
+begin
+  cb_IDOK.Checked := False;
+  cb_IDCANCEL.Checked := False;
+  cb_IDABORT.Checked := False;
+  cb_IDRETRY.Checked := False;
+  cb_IDIGNORE.Checked := False;
+  cb_IDYES.Checked := False;
+  cb_IDNO.Checked := False;
+  cb_IDOK.Enabled := False;
+  cb_IDCANCEL.Enabled := False;
+  cb_IDABORT.Enabled := False;
+  cb_IDRETRY.Enabled := False;
+  cb_IDIGNORE.Enabled := False;
+  cb_IDYES.Enabled := False;
+  cb_IDNO.Enabled := False;
+  NewStaticText1.Enabled := False;
+  NewEdit1.Enabled := False;
+  NewEdit1.Text := '1';
+  UpDown1.Enabled := False;
+  if cb_TaskDialogMsgBox.Checked then begin
+     rb_IDOK.Enabled := True;
+     rb_IDCANCEL.Enabled := False;
+     rb_IDABORT.Enabled := False;
+     rb_IDRETRY.Enabled := False;
+     rb_IDIGNORE.Enabled := False;
+     rb_IDYES.Enabled := False;
+     rb_IDNO.Enabled := False;
+     rb_IDOK.Checked := False;
+     rb_IDCANCEL.Checked := False;
+     rb_IDABORT.Checked := False;
+     rb_IDRETRY.Checked := False;
+     rb_IDIGNORE.Checked := False;
+     rb_IDYES.Checked := False;
+     rb_IDNO.Checked := False;
+     Button2Text.Enabled := False;
+     Button2Label.Enabled := False;
+     Button1Text.Enabled := True;
+     Button1Label.Enabled := True;
+     Button1Text.Text := 'OK';
+     Button2Text.Text := '';
+  end;
+  if cb_Suppressible.Checked then begin
+     cb_DefIDOK.Checked := True;
+     cb_DefIDCANCEL.Checked := False;
+     cb_DefIDYES.Checked := False;
+     cb_DefIDNO.Checked := False;
+     cb_DefIDABORT.Checked := False;
+     cb_DefIDRETRY.Checked := False;
+     cb_DefIDIGNORE.Checked := False;
+     cb_DefIDOK.Enabled := True;
+     cb_DefIDCANCEL.Enabled := False;
+     cb_DefIDYES.Enabled := False;
+     cb_DefIDNO.Enabled := False;
+     cb_DefIDABORT.Enabled := False;
+     cb_DefIDRETRY.Enabled := False;
+     cb_DefIDIGNORE.Enabled := False;
+  end;
+end;
+
+procedure TMBDForm.rbMB_YESNOClick(Sender: TObject);
+begin
+  cb_IDOK.Checked := False;
+  cb_IDCANCEL.Checked := False;
+  cb_IDABORT.Checked := False;
+  cb_IDRETRY.Checked := False;
+  cb_IDIGNORE.Checked := False;
+  cb_IDYES.Checked := False;
+  cb_IDNO.Checked := False;
+  cb_IDOK.Enabled := False;
+  cb_IDCANCEL.Enabled := False;
+  cb_IDABORT.Enabled := False;
+  cb_IDRETRY.Enabled := False;
+  cb_IDIGNORE.Enabled := False;
+  cb_IDYES.Enabled := True;
+  cb_IDNO.Enabled := True;
+  if not cb_TaskDialogMsgBox.Checked then begin
+     NewStaticText1.Enabled := True;
+     NewEdit1.Enabled := True;
+     NewEdit1.Text := '1';
+     UpDown1.Max := 2;
+     UpDown1.Enabled := True;
+  end;
+  if cb_TaskDialogMsgBox.Checked then begin
+     rb_IDOK.Enabled := False;
+     rb_IDCANCEL.Enabled := False;
+     rb_IDABORT.Enabled := False;
+     rb_IDRETRY.Enabled := False;
+     rb_IDIGNORE.Enabled := False;
+     rb_IDYES.Enabled := True;
+     rb_IDNO.Enabled := True;
+     rb_IDOK.Checked := False;
+     rb_IDCANCEL.Checked := False;
+     rb_IDABORT.Checked := False;
+     rb_IDRETRY.Checked := False;
+     rb_IDIGNORE.Checked := False;
+     rb_IDYES.Checked := False;
+     rb_IDNO.Checked := False;
+     Button2Text.Enabled := True;
+     Button2Label.Enabled := True;
+     Button1Text.Enabled := True;
+     Button1Label.Enabled := True;
+     Button1Text.Text := 'Yes';
+     Button2Text.Text := 'No';
+  end;
+  if cb_Suppressible.Checked then begin
+     cb_DefIDOK.Checked := False;
+     cb_DefIDCANCEL.Checked := False;
+     cb_DefIDYES.Checked := True;
+     cb_DefIDNO.Checked := False;
+     cb_DefIDABORT.Checked := False;
+     cb_DefIDRETRY.Checked := False;
+     cb_DefIDIGNORE.Checked := False;
+     cb_DefIDOK.Enabled := False;
+     cb_DefIDCANCEL.Enabled := False;
+     cb_DefIDYES.Enabled := True;
+     cb_DefIDNO.Enabled := True;
+     cb_DefIDABORT.Enabled := False;
+     cb_DefIDRETRY.Enabled := False;
+     cb_DefIDIGNORE.Enabled := False;
+  end;
+end;
+
+procedure TMBDForm.rbMB_OKCANCELClick(Sender: TObject);
+begin
+  cb_IDOK.Checked := False;
+  cb_IDCANCEL.Checked := False;
+  cb_IDABORT.Checked := False;
+  cb_IDRETRY.Checked := False;
+  cb_IDIGNORE.Checked := False;
+  cb_IDYES.Checked := False;
+  cb_IDNO.Checked := False;
+  cb_IDOK.Enabled := True;
+  cb_IDCANCEL.Enabled := True;
+  cb_IDABORT.Enabled := False;
+  cb_IDRETRY.Enabled := False;
+  cb_IDIGNORE.Enabled := False;
+  cb_IDYES.Enabled := False;
+  cb_IDNO.Enabled := False;
+  if not cb_TaskDialogMsgBox.Checked then begin
+     NewStaticText1.Enabled := True;
+     NewEdit1.Enabled := True;
+     NewEdit1.Text := '1';
+     UpDown1.Max := 2;
+     UpDown1.Enabled := True;
+  end;
+  if cb_TaskDialogMsgBox.Checked then begin
+     rb_IDOK.Enabled := True;
+     rb_IDCANCEL.Enabled := True;
+     rb_IDABORT.Enabled := False;
+     rb_IDRETRY.Enabled := False;
+     rb_IDIGNORE.Enabled := False;
+     rb_IDYES.Enabled := False;
+     rb_IDNO.Enabled := False;
+     rb_IDOK.Checked := False;
+     rb_IDCANCEL.Checked := False;
+     rb_IDABORT.Checked := False;
+     rb_IDRETRY.Checked := False;
+     rb_IDIGNORE.Checked := False;
+     rb_IDYES.Checked := False;
+     rb_IDNO.Checked := False;
+     Button2Text.Enabled := False;
+     Button2Label.Enabled := False;
+     Button1Text.Enabled := True;
+     Button1Label.Enabled := True;
+     Button1Text.Text := 'OK';
+     Button2Text.Text := '';
+  end;
+  if cb_Suppressible.Checked then begin
+     cb_DefIDOK.Checked := True;
+     cb_DefIDCANCEL.Checked := False;
+     cb_DefIDYES.Checked := False;
+     cb_DefIDNO.Checked := False;
+     cb_DefIDABORT.Checked := False;
+     cb_DefIDRETRY.Checked := False;
+     cb_DefIDIGNORE.Checked := False;
+     cb_DefIDOK.Enabled := True;
+     cb_DefIDCANCEL.Enabled := True;
+     cb_DefIDYES.Enabled := False;
+     cb_DefIDNO.Enabled := False;
+     cb_DefIDABORT.Enabled := False;
+     cb_DefIDRETRY.Enabled := False;
+     cb_DefIDIGNORE.Enabled := False;
+  end;
+end;
+
+procedure TMBDForm.rbMB_RETRYCANCELClick(Sender: TObject);
+begin
+  cb_IDOK.Checked := False;
+  cb_IDCANCEL.Checked := False;
+  cb_IDABORT.Checked := False;
+  cb_IDRETRY.Checked := False;
+  cb_IDIGNORE.Checked := False;
+  cb_IDYES.Checked := False;
+  cb_IDNO.Checked := False;
+  cb_IDOK.Enabled := False;
+  cb_IDCANCEL.Enabled := True;
+  cb_IDABORT.Enabled := False;
+  cb_IDRETRY.Enabled := True;
+  cb_IDIGNORE.Enabled := False;
+  cb_IDYES.Enabled := False;
+  cb_IDNO.Enabled := False;
+  if not cb_TaskDialogMsgBox.Checked then begin
+     NewStaticText1.Enabled := True;
+     NewEdit1.Enabled := True;
+     NewEdit1.Text := '1';
+     UpDown1.Max := 2;
+     UpDown1.Enabled := True;
+  end;
+  if cb_TaskDialogMsgBox.Checked then begin
+     rb_IDOK.Enabled := False;
+     rb_IDCANCEL.Enabled := True;
+     rb_IDABORT.Enabled := False;
+     rb_IDRETRY.Enabled := True;
+     rb_IDIGNORE.Enabled := False;
+     rb_IDYES.Enabled := False;
+     rb_IDNO.Enabled := False;
+     rb_IDOK.Checked := False;
+     rb_IDCANCEL.Checked := False;
+     rb_IDABORT.Checked := False;
+     rb_IDRETRY.Checked := False;
+     rb_IDIGNORE.Checked := False;
+     rb_IDYES.Checked := False;
+     rb_IDNO.Checked := False;
+     Button2Text.Enabled := False;
+     Button2Label.Enabled := False;
+     Button1Text.Enabled := True;
+     Button1Label.Enabled := True;
+     Button1Text.Text := 'Retry';
+     Button2Text.Text := '';
+  end;
+  if cb_Suppressible.Checked then begin
+     cb_DefIDOK.Checked := False;
+     cb_DefIDCANCEL.Checked := True;
+     cb_DefIDYES.Checked := False;
+     cb_DefIDNO.Checked := False;
+     cb_DefIDABORT.Checked := False;
+     cb_DefIDRETRY.Checked := False;
+     cb_DefIDIGNORE.Checked := False;
+     cb_DefIDOK.Enabled := False;
+     cb_DefIDCANCEL.Enabled := True;
+     cb_DefIDYES.Enabled := False;
+     cb_DefIDNO.Enabled := False;
+     cb_DefIDABORT.Enabled := False;
+     cb_DefIDRETRY.Enabled := True;
+     cb_DefIDIGNORE.Enabled := False;
+  end;
+end;
+
+procedure TMBDForm.rbMB_YESNOCANCELClick(Sender: TObject);
+begin
+  cb_IDOK.Checked := False;
+  cb_IDCANCEL.Checked := False;
+  cb_IDABORT.Checked := False;
+  cb_IDRETRY.Checked := False;
+  cb_IDIGNORE.Checked := False;
+  cb_IDYES.Checked := False;
+  cb_IDNO.Checked := False;
+  cb_IDOK.Enabled := False;
+  cb_IDCANCEL.Enabled := True;
+  cb_IDABORT.Enabled := False;
+  cb_IDRETRY.Enabled := False;
+  cb_IDIGNORE.Enabled := False;
+  cb_IDYES.Enabled := True;
+  cb_IDNO.Enabled := True;
+  if not cb_TaskDialogMsgBox.Checked then begin
+     NewStaticText1.Enabled := True;
+     NewEdit1.Enabled := True;
+     NewEdit1.Text := '1';
+     UpDown1.Max := 3;
+     UpDown1.Enabled := True;
+  end;
+  if cb_TaskDialogMsgBox.Checked then begin
+     rb_IDOK.Enabled := False;
+     rb_IDCANCEL.Enabled := True;
+     rb_IDABORT.Enabled := False;
+     rb_IDRETRY.Enabled := False;
+     rb_IDIGNORE.Enabled := False;
+     rb_IDYES.Enabled := True;
+     rb_IDNO.Enabled := True;
+     rb_IDOK.Checked := False;
+     rb_IDCANCEL.Checked := False;
+     rb_IDABORT.Checked := False;
+     rb_IDRETRY.Checked := False;
+     rb_IDIGNORE.Checked := False;
+     rb_IDYES.Checked := False;
+     rb_IDNO.Checked := False;
+     Button2Text.Enabled := True;
+     Button2Label.Enabled := True;
+     Button1Text.Enabled := True;
+     Button1Label.Enabled := True;
+     Button1Text.Text := 'Yes';
+     Button2Text.Text := 'No';
+  end;
+  if cb_Suppressible.Checked then begin
+     cb_DefIDOK.Checked := False;
+     cb_DefIDCANCEL.Checked := False;
+     cb_DefIDYES.Checked := True;
+     cb_DefIDNO.Checked := False;
+     cb_DefIDABORT.Checked := False;
+     cb_DefIDRETRY.Checked := False;
+     cb_DefIDIGNORE.Checked := False;
+     cb_DefIDOK.Enabled := False;
+     cb_DefIDCANCEL.Enabled := True;
+     cb_DefIDYES.Enabled := True;
+     cb_DefIDNO.Enabled := True;
+     cb_DefIDABORT.Enabled := False;
+     cb_DefIDRETRY.Enabled := False;
+     cb_DefIDIGNORE.Enabled := False;
+  end;
+end;
+
+procedure TMBDForm.rbMB_ABORTRETRYIGNOREClick(Sender: TObject);
+begin
+  cb_IDOK.Checked := False;
+  cb_IDCANCEL.Checked := False;
+  cb_IDABORT.Checked := False;
+  cb_IDRETRY.Checked := False;
+  cb_IDIGNORE.Checked := False;
+  cb_IDYES.Checked := False;
+  cb_IDNO.Checked := False;
+  cb_IDOK.Enabled := False;
+  cb_IDCANCEL.Enabled := False;
+  cb_IDABORT.Enabled := True;
+  cb_IDRETRY.Enabled := True;
+  cb_IDIGNORE.Enabled := True;
+  cb_IDYES.Enabled := False;
+  cb_IDNO.Enabled := False;
+  if not cb_TaskDialogMsgBox.Checked then begin
+     NewStaticText1.Enabled := True;
+     NewEdit1.Enabled := True;
+     NewEdit1.Text := '1';
+     UpDown1.Max := 3;
+     UpDown1.Enabled := True;
+  end;
+  if cb_TaskDialogMsgBox.Checked then begin
+     rb_IDOK.Enabled := False;
+     rb_IDCANCEL.Enabled := False;
+     rb_IDABORT.Enabled := True;
+     rb_IDRETRY.Enabled := True;
+     rb_IDIGNORE.Enabled := True;
+     rb_IDYES.Enabled := False;
+     rb_IDNO.Enabled := False;
+     rb_IDOK.Checked := False;
+     rb_IDCANCEL.Checked := False;
+     rb_IDABORT.Checked := False;
+     rb_IDRETRY.Checked := False;
+     rb_IDIGNORE.Checked := False;
+     rb_IDYES.Checked := False;
+     rb_IDNO.Checked := False;
+     Button2Text.Enabled := False;
+     Button2Label.Enabled := False;
+     Button1Text.Enabled := False;
+     Button1Label.Enabled := False;
+     Button1Text.Text := '';
+     Button2Text.Text := '';
+  end;
+  if cb_Suppressible.Checked then begin
+     cb_DefIDOK.Checked := False;
+     cb_DefIDCANCEL.Checked := False;
+     cb_DefIDYES.Checked := False;
+     cb_DefIDNO.Checked := False;
+     cb_DefIDABORT.Checked := False;
+     cb_DefIDRETRY.Checked := False;
+     cb_DefIDIGNORE.Checked := True;
+     cb_DefIDOK.Enabled := False;
+     cb_DefIDCANCEL.Enabled := False;
+     cb_DefIDYES.Enabled := False;
+     cb_DefIDNO.Enabled := False;
+     cb_DefIDABORT.Enabled := True;
+     cb_DefIDRETRY.Enabled := True;
+     cb_DefIDIGNORE.Enabled := True;
+  end;
+end;
+
+procedure TMBDForm.UpDown1Changing(Sender: TObject; var AllowChange: Boolean);
+begin
+   AllowChange := True;
+end;
+
+procedure TMBDForm.cb_MsgBoxClick(Sender: TObject);
+begin
+   IMGmbConfirmation.Visible := True;
+   cb_MB_SETFOREGROUND.Enabled := True;
+   cb_MB_SETFOREGROUND.Checked := False;
+   GroupBox1.Visible := True;
+   if not cb_Suppressible.Checked then begin
+      GroupBox4.Caption := ' Return values ';
+      cb_DefIDOK.Visible := False;
+      cb_DefIDCANCEL.Visible := False;
+      cb_DefIDYES.Visible := False;
+      cb_DefIDNO.Visible := False;
+      cb_DefIDABORT.Visible := False;
+      cb_DefIDRETRY.Visible := False;
+      cb_DefIDIGNORE.Visible := False;
+   end
+   else begin
+     GroupBox4.Caption := ' Return values /  -------- / Default ';
+     cb_DefIDOK.Visible := True;
+     cb_DefIDCANCEL.Visible := True;
+     cb_DefIDYES.Visible := True;
+     cb_DefIDNO.Visible := True;
+     cb_DefIDABORT.Visible := True;
+     cb_DefIDRETRY.Visible := True;
+     cb_DefIDIGNORE.Visible := True;
+   end;
+   cb_IDOK.Checked := False;
+   cb_IDCANCEL.Checked := False;
+   cb_IDABORT.Checked := False;
+   cb_IDRETRY.Checked := False;
+   cb_IDIGNORE.Checked := False;
+   cb_IDYES.Checked := False;
+   cb_IDNO.Checked := False;
+   rb_IDOK.Visible := False;
+   rb_IDCANCEL.Visible := False;
+   rb_IDABORT.Visible := False;
+   rb_IDRETRY.Visible := False;
+   rb_IDIGNORE.Visible := False;
+   rb_IDYES.Visible := False;
+   rb_IDNO.Visible := False;
+   rb_mbInformation.Checked := True;
+   TaskInstructionLabel.Visible := False;
+   TaskMesssageLabel.Visible := False;
+   TaskInstructionText.Visible := False;
+   TaskMesssageText.Visible := False;
+   Button1Text.Visible := False;
+   Button2Text.Visible := False;
+   Button1Label.Visible := False;
+   Button2Label.Visible := False;
+   rbMB_OK.Checked := True;
+   rbMB_OKClick(Self);
+end;
+
+procedure TMBDForm.cb_SuppressibleClick(Sender: TObject);
+begin
+   if cb_Suppressible.Checked then begin
+     cb_DefIDOK.Visible := True;
+     cb_DefIDCANCEL.Visible := True;
+     cb_DefIDYES.Visible := True;
+     cb_DefIDNO.Visible := True;
+     cb_DefIDABORT.Visible := True;
+     cb_DefIDRETRY.Visible := True;
+     cb_DefIDIGNORE.Visible := True;
+     if cb_MsgBox.Checked then
+        GroupBox4.Caption := ' Return values /  -------- / Default ';
+     if cb_TaskDialogMsgBox.Checked then
+        GroupBox4.Caption := ' Return values /  Shield  / Default ';
+   end
+   else begin
+     cb_DefIDOK.Checked := False;
+     cb_DefIDCANCEL.Checked := False;
+     cb_DefIDYES.Checked := False;
+     cb_DefIDNO.Checked := False;
+     cb_DefIDABORT.Checked := False;
+     cb_DefIDRETRY.Checked := False;
+     cb_DefIDIGNORE.Checked := False;
+     cb_DefIDOK.Visible := False;
+     cb_DefIDCANCEL.Visible := False;
+     cb_DefIDYES.Visible := False;
+     cb_DefIDNO.Visible := False;
+     cb_DefIDABORT.Visible := False;
+     cb_DefIDRETRY.Visible := False;
+     cb_DefIDIGNORE.Visible := False;
+     if cb_MsgBox.Checked then
+        GroupBox4.Caption := ' Return values ';
+     if cb_TaskDialogMsgBox.Checked then
+        GroupBox4.Caption := ' Return values /  Shield ';
+   end;
+   if rbMB_OK.Checked then rbMB_OKClick(Self);
+   if rbMB_OKCANCEL.Checked then rbMB_OKCANCELClick(Self);
+   if rbMB_YESNO.Checked then rbMB_YESNOClick(Self);
+   if rbMB_YESNOCANCEL.Checked then rbMB_YESNOCANCELClick(Self);
+   if rbMB_RETRYCANCEL.Checked then rbMB_RETRYCANCELClick(Self);
+   if rbMB_ABORTRETRYIGNORE.Checked then rbMB_ABORTRETRYIGNOREClick(Self);
+end;
+
+procedure TMBDForm.cb_TaskDialogMsgBoxClick(Sender: TObject);
+begin
+   IMGmbConfirmation.Visible := False;
+   cb_MB_SETFOREGROUND.Enabled := False;
+   cb_MB_SETFOREGROUND.Checked := False;
+   GroupBox1.Visible := False;
+   if not cb_Suppressible.Checked then begin
+     GroupBox4.Caption := ' Return values /  Shield ';
+      cb_DefIDOK.Visible := False;
+      cb_DefIDCANCEL.Visible := False;
+      cb_DefIDYES.Visible := False;
+      cb_DefIDNO.Visible := False;
+      cb_DefIDABORT.Visible := False;
+      cb_DefIDRETRY.Visible := False;
+      cb_DefIDIGNORE.Visible := False;
+   end
+   else begin
+     GroupBox4.Caption := ' Return values /  Shield  / Default ';
+     cb_DefIDOK.Visible := True;
+     cb_DefIDCANCEL.Visible := True;
+     cb_DefIDYES.Visible := True;
+     cb_DefIDNO.Visible := True;
+     cb_DefIDABORT.Visible := True;
+     cb_DefIDRETRY.Visible := True;
+     cb_DefIDIGNORE.Visible := True;
+   end;
+   cb_IDOK.Checked := False;
+   cb_IDCANCEL.Checked := False;
+   cb_IDABORT.Checked := False;
+   cb_IDRETRY.Checked := False;
+   cb_IDIGNORE.Checked := False;
+   cb_IDYES.Checked := False;
+   cb_IDNO.Checked := False;
+   rb_IDOK.Checked := False;
+   rb_IDCANCEL.Checked := False;
+   rb_IDABORT.Checked := False;
+   rb_IDRETRY.Checked := False;
+   rb_IDIGNORE.Checked := False;
+   rb_IDYES.Checked := False;
+   rb_IDNO.Checked := False;
+   rb_IDOK.Visible := True;
+   rb_IDCANCEL.Visible := True;
+   rb_IDABORT.Visible := True;
+   rb_IDRETRY.Visible := True;
+   rb_IDIGNORE.Visible := True;
+   rb_IDYES.Visible := True;
+   rb_IDNO.Visible := True;
+   rb_mbInformation.Checked := True;
+   TaskInstructionLabel.Visible := True;
+   TaskMesssageLabel.Visible := True;
+   TaskInstructionText.Visible := True;
+   TaskMesssageText.Visible := True;
+   Button1Text.Visible := True;
+   Button2Text.Visible := True;
+   Button1Label.Visible := True;
+   Button2Label.Visible := True;
+   TaskInstructionText.Text := 'Instruction Text';
+   TaskMesssageText.Text := 'Messsage Text';
+   // Button1Text.Text := '';
+   // Button2Text.Text := '';
+   rbMB_OK.Checked := True;
+   rbMB_OKClick(Self);
+end;
+
+procedure TMBDForm.rb_IDOKClick(Sender: TObject);
+begin
+   if rb_IDOK.Checked then
+      rb_IDCANCEL.Checked := False;
+end;
+
+procedure TMBDForm.rb_IDCANCELClick(Sender: TObject);
+begin
+   if rb_IDCANCEL.Checked then begin
+      rb_IDOK.Checked := False;
+      rb_IDNO.Checked := False;
+      rb_IDYES.Checked := False;
+      rb_IDRETRY.Checked := False;
+   end;
+end;
+
+procedure TMBDForm.rb_IDYESClick(Sender: TObject);
+begin
+   if rb_IDYES.Checked then begin
+      rb_IDNO.Checked := False;
+      rb_IDCANCEL.Checked := False;
+   end;
+end;
+
+procedure TMBDForm.rb_IDNOClick(Sender: TObject);
+begin
+   if rb_IDNO.Checked then begin
+      rb_IDYES.Checked := False;
+      rb_IDCANCEL.Checked := False;
+   end;
+end;
+
+procedure TMBDForm.rb_IDRETRYClick(Sender: TObject);
+begin
+   if rb_IDRETRY.Checked then begin
+      rb_IDCANCEL.Checked := False;
+      rb_IDABORT.Checked := False;
+      rb_IDIGNORE.Checked := False;
+   end;
+end;
+
+procedure TMBDForm.rb_IDIGNOREClick(Sender: TObject);
+begin
+   if rb_IDIGNORE.Checked then begin
+      rb_IDABORT.Checked := False;
+      rb_IDRETRY.Checked := False;
+   end;
+end;
+
+procedure TMBDForm.rb_IDABORTClick(Sender: TObject);
+begin
+   if rb_IDABORT.Checked then begin
+      rb_IDIGNORE.Checked := False;
+      rb_IDRETRY.Checked := False;
+   end;
+end;
+
+procedure TMBDForm.MBDButtonOKClick(Sender: TObject);
+begin
+  CreateScriptMSG;
+end;
+
+procedure TMBDForm.MBDButtonPreviewClick(Sender: TObject);
+var
+  ButtonsBtn : Cardinal;
+  TypeIcon : TMsgBoxType;
+  CaptionMsg : String;
+  ShieldFlag : Integer;
+  ButtonLabelsArray: TArray<string>;
+begin
+  { default value }
+  ButtonsBtn := MB_OK;
+  TypeIcon := mbInformation;
+  ShieldFlag := 0;
+
+  { icon and caption set }
+  if rb_mbInformation.Checked then begin
+     CaptionMsg := 'Info';
+     TypeIcon := mbInformation;
+  end;
+  if rb_mbConfirmation.Checked then begin
+     CaptionMsg := 'Confirm';
+     TypeIcon := mbConfirmation;
+  end;
+  if rb_mbError.Checked then begin
+     CaptionMsg := 'Error';
+     TypeIcon := mbError;
+  end;
+  if rb_mbCriticalError.Checked then begin
+     CaptionMsg := 'Fatal Error';
+     TypeIcon := mbCriticalError;
+  end;
+
+  { button type set }
+  if rbMB_OK.Checked then ButtonsBtn := MB_OK;
+  if rbMB_OKCANCEL.Checked then ButtonsBtn := MB_OKCANCEL;
+  if rbMB_YESNO.Checked then ButtonsBtn := MB_YESNO;
+  if rbMB_YESNOCANCEL.Checked then ButtonsBtn := MB_YESNOCANCEL;
+  if rbMB_RETRYCANCEL.Checked then ButtonsBtn := MB_RETRYCANCEL;
+  if rbMB_ABORTRETRYIGNORE.Checked then ButtonsBtn := MB_ABORTRETRYIGNORE;
+
+  { MsgBox(Text, Caption, Typ, Buttons); preview }
+  if cb_MsgBox.Checked then begin
+    if MSGText.GetTextLen = 0 then
+       MSGText.Lines.Add('Your message text.');
+    { MessageBox with DefButton }
+    if NewEdit1.Text = '1' then
+       MsgBox(MSGText.Lines.GetText, CaptionMsg, TypeIcon, ButtonsBtn);
+    if NewEdit1.Text = '2' then
+       MsgBox(MSGText.Lines.GetText, CaptionMsg, TypeIcon, ButtonsBtn or MB_DEFBUTTON2);
+    if NewEdit1.Text = '3' then
+       MsgBox(MSGText.Lines.GetText, CaptionMsg, TypeIcon, ButtonsBtn or MB_DEFBUTTON3);
+    { MessageBox with DefButton and Flag MB_SETFOREGROUND }
+    if (NewEdit1.Text = '1') and (cb_MB_SETFOREGROUND.Checked) then
+       MsgBox(MSGText.Lines.GetText, CaptionMsg, TypeIcon, ButtonsBtn or MB_SETFOREGROUND);
+    if (NewEdit1.Text = '2') and (cb_MB_SETFOREGROUND.Checked) then
+       MsgBox(MSGText.Lines.GetText, CaptionMsg, TypeIcon, ButtonsBtn or MB_DEFBUTTON2 or MB_SETFOREGROUND);
+    if (NewEdit1.Text = '3') and (cb_MB_SETFOREGROUND.Checked) then
+       MsgBox(MSGText.Lines.GetText, CaptionMsg, TypeIcon, ButtonsBtn or MB_DEFBUTTON3 or MB_SETFOREGROUND);
+  end;
+
+  { TaskDialogMsgBox preview}
+  if cb_TaskDialogMsgBox.Checked then begin
+     { create ButtonLabels array }
+     if rbMB_YESNO.Checked or rbMB_YESNOCANCEL.Checked then
+        ButtonLabelsArray := TArray<string>.Create(Button1Text.Text, Button2Text.Text)
+     else if rbMB_ABORTRETRYIGNORE.Checked then
+        ButtonLabelsArray := TArray<string>.Create('Retry', 'Ignore', 'Abort')
+     else
+        ButtonLabelsArray := TArray<string>.Create(Button1Text.Text);
+
+     { get Shield Flag value }
+     if rbMB_OK.Checked and rb_IDOK.Checked then ShieldFlag := IDOK;
+     if rbMB_OKCANCEL.Checked and rb_IDOK.Checked then ShieldFlag := IDOK;
+     if rbMB_OKCANCEL.Checked and rb_IDCANCEL.Checked then ShieldFlag := IDCANCEL;
+     if rbMB_YESNO.Checked and rb_IDYES.Checked then ShieldFlag := IDYES;
+     if rbMB_YESNO.Checked and rb_IDNO.Checked then ShieldFlag := IDNO;
+     if rbMB_YESNOCANCEL.Checked and rb_IDYES.Checked then ShieldFlag := IDYES;
+     if rbMB_YESNOCANCEL.Checked and rb_IDNO.Checked then ShieldFlag := IDNO;
+     if rbMB_YESNOCANCEL.Checked and rb_IDCANCEL.Checked then ShieldFlag := IDCANCEL;
+     if rbMB_RETRYCANCEL.Checked and rb_IDRETRY.Checked then ShieldFlag := IDRETRY;
+     if rbMB_RETRYCANCEL.Checked and rb_IDCANCEL.Checked then ShieldFlag := IDCANCEL;
+     if rbMB_ABORTRETRYIGNORE.Checked and rb_IDRETRY.Checked then ShieldFlag := IDRETRY;
+     if rbMB_ABORTRETRYIGNORE.Checked and rb_IDABORT.Checked then ShieldFlag := IDABORT;
+     if rbMB_ABORTRETRYIGNORE.Checked and rb_IDIGNORE.Checked then ShieldFlag := IDIGNORE;
+
+     { TaskDialogMsgBox(Icon, Instruction, Text, Caption, Typ, Buttons, ButtonLabels, ShieldButton) }
+     TaskDialogMsgBox('',
+                      TaskInstructionText.Text,
+                      TaskMesssageText.Text,
+                      CaptionMsg,
+                      TypeIcon,
+                      ButtonsBtn,
+                      ButtonLabelsArray,
+                      ShieldFlag);
+  end;
+end;
+
+procedure TMBDForm.MSGTextKeyPress(Sender: TObject; var Key: Char);
+begin
+  if Key = #27 then begin
+    MBDButtonCancel.Click;
+    Key := #0;
+  end;
+end;
+
+procedure TMBDForm.CreateScriptMSG;
+
+   { MsgBox / SuppressibleMsgBox }
+   function TextMsg(M: Integer; a, b, c, d, e, f: String): String;
+    { (M) - TypeMsg
+      (a) - TextMsgIf
+      (b) - IconTypes
+      (c) - ButtonBtn
+      (d) - IDButton
+      (e) - IDButton2
+      (f) - IDButton3 }
+   var
+      SMsg, TypeMsgBox : String;
+   begin
+     if not cb_Suppressible.Checked then
+        TypeMsgBox := 'MsgBox'
+     else
+        TypeMsgBox := 'SuppressibleMsgBox';
+     SMsg := TypeMsgBox + '(''' + a + ''', ' + b + ', ' + c + ')';
+     case M of
+        0: Result := SMsg + ';';
+        1: Result := 'if ' + SMsg + ' = ' + d + ' then' + SNewLine + 'begin' + SNewLine + #9 + '// user clicked ' + StringReplace(d, 'ID', '', []) + SNewLine + 'end;';
+        2: Result := 'case ' + SMsg + ' of ' + SNewLine + #9 + d +': { user clicked ' + StringReplace(d, 'ID', '', []) + ' };' + SNewLine + #9 + e +': { user clicked ' + StringReplace(e, 'ID', '', []) + ' };' + SNewLine + 'end;';
+        3: Result := 'case ' + SMsg + ' of ' + SNewLine + #9 + d +': { user clicked ' + StringReplace(d, 'ID', '', []) + ' };' + SNewLine + #9 + e +': { user clicked ' + StringReplace(e, 'ID', '', []) + ' };' + SNewLine + #9 + 'else { user clicked ' + StringReplace(f, 'ID', '', []) + ' };' + SNewLine + 'end;';
+     end;
+   end;
+
+   { TaskDialogMsgBox / SuppressibleTaskDialogMsgBox }
+   function TextTask(N: Integer; a, b, c, r, s, d, e, f: String): String;
+    { (N) - TypeMsg
+      (a) - TextMsgIf (Button1Text.Text and Button2Text.Text)
+      (b) - IconTypes
+      (c) - ButtonBtn
+      (r) - BtnTextArr
+      (s) - ShieldFlg
+      (d) - IDButton
+      (e) - IDButton2
+      (f) - IDButton3 }
+   var
+      STsg, TypeMsgBox : String;
+   begin
+     if not cb_Suppressible.Checked then
+        TypeMsgBox := 'TaskDialogMsgBox'
+     else
+        TypeMsgBox := 'SuppressibleTaskDialogMsgBox';
+     STsg := TypeMsgBox + '(''' + a + ''', ' + b + ', ' + c + ', [''' + r + '''], ' + s + ')';
+     case N of
+        0: Result := STsg + ';';
+        1: Result := 'if ' + STsg + ' = ' + d + ' then' + SNewLine + 'begin' + SNewLine + #9 + '// user clicked ' + StringReplace(d, 'ID', '', []) + SNewLine + 'end;';
+        2: Result := 'case ' + STsg + ' of ' + SNewLine + #9 + d +': { user clicked ' + StringReplace(d, 'ID', '', []) + ' };' + SNewLine + #9 + e +': { user clicked ' + StringReplace(e, 'ID', '', []) + ' };' + SNewLine + 'end;';
+        3: Result := 'case ' + STsg + ' of ' + SNewLine + #9 + d +': { user clicked ' + StringReplace(d, 'ID', '', []) + ' };' + SNewLine + #9 + e +': { user clicked ' + StringReplace(e, 'ID', '', []) + ' };' + SNewLine + #9 + 'else { user clicked ' + StringReplace(f, 'ID', '', []) + ' };' + SNewLine + 'end;';
+     end;
+   end;
+
+const
+  remarka = '// Display a message box';
+
+var
+  ButtonBtn, TextMsgIf, IconTypes : String;
+  IDButton, IDButton2, IDButton3 : String;
+  TypeMsg, ModeMsg : Integer;
+  BtnTextArr, ShieldFlg, BtnSupprDef : String;
+
+begin
+  { default value }
+  ButtonBtn := 'MB_OK';
+  IconTypes := 'mbInformation';
+  ShieldFlg := '0';
+  TypeMsg := 0;
+  ModeMsg := 0;
+  BtnSupprDef := '';
+
+  MSGTextInsert.Clear;
+  MSGTextInsert.Add(remarka);
+
+  { make a string with DefBtn for Suppressible }
+  if cb_Suppressible.Checked then begin
+     if cb_DefIDOK.Checked then BtnSupprDef := ', IDOK';
+     if cb_DefIDCANCEL.Checked then BtnSupprDef := ', IDCANCEL';
+     if cb_DefIDYES.Checked then BtnSupprDef := ', IDYES';
+     if cb_DefIDNO.Checked then BtnSupprDef := ', IDNO';
+     if cb_DefIDABORT.Checked then BtnSupprDef := ', IDABORT';
+     if cb_DefIDRETRY.Checked then BtnSupprDef := ', IDRETRY';
+     if cb_DefIDIGNORE.Checked then BtnSupprDef := ', IDIGNORE';
+  end;
+
+  { icon and caption set }
+  if rb_mbInformation.Checked then begin
+     IconTypes := 'mbInformation';
+  end;
+  if rb_mbConfirmation.Checked then begin
+     IconTypes := 'mbConfirmation';
+  end;
+  if rb_mbError.Checked then begin
+     IconTypes := 'mbError';
+  end;
+  if rb_mbCriticalError.Checked then begin
+     IconTypes := 'mbCriticalError';
+  end;
+  { button type set }
+  if rbMB_OK.Checked then ButtonBtn := 'MB_OK';
+  if rbMB_OKCANCEL.Checked then ButtonBtn := 'MB_OKCANCEL';
+  if rbMB_YESNO.Checked then ButtonBtn := 'MB_YESNO';
+  if rbMB_YESNOCANCEL.Checked then ButtonBtn := 'MB_YESNOCANCEL';
+  if rbMB_RETRYCANCEL.Checked then ButtonBtn := 'MB_RETRYCANCEL';
+  if rbMB_ABORTRETRYIGNORE.Checked then ButtonBtn := 'MB_ABORTRETRYIGNORE';
+
+  if cb_MsgBox.Checked then begin
+     { MsgBox(Text, Typ, Buttons); }
+     ModeMsg := 0;
+
+     // rbMB_OK.Checked
+     { MessageBox with DefButton }
+     { MessageBox with DefButton and Flag MB_SETFOREGROUND }
+     if (rbMB_OK.Checked) and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_OK or MB_SETFOREGROUND';
+
+     // rbMB_OKCANCEL
+     { MessageBox with DefButton }
+     if (rbMB_OKCANCEL.Checked) and (NewEdit1.Text = '2') then
+        ButtonBtn := 'MB_OKCANCEL or MB_DEFBUTTON2';
+     { MessageBox with DefButton and Flag MB_SETFOREGROUND }
+     if (rbMB_OKCANCEL.Checked) and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_OKCANCEL or MB_SETFOREGROUND';
+     if (rbMB_OKCANCEL.Checked) and (NewEdit1.Text = '2') and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_OKCANCEL or MB_DEFBUTTON2 or MB_SETFOREGROUND';
+
+     // rbMB_YESNO
+     { MessageBox with DefButton }
+     if (rbMB_YESNO.Checked) and (NewEdit1.Text = '2') then
+        ButtonBtn := 'MB_YESNO or MB_DEFBUTTON2';
+     { MessageBox with DefButton and Flag MB_SETFOREGROUND }
+     if (rbMB_YESNO.Checked) and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_YESNO or MB_SETFOREGROUND';
+     if (rbMB_YESNO.Checked) and (NewEdit1.Text = '2') and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_YESNO or MB_DEFBUTTON2 or MB_SETFOREGROUND';
+
+     // rbMB_RETRYCANCEL
+     { MessageBox with DefButton }
+     if (rbMB_RETRYCANCEL.Checked) and (NewEdit1.Text = '2') then
+        ButtonBtn := 'MB_RETRYCANCEL or MB_DEFBUTTON2';
+     { MessageBox with DefButton and Flag MB_SETFOREGROUND }
+     if (rbMB_RETRYCANCEL.Checked) and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_RETRYCANCEL or MB_SETFOREGROUND';
+     if (rbMB_RETRYCANCEL.Checked) and (NewEdit1.Text = '2') and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_RETRYCANCEL or MB_DEFBUTTON2 or MB_SETFOREGROUND';
+
+     // rbMB_YESNOCANCEL
+     { MessageBox with DefButton }
+     if (rbMB_YESNOCANCEL.Checked) and (NewEdit1.Text = '2') then
+        ButtonBtn := 'MB_YESNOCANCEL or MB_DEFBUTTON2';
+     if (rbMB_YESNOCANCEL.Checked) and (NewEdit1.Text = '3') then
+        ButtonBtn := 'MB_YESNOCANCEL or MB_DEFBUTTON3';
+     { MessageBox with DefButton and Flag MB_SETFOREGROUND }
+     if (rbMB_YESNOCANCEL.Checked) and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_YESNOCANCEL or MB_SETFOREGROUND';
+     if (rbMB_YESNOCANCEL.Checked) and (NewEdit1.Text = '2') and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_YESNOCANCEL or MB_DEFBUTTON2 or MB_SETFOREGROUND';
+     if (rbMB_YESNOCANCEL.Checked) and (NewEdit1.Text = '3') and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_YESNOCANCEL or MB_DEFBUTTON3 or MB_SETFOREGROUND';
+
+     // rbMB_ABORTRETRYIGNORE
+     { MessageBox with DefButton }
+     if (rbMB_ABORTRETRYIGNORE.Checked) and (NewEdit1.Text = '2') then
+        ButtonBtn := 'MB_ABORTRETRYIGNORE or MB_DEFBUTTON2';
+     if (rbMB_ABORTRETRYIGNORE.Checked) and (NewEdit1.Text = '3') then
+        ButtonBtn := 'MB_ABORTRETRYIGNORE or MB_DEFBUTTON3';
+     { MessageBox with DefButton and Flag MB_SETFOREGROUND }
+     if (rbMB_ABORTRETRYIGNORE.Checked) and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_ABORTRETRYIGNORE or MB_SETFOREGROUND';
+     if (rbMB_ABORTRETRYIGNORE.Checked) and (NewEdit1.Text = '2') and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_ABORTRETRYIGNORE or MB_DEFBUTTON2 or MB_SETFOREGROUND';
+     if (rbMB_ABORTRETRYIGNORE.Checked) and (NewEdit1.Text = '3') and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_ABORTRETRYIGNORE or MB_DEFBUTTON3 or MB_SETFOREGROUND';
+
+     { Suppressible msg }
+     if cb_Suppressible.Checked then ButtonBtn := ButtonBtn + BtnSupprDef;
+
+     { replace in a message string escape /r/n }
+     TextMsgIf := StringReplace(MSGText.Lines.GetText, SNewLine, '''#13#10''', [rfReplaceAll]);
+  end;
+
+  if cb_TaskDialogMsgBox.Checked then begin
+     { TaskDialogMsgBox(TaskInstructionText.Text, TaskMesssageText.Text, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg) }
+     ModeMsg := 1;
+
+     { create ButtonLabels array }
+     if rbMB_YESNO.Checked or rbMB_YESNOCANCEL.Checked then
+        BtnTextArr :=  Button1Text.Text + ''', ''' + Button2Text.Text
+     else if rbMB_ABORTRETRYIGNORE.Checked then
+        BtnTextArr := 'Retry'', ''Ignore'', ''Abort'
+     else
+        BtnTextArr := Button1Text.Text;
+
+     { get Shield Flag value }
+     if rbMB_OK.Checked and rb_IDOK.Checked then ShieldFlg := 'IDOK';
+     if rbMB_OKCANCEL.Checked and rb_IDOK.Checked then ShieldFlg := 'IDOK';
+     if rbMB_OKCANCEL.Checked and rb_IDCANCEL.Checked then ShieldFlg := 'IDCANCEL';
+     if rbMB_YESNO.Checked and rb_IDYES.Checked then ShieldFlg := 'IDYES';
+     if rbMB_YESNO.Checked and rb_IDNO.Checked then ShieldFlg := 'IDNO';
+     if rbMB_YESNOCANCEL.Checked and rb_IDYES.Checked then ShieldFlg := 'IDYES';
+     if rbMB_YESNOCANCEL.Checked and rb_IDNO.Checked then ShieldFlg := 'IDNO';
+     if rbMB_YESNOCANCEL.Checked and rb_IDCANCEL.Checked then ShieldFlg := 'IDCANCEL';
+     if rbMB_RETRYCANCEL.Checked and rb_IDRETRY.Checked then ShieldFlg := 'IDRETRY';
+     if rbMB_RETRYCANCEL.Checked and rb_IDCANCEL.Checked then ShieldFlg := 'IDCANCEL';
+     if rbMB_ABORTRETRYIGNORE.Checked and rb_IDRETRY.Checked then ShieldFlg := 'IDRETRY';
+     if rbMB_ABORTRETRYIGNORE.Checked and rb_IDABORT.Checked then ShieldFlg := 'IDABORT';
+     if rbMB_ABORTRETRYIGNORE.Checked and rb_IDIGNORE.Checked then ShieldFlg := 'IDIGNORE';
+
+     { Suppressible msg }
+     if cb_Suppressible.Checked then ShieldFlg := ShieldFlg + BtnSupprDef;
+
+     TextMsgIf := TaskInstructionText.Text + ''', ''' + TaskMesssageText.Text;
+  end;
+
+  { selected button OK }
+  if (cb_IDOK.Checked and not cb_IDCANCEL.Checked) then begin
+     IDButton := 'IDOK';
+     TypeMsg := 1;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, '', '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, '', '');
+     end;
+  end
+
+  { selected button CANCEL }
+  else if (cb_IDCANCEL.Checked and not cb_IDOK.Checked and not cb_IDRETRY.Checked and not cb_IDYES.Checked and not cb_IDNO.Checked and not cb_IDABORT.Checked and not cb_IDIGNORE.Checked) then begin
+     IDButton := 'IDCANCEL';
+     TypeMsg := 1;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, '', '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, '', '');
+     end;
+  end
+
+  { selected button OK and CANCEL }
+  else if (cb_IDCANCEL.Checked and cb_IDOK.Checked and not cb_IDRETRY.Checked and not cb_IDYES.Checked and not cb_IDNO.Checked) then begin
+     IDButton := 'IDOK';
+     IDButton2 := 'IDCANCEL';
+     TypeMsg := 2;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, '');
+     end;
+  end
+
+  { selected button YES }
+  else if (cb_IDYES.Checked and not cb_IDNO.Checked and not cb_IDCANCEL.Checked) then begin
+     IDButton := 'IDYES';
+     TypeMsg := 1;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, '', '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, '', '');
+     end;
+  end
+
+  { selected button NO }
+  else if (cb_IDNO.Checked and not cb_IDYES.Checked and not cb_IDCANCEL.Checked) then begin
+     IDButton := 'IDNO';
+     TypeMsg := 1;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, '', '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, '', '');
+     end;
+  end
+
+  { selected button YES and NO }
+  else if (cb_IDYES.Checked and cb_IDNO.Checked and not cb_IDCANCEL.Checked) then begin
+     IDButton := 'IDYES';
+     IDButton2 := 'IDNO';
+     TypeMsg := 2;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, '');
+     end;
+  end
+
+  { selected button YES and CANCEL }
+  else if (cb_IDYES.Checked and not cb_IDNO.Checked and cb_IDCANCEL.Checked) then begin
+     IDButton := 'IDYES';
+     IDButton2 := 'IDCANCEL';
+     TypeMsg := 2;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, '');
+     end;
+  end
+
+  { selected button NO and CANCEL }
+  else if (cb_IDNO.Checked and not cb_IDYES.Checked and cb_IDCANCEL.Checked) then begin
+     IDButton := 'IDNO';
+     IDButton2 := 'IDCANCEL';
+     TypeMsg := 2;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, '');
+     end;
+  end
+
+  { selected button YES, NO and CANCEL }
+  else if (cb_IDYES.Checked and cb_IDNO.Checked and cb_IDCANCEL.Checked) then begin
+     IDButton := 'IDYES';
+     IDButton2 := 'IDNO';
+     IDButton3 := 'IDCANCEL';
+     TypeMsg := 3;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, IDButton3);
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, IDButton3);
+     end;
+  end
+
+  { selected button RETRY }
+  else if (cb_IDRETRY.Checked and not cb_IDCANCEL.Checked and not cb_IDABORT.Checked and not cb_IDIGNORE.Checked) then begin
+     IDButton := 'IDRETRY';
+     TypeMsg := 1;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, '', '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, '', '');
+     end;
+  end
+
+  { selected button RETRY and CANCEL }
+  else if (cb_IDRETRY.Checked and cb_IDCANCEL.Checked and not cb_IDABORT.Checked and not cb_IDIGNORE.Checked) then begin
+     IDButton := 'IDRETRY';
+     IDButton2 := 'IDCANCEL';
+     TypeMsg := 2;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, '');
+     end;
+  end
+
+  { selected button IGNORE }
+  else if (cb_IDIGNORE.Checked and not cb_IDCANCEL.Checked and not cb_IDABORT.Checked and not cb_IDRETRY.Checked) then begin
+     IDButton := 'IDIGNORE';
+     TypeMsg := 1;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, '', '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, '', '');
+     end;
+  end
+
+  { selected button ABORT }
+  else if (cb_IDABORT.Checked and not cb_IDCANCEL.Checked and not cb_IDRETRY.Checked and not cb_IDIGNORE.Checked) then begin
+     IDButton := 'IDABORT';
+     TypeMsg := 1;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, '', '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, '', '');
+     end;
+  end
+
+  { selected button RETRY and IGNORE }
+  else if (cb_IDRETRY.Checked and not cb_IDCANCEL.Checked and not cb_IDABORT.Checked and cb_IDIGNORE.Checked) then begin
+     IDButton := 'IDRETRY';
+     IDButton2 := 'IDIGNORE';
+     TypeMsg := 2;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, '');
+     end;
+  end
+
+  { selected button RETRY and ABORT }
+  else if (cb_IDRETRY.Checked and not cb_IDCANCEL.Checked and cb_IDABORT.Checked and not cb_IDIGNORE.Checked) then begin
+     IDButton := 'IDRETRY';
+     IDButton2 := 'IDABORT';
+     TypeMsg := 2;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, '');
+     end;
+  end
+
+  { selected button IGNORE and ABORT }
+  else if (not cb_IDRETRY.Checked and not cb_IDCANCEL.Checked and cb_IDABORT.Checked and cb_IDIGNORE.Checked) then begin
+     IDButton := 'IDIGNORE';
+     IDButton2 := 'IDABORT';
+     TypeMsg := 2;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, '');
+     end;
+  end
+
+  { selected button RETRY, IGNORE and ABORT }
+  else if (cb_IDRETRY.Checked and not cb_IDCANCEL.Checked and cb_IDABORT.Checked and cb_IDIGNORE.Checked) then begin
+     IDButton := 'IDRETRY';
+     IDButton2 := 'IDIGNORE';
+     IDButton3 := 'IDABORT';
+     TypeMsg := 3;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, IDButton3);
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, IDButton3);
+     end;
+  end
+
+  { no selected buttons }
+  else begin
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, '', '', '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, '', '', '');
+     end;
+  end;
+
+  MSGTextInsert.Add(TextMsgIf);
+end;
+
+end.

+ 5 - 2
Projects/CompMsgs.pas

@@ -125,7 +125,7 @@ const
   SCompilerStatusFilesStoring = '   Storing: %s';
   SCompilerStatusFilesStoringVersion = '   Storing: %s   (%u.%u.%u.%u)';
   SCompilerStatusCompressingSetupExe = '   Compressing Setup program executable';
-  SCompilerStatusUpdatingVersionInfo = '   Updating version info';
+  SCompilerStatusUpdatingVersionInfo = '   Updating version info (%s)';
   SCompilerStatusUpdatingIcons = '   Updating icons (%s)';
   SCompilerStatusCreatingDisk = '   Creating disk %d';
   SCompilerStatusFinished = '*** Finished.  [%s, %s elapsed]';
@@ -248,7 +248,10 @@ const
   SCompilerConstantRenamed = 'Constant "%s" has been renamed. Use "%s" instead.';
   SCompilerCommonConstantRenamed = 'Constant "%s" has been renamed. Use "%s" instead or consider using its "auto" form.';
 
-  { Area checks }
+  { Special warnings }
+  SCompilerMissingRunOnceIdsWarning = 'There are [%s] section entries without a %s parameter. '+
+    'By assigning a string to %1:s, you can ensure that a particular [%0:s] entry will only be executed once during uninstallation. ' +
+    'See the "[%0:s]" topic in help file for more information.';
   SCompilerUsedUserAreasWarning = 'The [%s] section directive "%s" is set to "%s" but per-user areas (%s) are used by the script. ' +
     'Regardless of the version of Windows, if the installation is running in administrative install mode then you should be careful about making any per-user area changes: such changes may not achieve what you are intending. ' +
     'See the "UsedUserAreasWarning" topic in help file for more information.';

+ 18 - 12
Projects/CompResUpdate.pas

@@ -2,13 +2,11 @@ unit CompResUpdate;
 
 {
   Inno Setup
-  Copyright (C) 1997-2010 Jordan Russell
+  Copyright (C) 1997-2020 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
   Resource update functions used by the compiler only
-
-  $jrsoftware: issrc/Projects/CompResUpdate.pas,v 1.25 2010/04/05 20:53:41 jr Exp $
 }
 
 interface
@@ -22,7 +20,8 @@ procedure UpdateIcons(const FileName, IcoFileName: String);
 procedure UpdateVersionInfo(const F: TFile;
   const NewBinaryFileVersion, NewBinaryProductVersion: TFileVersionNumbers;
   const NewCompanyName, NewFileDescription, NewTextFileVersion, NewLegalCopyright,
-  NewProductName, NewTextProductVersion, NewOriginalFileName: String);
+  NewProductName, NewTextProductVersion, NewOriginalFileName: String;
+  const SetFileVersionAndDescription: Boolean);
 
 implementation
 
@@ -42,7 +41,8 @@ end;
 procedure UpdateVersionInfo(const F: TFile;
   const NewBinaryFileVersion, NewBinaryProductVersion: TFileVersionNumbers;
   const NewCompanyName, NewFileDescription, NewTextFileVersion, NewLegalCopyright,
-  NewProductName, NewTextProductVersion, NewOriginalFileName: String);
+  NewProductName, NewTextProductVersion, NewOriginalFileName: String;
+  const SetFileVersionAndDescription: Boolean);
 
   function WideStrsEqual(P1, P2: PWideChar): Boolean;
 
@@ -147,7 +147,9 @@ procedure UpdateVersionInfo(const F: TFile;
     ReplaceWithRealCopyrightSymbols(Value);
   end;
 
-  procedure UpdateFixedFileInfo(P: Pointer; const Path: PWideChar; NewFileVersion, NewProductVersion: TFileVersionNumbers);
+  procedure UpdateFixedFileInfo(P: Pointer; const Path: PWideChar;
+    const NewFileVersion, NewProductVersion: TFileVersionNumbers;
+    const SetFileVersion: Boolean);
   var
     FixedFileInfo: PVSFixedFileInfo;
     ValueLen: Cardinal;
@@ -156,8 +158,10 @@ procedure UpdateVersionInfo(const F: TFile;
       Error('Unexpected version resource format (2)');
     if FixedFileInfo.dwSignature <> $FEEF04BD then
       Error('Unexpected version resource format (3)');
-    FixedFileInfo.dwFileVersionLS := NewFileVersion.LS;
-    FixedFileInfo.dwFileVersionMS := NewFileVersion.MS;
+    if SetFileVersion then begin
+      FixedFileInfo.dwFileVersionLS := NewFileVersion.LS;
+      FixedFileInfo.dwFileVersionMS := NewFileVersion.MS;
+    end;
     FixedFileInfo.dwProductVersionLS := NewProductVersion.LS;
     FixedFileInfo.dwProductVersionMS := NewProductVersion.MS;
   end;
@@ -177,13 +181,15 @@ begin
 
     { Update the resource }
     UpdateStringValue(VersRes, 'VS_VERSION_INFO'#0'StringFileInfo'#0'000004b0'#0'CompanyName'#0, NewCompanyName);
-    UpdateStringValue(VersRes, 'VS_VERSION_INFO'#0'StringFileInfo'#0'000004b0'#0'FileDescription'#0, NewFileDescription);
-    UpdateStringValue(VersRes, 'VS_VERSION_INFO'#0'StringFileInfo'#0'000004b0'#0'FileVersion'#0, NewTextFileVersion);
+    if SetFileVersionAndDescription then begin
+      UpdateStringValue(VersRes, 'VS_VERSION_INFO'#0'StringFileInfo'#0'000004b0'#0'FileDescription'#0, NewFileDescription);
+      UpdateStringValue(VersRes, 'VS_VERSION_INFO'#0'StringFileInfo'#0'000004b0'#0'FileVersion'#0, NewTextFileVersion);
+    end;
     UpdateStringValue(VersRes, 'VS_VERSION_INFO'#0'StringFileInfo'#0'000004b0'#0'LegalCopyright'#0, NewLegalCopyright);
     UpdateStringValue(VersRes, 'VS_VERSION_INFO'#0'StringFileInfo'#0'000004b0'#0'ProductName'#0, NewProductName);
     UpdateStringValue(VersRes, 'VS_VERSION_INFO'#0'StringFileInfo'#0'000004b0'#0'OriginalFileName'#0, NewOriginalFileName);
     UpdateStringValue(VersRes, 'VS_VERSION_INFO'#0'StringFileInfo'#0'000004b0'#0'ProductVersion'#0, NewTextProductVersion);
-    UpdateFixedFileInfo(VersRes, 'VS_VERSION_INFO'#0, NewBinaryFileVersion, NewBinaryProductVersion);
+    UpdateFixedFileInfo(VersRes, 'VS_VERSION_INFO'#0, NewBinaryFileVersion, NewBinaryProductVersion, SetFileVersionAndDescription);
 
     { Write the updated resource }
     F.Seek(ResOffset);
@@ -310,7 +316,7 @@ begin
       if M = 0 then
         ErrorWithLastError('LoadLibraryEx failed (1)');
       try
-      	{ Load the 'MAINICON' group icon resource }
+        { Load the 'MAINICON' group icon resource }
         R := FindResource(M, 'MAINICON', RT_GROUP_ICON);
         if R = 0 then
           ErrorWithLastError('FindResource failed (1)');

+ 3 - 6
Projects/CompSignTools.pas

@@ -2,20 +2,17 @@ unit CompSignTools;
 
 {
   Inno Setup
-  Copyright (C) 1997-2010 Jordan Russell
+  Copyright (C) 1997-2020 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
   Compiler SignTools form
-
-  $jrsoftware: issrc/Projects/CompSignTools.pas,v 1.3 2010/03/24 18:34:14 mlaan Exp $
 }
 
 interface
 
 uses
-  Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
-  StdCtrls, UIStateForm;
+    Classes, Controls, StdCtrls, UIStateForm;
 
 type
   TSignToolsForm = class(TUIStateForm)
@@ -49,7 +46,7 @@ type
 implementation
 
 uses
-  CmnFunc, CompForm, SysUtils;
+  Windows, Messages, CompForm, CmnFunc, Dialogs, SysUtils;
 
 {$R *.DFM}
 

+ 225 - 3
Projects/CompStartup.dfm

@@ -20,6 +20,228 @@ object StartupForm: TStartupForm
     419)
   PixelsPerInch = 96
   TextHeight = 13
+  object DonateImage: TImage
+    Left = 8
+    Top = 383
+    Width = 62
+    Height = 31
+    Cursor = crHandPoint
+    Hint = 'Support Inno Setup - Thank you!'
+    Anchors = [akLeft, akBottom]
+    AutoSize = True
+    ParentShowHint = False
+    Picture.Data = {
+      07544269746D6170F60B0000424DF60B00000000000036040000280000003E00
+      00001F0000000100080000000000C0070000C40E0000C40E0000000100000001
+      000000000000663300006F3F0F004D36220070401000794C1D0073482400794D
+      200082582C0081573200835930008C643B00996633009F6F3E008C664000926E
+      4E009F70400095704900967350009E7D5800A5784A00A6794D00AC815500AC83
+      5900A0806000A8896700A2836800B28A6100B38C6600B8936C00A98D7000B195
+      7500B2997F00BE9D7800BAA18300BFA08000B8A08800BCA58F00BDA79400BBBB
+      BB00C4A68300C6A98D00CAAE8E00C4AD9200C5B29F00CCB29900D1B79A00CAB7
+      A400CDBAA100CFBFAF00D2BCA500D7C0A500D6C6AF00D3C4B400D9C5B200DDCA
+      B100D9CCBF00E0D2BE00E3D3BC00DAD5D100E2D9CF00E5D9CC00E9DCC800E9DE
+      CD00E5DCD200E9E1D700ECE5DF00F0E5D300F3EBDB00F6EEDF00E9E9E900F2EC
+      E500F4F1EE00F5F2EF00FCF7EA00F9F5F200FFFFFF0000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000060603030303030303030303030303030303030303030303030303030303
+      0303030303030303030303030303030303030303030303030303030303030303
+      0000094135272727272727272727272727272727272727272727272727272727
+      2727272727272727272727272727272727272727272727272727272727272603
+      00000F4C48464646464646464646464646464646464646464646464646464646
+      4646464646464646464646464646464646464646464646464646464646413506
+      00001A4C4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A
+      4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4C4C06
+      00001A4C4C4C4C4C4C4C4C4C4C4C4C000000004C4C4C0000004C4C004C4C4C00
+      4C4C004C4C4C004C4C4C004C4C4C000000004C4C4C4C4C4C4C4C4C4C4C483B06
+      00001A4C4A4A4A4A4A4A4A4A4A4A4A004A4A4A004A004A4A4A004A004A4A0000
+      4A4A004A4A4A004A4A4A004A4A4A004A4A4A4A4A4A4A4A4A4A4A4A4A4A483B06
+      00001A4C4C4C4C4C4C4C4C4C4C4C4C004C4C4C004C004C4C4C004C004C004C00
+      4C4C00000000004C4C4C004C4C4C0000004C4C4C4C4C4C4C4C4C4C4C4C483B06
+      00001A4C4A4A4A4A4A4A4A4A4A4A4A004A4A4A004A004A4A4A004A00004A4A00
+      4A4A004A4A4A004A4A4A004A4A4A004A4A4A4A4A4A4A4A4A4A4A4A4A4A483B06
+      00001A4C4C4C4C4C4C4C4C4C4C4C4C000000004C4C4C0000004C4C004C4C4C00
+      4C4C4C0000004C4C00000000004C000000004C4C4C4C4C4C4C4C4C4C4C483B06
+      00001A4C4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A
+      4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A483B06
+      00001A4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C483B06
+      00001A4C4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A
+      4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A483B06
+      00001A4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C312025494C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C483B06
+      00001A4C4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A1F0101114A4A
+      4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A483B06
+      00001A4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C070101384C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C483B06
+      00001A4C4A4A4A4A4A4A4A4A4A4A4A4A4A4A3F34394A4A4A4A4A4A300101054A
+      4A4A4A4A4A4A4A4A4A4A4A4A4A3E3A454A4A4A4A4A4A4A4A4A4A4A4A4A483B06
+      00001A4C4C4C4C4C01010E4C4C4C4C4C4C2C0101010E01010A4C4C3801010120
+      4C4C360C0C2D4C4C4C4C4C4C230C0C0C1C0C0C293D0C0C324C4C4C4C4C483B06
+      00001A4C4A4A4A4A020101444A4A4A4A4A02010108080101013F4A1F01010102
+      3F4A3A0C0C164A4A4A4A4A3E0C0C0C1B140C0C16430C0C1D4A4A4A4A4A483B06
+      00001A4C4C4C4C4C0E0101314C4C4C4C4C070101494C1E0101314C1801010101
+      124C4C0C0C0C4B4C4C4C4C470C0C174C4C170C0C4B100C104C4C4C4C4C483B06
+      00001A4C4A4A4A4A1F0101050B111F394A2201010519130101194A0B01010501
+      01344A1B0C0C161B282E434A1B0C0C162A1B0C0C371D0C0C434A4A4A4A483B06
+      00001A4C4C4C4C4C38010101010101010E49310E01010101010A4C0401043801
+      01074C2D0C0C0C0C0C0C0C294B2D150C0C0C0C0C292D0C0C364C4C4C4C483B06
+      00001A4C4A4A4A4A4A01010119190201010844394A3F340501014401010B4A11
+      01011F3A0C0C0D2A210C0C0C2843434A3A370C0C1B3A0C0C214A4A4A4A483B06
+      00001A4C4C4C4C4C4C0E0101384C490401012001040E070101013801011E4C42
+      040104400C0C0C4C4C3D0C0C0C2D0C171C100C0C1C4C0C0C174C4C4C4C483B06
+      00001A4C4A4A4A4A4A1901011F4A4A0801012B05010101010222340101224A4A
+      1F010111160C0C3E4A450C0C0C3E0C0C0C0C0C143A4A160C0C454A4A4A483B06
+      00001A4C4C4C4C4C4C310101040E0A010101384C4C3C38424C4C4C38384C4C4C
+      4C3C3838290C0C151C150C0C0C4C4C4B3D3D474C4C4C290C0C3D4C4C4C483B06
+      00001A4C4A4A4A4A4A4401010101010101134A4A4A4A4A4A4A4A4A4A4A4A4A4A
+      4A4A4A4A370C0C0C0C0C0C0C334A4A4A4A4A4A4A4A4A370C0C2A3A4A4A483B06
+      00001A4C4C4C4C4C4C4C3120202020253C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4B2D2D2D2D2D36474C4C4C4C4C4C4C4C4C4C4C322D323D4C4C483B06
+      00001A4C4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A
+      4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4C4606
+      0000244C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C06
+      0000244A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A
+      4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A09
+      0000262F26262626262626262626262626262626262626262626262626262626
+      2626262626262626262626262626262626262626262626262626262626241A0F
+      0000}
+    ShowHint = True
+    OnClick = DonateImageClick
+  end
+  object MailingListImage: TImage
+    Left = 78
+    Top = 383
+    Width = 62
+    Height = 31
+    Cursor = crHandPoint
+    Hint = 'Be notified by e-mail of new Inno Setup releases'
+    Anchors = [akLeft, akBottom]
+    AutoSize = True
+    ParentShowHint = False
+    Picture.Data = {
+      07544269746D6170F60B0000424DF60B00000000000036040000280000003E00
+      00001F0000000100080000000000C0070000C40E0000C40E0000000100000001
+      0000000000005D2E03005F2F0200512C0A00532C0900542D0800602F0100612F
+      0100622F0000632F000063330200643000006432010066320000673300006936
+      03006A3603006E3A0700663B0F006B3A09006D3A08006F3B08006E3C0A006F3D
+      0C00703C0800713D0B00713F0D00723E0C00733F0C004D36220074400D007541
+      0F007A461300734824007F5B37008E5B2A008F5B29008F5D2B008E5E2E008F5E
+      2D00905E2C00915E2C0081573200875D3200805B3600815B3600845C34008C5E
+      300093602E008D633A0091643700926436009364360095653500966534009765
+      34009865330090643800926E4E00B3815000B4815000B7855300B4855400B588
+      5B00BA8B5B00A2836800D19F6E00DBAD7E00DDAD7C00B8A08800BDA79400BBBB
+      BB00E1B58A00E3B68900CAB7A400D3BBA200D4BBA100D7C1AA00DBC3AA00D3C4
+      B400DFCFBB00DAD5D100E0D4C300E6DFCF00E9E0CF00E8E1D100E9E1D100E9E1
+      D700E9E9E900F2F0E300F1F0E400FCF7E500FCF8E200FCF8E400F4F1EE00F5F5
+      ED00F6F6EF00FCF7E900F8F8F200F9F9F200FCFCF600FDFDF600FEFEF900FFFF
+      FA00FFFFFE000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000021211D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D
+      1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D
+      00002A574F474747474747474747474747474747474747474747474747474747
+      474747474747474747474747474747474747474747474747474747474747461D
+      00003A685E585858585858585858585858585858585858585858585858585858
+      5858585858585858585858585858585858585858585858585858585858574F21
+      0000416861616161616161616161616161616161616161616161616161616161
+      6161616161616161616161616161616161616161616161616161616161686821
+      0000416868680000000068686800000068680000000068680000000068686800
+      00006868006868680068000000000068000000006868000000000068685E5121
+      0000416861616161616100610061616100610061616100616161616100610061
+      61610061006161610061616100616161006161610061006161616161615E5121
+      0000416868686800000068680068686800680000000068686800000068680068
+      68686868000000006868686800686868000000006868000000006868685E5121
+      0000416861610061616161610061616100610061616100610061616161610061
+      61610061006161610061616100616161006161610061006161616161615E5121
+      0000416868686800000000680068686800680000000068686800000000686800
+      00006868000000006868000000000068000000006868000000000068685E5121
+      0000416861616161616161616161616161616161616161616161616161616161
+      61616161616161616161616161616161616161616161616161616161615E5121
+      0000416868686868686868686868686868686868686868686868686868686868
+      68686868686868686868686868686868686868686868686868686868685E5121
+      0000416861616161616161616161616161616161616161616161616161616161
+      61616161616161616161616161616161616161616161616161616161615E5121
+      0000416868686868686868686868686868686868686868686867676767676767
+      67676767676767676768686868686868686868686868686868686868685E5121
+      00004168616161616161616161616161616161616161615D1A09090909080809
+      09090909090909091C5C616161616161616161616161616161616161615E5121
+      0000416868686868686868686868686868686868686868121437363331313235
+      3838383838383838181C676868686868686868686868686868686868685E5121
+      0000416861616161616161616161616161616161616161052B67686868686867
+      676767676767676729095C6161616161616161616161616161616161615E5121
+      0000416868686868686868686868686868686868686868042D68686868685F4D
+      424D6068686868672909676868686868686868686868686868686868685E5121
+      000041686161616161616161616161616161616161616105226868686752240B
+      0B0925526768686729095D6161616161616161616161616161616161615E5121
+      0000416868686868686868686868686868686868686868052C68686448130F3D
+      4E3E1014496468672909676868686868686868686868686868686868685E5121
+      0000416861616161616161616161616161616161616161032E68633F0A174B66
+      68664C190E40626727075D6161616161616161616161616161616161615E5121
+      00004168686868686868686868686868686868686868680326532F0723556868
+      68686856240930542907676868686868686868686868686868686868685E5121
+      0000416861616161616161616161616161616161616161011F200C3B5A686868
+      68686868593C0D201F095D6161616161616161616161616161616161615E5121
+      0000416868686868686868686868686868686868686868080B15436568686868
+      68686868686544150909676868686868686868686868686868686868685E5121
+      000041686161616161616161616161616161616161615B081E50666868686868
+      68686868686866501B095D6161616161616161616161616161616161615E5121
+      0000416868686868686868686868686868686868686868072867686868686868
+      68686868686867672909676868686868686868686868686868686868685E5121
+      000041686161616161616161616161616161616161615B161135393932323334
+      3333333436373838111B5D6161616161616161616161616161616161615E5121
+      0000416868686868686868686868686868686868686868671C08060602060606
+      070707070909090B1E67686868686868686868686868686868686868685E5121
+      0000416861616161616161616161616161616161616161615B5B5B5D5D5B5B5B
+      5B5B5B5B5B5B5D5D5D6161616161616161616161616161616161616161685821
+      0000456868686868686868686868686868686868686868686868686868686868
+      6868686868686868686868686868686868686868686868686868686868686821
+      0000456161616161616161616161616161616161616161616161616161616161
+      616161616161616161616161616161616161616161616161616161616161612A
+      0000464A46464646464646464646464646464646464646464646464646464646
+      464646464646464646464646464646464646464646464646464646464645413A
+      0000}
+    ShowHint = True
+    OnClick = MailingListImageClick
+  end
   object OKButton: TButton
     Left = 418
     Top = 387
@@ -128,9 +350,9 @@ object StartupForm: TStartupForm
     end
   end
   object StartupCheck: TCheckBox
-    Left = 8
-    Top = 394
-    Width = 379
+    Left = 152
+    Top = 390
+    Width = 260
     Height = 17
     TabStop = False
     Anchors = [akLeft, akRight, akBottom]

+ 18 - 7
Projects/CompStartup.pas

@@ -33,6 +33,8 @@ type
     StartupCheck: TCheckBox;
     NewImage: TImage;
     OpenImage: TImage;
+    DonateImage: TImage;
+    MailingListImage: TImage;
     procedure RadioButtonClick(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure DblClick_(Sender: TObject);
@@ -40,16 +42,18 @@ type
     procedure OKButtonClick(Sender: TObject);
     procedure FormAfterMonitorDpiChanged(Sender: TObject; OldDPI,
       NewDPI: Integer);
+    procedure DonateImageClick(Sender: TObject);
+    procedure MailingListImageClick(Sender: TObject);
   private
     FResult: TStartupFormResult;
     FResultFileName: TFileName;
-    procedure SetMRUList(const MRUList: TStringList);
+    procedure SetMRUFilesList(const MRUFilesList: TStringList);
     procedure UpdateImages;
   protected
     procedure CreateWnd; override;
     procedure CreateParams(var Params: TCreateParams); override;
   public
-    property MRUList: TStringList write SetMRUList;
+    property MRUFilesList: TStringList write SetMRUFilesList;
     property Result: TStartupFormResult read FResult;
     property ResultFileName: TFileName read FResultFileName;
   end;
@@ -61,12 +65,9 @@ uses
 
 {$R *.DFM}
 
-procedure TStartupForm.SetMRUList(const MRUList: TStringList);
-var
-  I: Integer;
+procedure TStartupForm.SetMRUFilesList(const MRUFilesList: TStringList);
 begin
-  for I := 0 to MRUList.Count-1 do
-    OpenListBox.Items.Add(MRUList[I]);
+  OpenListBox.Items.AddStrings(MRUFilesList);
   UpdateHorizontalExtent(OpenListBox);
 end;
 
@@ -145,6 +146,16 @@ begin
   OpenRadioButton.Checked := True;
 end;
 
+procedure TStartupForm.DonateImageClick(Sender: TObject);
+begin
+  OpenDonateSite;
+end;
+
+procedure TStartupForm.MailingListImageClick(Sender: TObject);
+begin
+  OpenMailingListSite;
+end;
+
 procedure TStartupForm.OKButtonClick(Sender: TObject);
 begin
   if EmptyRadioButton.Checked then

+ 3 - 1
Projects/Compil32.dpr

@@ -35,10 +35,12 @@ uses
   DebugStruct in 'DebugStruct.pas',
   BrowseFunc in 'BrowseFunc.pas',
   CompSignTools in 'CompSignTools.pas' {SignToolsForm},
+  CompInputQueryCombo in 'CompInputQueryCombo.pas' {InputQueryCombo},
   ScintInt in '..\Components\ScintInt.pas',
   ScintEdit in '..\Components\ScintEdit.pas',
   ScintStylerInnoSetup in '..\Components\ScintStylerInnoSetup.pas',
-  ModernColors in '..\Components\ModernColors.pas';
+  ModernColors in '..\Components\ModernColors.pas',
+  CompMessageBoxDesigner in 'CompMessageBoxDesigner.pas' {MBDForm};
 
 {$R *.res}
 {$R Compil32.manifest.res}

+ 6 - 0
Projects/Compil32.dproj

@@ -77,6 +77,12 @@
 			<DCCReference Include="CompSignTools.pas">
 				<Form>SignToolsForm</Form>
 			</DCCReference>
+			<DCCReference Include="CompInputQueryCombo.pas">
+				<Form>InputQueryCombo</Form>
+			</DCCReference>
+			<DCCReference Include="CompMessageBoxDesigner.pas">
+				<Form>MBDForm</Form>
+			</DCCReference>
 			<DCCReference Include="..\Components\ScintInt.pas"/>
 			<DCCReference Include="..\Components\ScintEdit.pas"/>
 			<DCCReference Include="..\Components\ScintStylerInnoSetup.pas"/>

BIN
Projects/Compil32.res


+ 72 - 212
Projects/Compile.pas

@@ -37,7 +37,7 @@ uses
   CompPreprocInt, Commctrl, {$IFDEF IS_DXE2}Vcl.Consts{$ELSE}Consts{$ENDIF}, Classes, IniFiles, TypInfo, AnsiStrings, Math,
   PathFunc, CmnFunc2, Struct, Int64Em, CompMsgs, SetupEnt,
   FileClass, Compress, CompressZlib, bzlib, LZMA, ArcFour, SHA1,
-  MsgIDs, DebugStruct, VerInfo, ResUpdate, CompResUpdate,
+  MsgIDs, SetupSectionDirectives, LangOptionsSectionDirectives, DebugStruct, VerInfo, ResUpdate, CompResUpdate,
 {$IFDEF STATICPREPROC}
   IsppPreprocess,
 {$ENDIF}
@@ -55,177 +55,6 @@ type
 
   TEnumIniSectionProc = procedure(const Line: PChar; const Ext: Integer) of object;
 
-  TSetupSectionDirectives = (
-    ssAllowCancelDuringInstall,
-    ssAllowNetworkDrive,
-    ssAllowNoIcons,
-    ssAllowRootDirectory,
-    ssAllowUNCPath,
-    ssAlwaysRestart,
-    ssAlwaysShowComponentsList,
-    ssAlwaysShowDirOnReadyPage,
-    ssAlwaysShowGroupOnReadyPage,
-    ssAlwaysUsePersonalGroup,
-    ssAppCopyright,
-    ssAppendDefaultDirName,
-    ssAppendDefaultGroupName,
-    ssAppComments,
-    ssAppContact,
-    ssAppId,
-    ssAppModifyPath,
-    ssAppMutex,
-    ssAppName,
-    ssAppPublisher,
-    ssAppPublisherURL,
-    ssAppReadmeFile,
-    ssAppSupportPhone,
-    ssAppSupportURL,
-    ssAppUpdatesURL,
-    ssAppVerName,
-    ssAppVersion,
-    ssArchitecturesAllowed,
-    ssArchitecturesInstallIn64BitMode,
-    ssASLRCompatible,
-    ssBackColor,
-    ssBackColor2,
-    ssBackColorDirection,
-    ssBackSolid,
-    ssChangesAssociations,
-    ssChangesEnvironment,
-    ssCloseApplications,
-    ssCloseApplicationsFilter,
-    ssCompression,
-    ssCompressionThreads,
-    ssCreateAppDir,
-    ssCreateUninstallRegKey,
-    ssDefaultDialogFontName,
-    ssDefaultDirName,
-    ssDefaultGroupName,
-    ssDefaultUserInfoName,
-    ssDefaultUserInfoOrg,
-    ssDefaultUserInfoSerial,
-    ssDEPCompatible,
-    ssDirExistsWarning,
-    ssDisableDirPage,
-    ssDisableFinishedPage,
-    ssDisableProgramGroupPage,
-    ssDisableReadyMemo,
-    ssDisableReadyPage,
-    ssDisableStartupPrompt,
-    ssDisableWelcomePage,
-    ssDiskClusterSize,
-    ssDiskSliceSize,
-    ssDiskSpanning,
-    ssDontMergeDuplicateFiles,
-    ssEnableDirDoesntExistWarning,
-    ssEncryption,
-    ssExtraDiskSpaceRequired,
-    ssFlatComponentsList,
-    ssInfoAfterFile,
-    ssInfoBeforeFile,
-    ssInternalCompressLevel,
-    ssLanguageDetectionMethod,
-    ssLicenseFile,
-    ssLZMAAlgorithm,
-    ssLZMABlockSize,
-    ssLZMADictionarySize,
-    ssLZMAMatchFinder,
-    ssLZMANumBlockThreads,
-    ssLZMANumFastBytes,
-    ssLZMAUseSeparateProcess,
-    ssMergeDuplicateFiles,
-    ssMessagesFile,
-    ssMinVersion,
-    ssOnlyBelowVersion,
-    ssOutput,
-    ssOutputBaseFilename,
-    ssOutputDir,
-    ssOutputManifestFile,
-    ssPassword,
-    ssPrivilegesRequired,
-    ssPrivilegesRequiredOverridesAllowed,
-    ssReserveBytes,
-    ssRestartApplications,
-    ssRestartIfNeededByRun,
-    ssSetupIconFile,
-    ssSetupLogging,
-    ssSetupMutex,
-    ssShowComponentSizes,
-    ssShowLanguageDialog,
-    ssShowTasksTreeLines,
-    ssShowUndisplayableLanguages,
-    ssSignedUninstaller,
-    ssSignedUninstallerDir,
-    ssSignTool,
-    ssSignToolMinimumTimeBetween,
-    ssSignToolRetryCount,
-    ssSignToolRetryDelay,
-    ssSignToolRunMinimized,
-    ssSlicesPerDisk,
-    ssSolidCompression,
-    ssSourceDir,
-    ssTerminalServicesAware,
-    ssTimeStampRounding,
-    ssTimeStampsInUTC,
-    ssTouchDate,
-    ssTouchTime,
-    ssUpdateUninstallLogAppName,
-    ssUninstallable,
-    ssUninstallDisplayIcon,
-    ssUninstallDisplayName,
-    ssUninstallDisplaySize,
-    ssUninstallFilesDir,
-    ssUninstallIconFile,
-    ssUninstallLogMode,
-    ssUninstallRestartComputer,
-    ssUninstallStyle,
-    ssUsedUserAreasWarning,
-    ssUsePreviousAppDir,
-    ssUsePreviousGroup,
-    ssUsePreviousLanguage,
-    ssUsePreviousPrivileges,
-    ssUsePreviousSetupType,
-    ssUsePreviousTasks,
-    ssUsePreviousUserInfo,
-    ssUseSetupLdr,
-    ssUserInfoPage,
-    ssVersionInfoCompany,
-    ssVersionInfoCopyright,
-    ssVersionInfoDescription,
-    ssVersionInfoOriginalFileName,
-    ssVersionInfoProductName,
-    ssVersionInfoProductVersion,
-    ssVersionInfoProductTextVersion,
-    ssVersionInfoTextVersion,
-    ssVersionInfoVersion,
-    ssWindowResizable,
-    ssWindowShowCaption,
-    ssWindowStartMaximized,
-    ssWindowVisible,
-    ssWizardImageAlphaFormat,
-    ssWizardImageBackColor,
-    ssWizardImageFile,
-    ssWizardImageStretch,
-    ssWizardResizable,
-    ssWizardSmallImageBackColor,
-    ssWizardSmallImageFile,
-    ssWizardSizePercent,
-    ssWizardStyle);
-  TLangOptionsSectionDirectives = (
-    lsCopyrightFontName,
-    lsCopyrightFontSize,
-    lsDialogFontName,
-    lsDialogFontSize,
-    lsDialogFontStandardHeight,
-    lsLanguageCodePage,
-    lsLanguageID,
-    lsLanguageName,
-    lsRightToLeft,
-    lsTitleFontName,
-    lsTitleFontSize,
-    lsWelcomeFontName,
-    lsWelcomeFontSize);
-
   TAllowedConst = (acOldData, acBreak);
   TAllowedConsts = set of TAllowedConst;
 
@@ -357,7 +186,7 @@ type
     FileLocationEntryFilenames: THashStringList;
     WarningsList: THashStringList;
     ExpectedCustomMessageNames: TStringList;
-    UsedUserAreasWarning: Boolean;
+    MissingRunOnceIdsWarning, MissingRunOnceIds, UsedUserAreasWarning: Boolean;
     UsedUserAreas: TStringList;
 
     DefaultLangData: TLangData;
@@ -386,7 +215,7 @@ type
 
     SetupHeader: TSetupHeader;
 
-    SetupDirectiveLines: array[TSetupSectionDirectives] of Integer;
+    SetupDirectiveLines: array[TSetupSectionDirective] of Integer;
     UseSetupLdr, DiskSpanning, BackSolid, TerminalServicesAware, DEPCompatible, ASLRCompatible: Boolean;
     DiskSliceSize, DiskClusterSize, SlicesPerDisk, ReserveBytes: Longint;
     LicenseFile, InfoBeforeFile, InfoAfterFile, WizardImageFile: String;
@@ -2100,6 +1929,7 @@ begin
 
   Lines := TLowFragStringList.Create;
   try
+    Data.Compiler.AddStatus(Format(SCompilerStatusReadingInFile, [FileName]));
     F := TTextFileReader.Create(Filename, fdOpenExisting, faRead, fsRead);
     try
       F.CodePage := Data.AnsiConvertCodePage;
@@ -2890,21 +2720,21 @@ const
   UserConsts: array[0..3] of String = (
     'userpf', 'usercf', 'usersavedgames', 'username');
   Consts: array[0..42] of String = (
-    'src', 'srcexe', 'tmp', 'app', 'win', 'sys', 'sd', 'groupname', 'fonts', 'hwnd',
+    'src', 'srcexe', 'tmp', 'app', 'win', 'sys', 'sd', 'groupname', 'commonfonts', 'hwnd',
     'commonpf', 'commonpf32', 'commonpf64', 'commoncf', 'commoncf32', 'commoncf64',
     'autopf', 'autopf32', 'autopf64', 'autocf', 'autocf32', 'autocf64',
     'computername', 'dao', 'cmd', 'wizardhwnd', 'sysuserinfoname', 'sysuserinfoorg',
     'userinfoname', 'userinfoorg', 'userinfoserial', 'uninstallexe',
     'language', 'syswow64', 'sysnative', 'log', 'dotnet11', 'dotnet20', 'dotnet2032',
     'dotnet2064', 'dotnet40', 'dotnet4032', 'dotnet4064');
-  UserShellFolderConsts: array[0..8] of String = (
+  UserShellFolderConsts: array[0..9] of String = (
     'userdesktop', 'userstartmenu', 'userprograms', 'userstartup',
-    'userappdata', 'userdocs', 'usertemplates', 'userfavorites', 'usersendto');
-  ShellFolderConsts: array[0..16] of String = (
+    'userappdata', 'userdocs', 'usertemplates', 'userfavorites', 'usersendto', 'userfonts');
+  ShellFolderConsts: array[0..17] of String = (
     'group', 'commondesktop', 'commonstartmenu', 'commonprograms', 'commonstartup',
     'commonappdata', 'commondocs', 'commontemplates', 'localappdata',
     'autodesktop', 'autostartmenu', 'autoprograms', 'autostartup',
-    'autoappdata', 'autodocs', 'autotemplates', 'autofavorites');
+    'autoappdata', 'autodocs', 'autotemplates', 'autofavorites', 'autofonts');
   AllowedConstsNames: array[TAllowedConst] of String = (
     'olddata', 'break');
 var
@@ -3535,7 +3365,7 @@ procedure TSetupCompiler.EnumSetupProc(const Line: PChar; const Ext: Integer);
 var
   KeyName, Value: String;
   I: Integer;
-  Directive: TSetupSectionDirectives;
+  Directive: TSetupSectionDirective;
 
   procedure Invalid;
   begin
@@ -3742,10 +3572,10 @@ begin
 
   if KeyName = '' then
     Exit;
-  I := GetEnumValue(TypeInfo(TSetupSectionDirectives), 'ss' + KeyName);
+  I := GetEnumValue(TypeInfo(TSetupSectionDirective), 'ss' + KeyName);
   if I = -1 then
     AbortCompileOnLineFmt(SCompilerUnknownDirective, ['Setup', KeyName]);
-  Directive := TSetupSectionDirectives(I);
+  Directive := TSetupSectionDirective(I);
   if (Directive <> ssSignTool) and (SetupDirectiveLines[Directive] <> 0) then
     AbortCompileOnLineFmt(SCompilerEntryAlreadySpecified, ['Setup', KeyName]);
   SetupDirectiveLines[Directive] := LineNumber;
@@ -4145,6 +3975,9 @@ begin
         if SetupHeader.MinVersion.NTVersion < $06000000 then
           AbortCompileOnLineFmt(SCompilerMinVersionNTTooLow, ['6.0']);
       end;
+    ssMissingRunOnceIdsWarning: begin
+        MissingRunOnceIdsWarning := StrToBool(Value);
+      end;
     ssOnlyBelowVersion: begin
         if not StrToVersionNumbers(Value, SetupHeader.OnlyBelowVersion) then
           Invalid;
@@ -4152,7 +3985,7 @@ begin
     ssOutput: begin
         if not FixedOutput then
           Output := StrToBool(Value);
-		end;
+    end;
     ssOutputBaseFilename: begin
         if not FixedOutputBaseFilename then
           OutputBaseFilename := Value;
@@ -4512,7 +4345,7 @@ procedure TSetupCompiler.EnumLangOptionsPreProc(const Line: PChar; const Ext: In
     const PreLangData: TPreLangData; const AffectsMultipleLangs: Boolean);
   var
     I: Integer;
-    Directive: TLangOptionsSectionDirectives;
+    Directive: TLangOptionsSectionDirective;
 
     procedure Invalid;
     begin
@@ -4529,10 +4362,10 @@ procedure TSetupCompiler.EnumLangOptionsPreProc(const Line: PChar; const Ext: In
     end;
 
   begin
-    I := GetEnumValue(TypeInfo(TLangOptionsSectionDirectives), 'ls' + KeyName);
+    I := GetEnumValue(TypeInfo(TLangOptionsSectionDirective), 'ls' + KeyName);
     if I = -1 then
       AbortCompileOnLineFmt(SCompilerUnknownDirective, ['LangOptions', KeyName]);
-    Directive := TLangOptionsSectionDirectives(I);
+    Directive := TLangOptionsSectionDirective(I);
     case Directive of
       lsLanguageCodePage: begin
           if AffectsMultipleLangs then
@@ -4566,7 +4399,7 @@ procedure TSetupCompiler.EnumLangOptionsProc(const Line: PChar; const Ext: Integ
     var LangOptions: TSetupLanguageEntry; const AffectsMultipleLangs: Boolean);
   var
     I: Integer;
-    Directive: TLangOptionsSectionDirectives;
+    Directive: TLangOptionsSectionDirective;
 
     procedure Invalid;
     begin
@@ -4614,10 +4447,10 @@ procedure TSetupCompiler.EnumLangOptionsProc(const Line: PChar; const Ext: Integ
     end;
 
   begin
-    I := GetEnumValue(TypeInfo(TLangOptionsSectionDirectives), 'ls' + KeyName);
+    I := GetEnumValue(TypeInfo(TLangOptionsSectionDirective), 'ls' + KeyName);
     if I = -1 then
       AbortCompileOnLineFmt(SCompilerUnknownDirective, ['LangOptions', KeyName]);
-    Directive := TLangOptionsSectionDirectives(I);
+    Directive := TLangOptionsSectionDirective(I);
     case Directive of
       lsCopyrightFontName: begin
           LangOptions.CopyrightFontName := Trim(Value);
@@ -5186,8 +5019,8 @@ procedure TSetupCompiler.EnumIconsProc(const Line: PChar; const Ext: Integer);
 
 type
   TParam = (paFlags, paName, paFilename, paParameters, paWorkingDir, paHotKey,
-    paIconFilename, paIconIndex, paComment, paAppUserModelID, paComponents, paTasks,
-    paLanguages, paCheck, paBeforeInstall, paAfterInstall, paMinVersion,
+    paIconFilename, paIconIndex, paComment, paAppUserModelID, paAppUserModelToastActivatorCLSID,
+    paComponents, paTasks, paLanguages, paCheck, paBeforeInstall, paAfterInstall, paMinVersion,
     paOnlyBelowVersion);
 const
   ParamIconsName = 'Name';
@@ -5199,6 +5032,7 @@ const
   ParamIconsIconIndex = 'IconIndex';
   ParamIconsComment = 'Comment';
   ParamIconsAppUserModelID = 'AppUserModelID';
+  ParamIconsAppUserModelToastActivatorCLSID = 'AppUserModelToastActivatorCLSID';
   ParamInfo: array[TParam] of TParamInfo = (
     (Name: ParamCommonFlags; Flags: []),
     (Name: ParamIconsName; Flags: [piRequired, piNoEmpty, piNoQuotes]),
@@ -5210,6 +5044,7 @@ const
     (Name: ParamIconsIconIndex; Flags: []),
     (Name: ParamIconsComment; Flags: []),
     (Name: ParamIconsAppUserModelID; Flags: []),
+    (Name: ParamIconsAppUserModelToastActivatorCLSID; Flags: []),
     (Name: ParamCommonComponents; Flags: []),
     (Name: ParamCommonTasks; Flags: []),
     (Name: ParamCommonLanguages; Flags: []),
@@ -5290,8 +5125,13 @@ begin
       { Comment }
       Comment := Values[paComment].Data;
 
-      { AppUserModelID }
+      { AppUserModel }
       AppUserModelID := Values[paAppUserModelID].Data;
+      S := Values[paAppUserModelToastActivatorCLSID].Data;
+      if S <> '' then begin
+        AppUserModelToastActivatorCLSID := StringToGUID('{' + S + '}');
+        Include(Options, ioHasAppUserModelToastActivatorCLSID);
+      end;
 
       { Common parameters }
       ProcessExpressionParameter(ParamCommonComponents, Values[paComponents].Data, EvalComponentIdentifier, True, Components);
@@ -5311,13 +5151,12 @@ begin
       if (IconIndex <> 0) and (IconFilename = '') then
         IconFilename := Filename;
 
-      S := IconName;
-      if Copy(S, 1, 8) = '{group}\' then
-        Delete(S, 1, 8);
-
       CheckCheckOrInstall(ParamCommonCheck, Check, cikCheck);
       CheckCheckOrInstall(ParamCommonBeforeInstall, BeforeInstall, cikInstall);
       CheckCheckOrInstall(ParamCommonAfterInstall, AfterInstall, cikInstall);
+      S := IconName;
+      if Copy(S, 1, 8) = '{group}\' then
+        Delete(S, 1, 8);
       CheckConst(S, MinVersion, []);
       CheckConst(Filename, MinVersion, []);
       CheckConst(Parameters, MinVersion, []);
@@ -6748,12 +6587,12 @@ const
     (Name: ParamCommonAfterInstall; Flags: []),
     (Name: ParamCommonMinVersion; Flags: []),
     (Name: ParamCommonOnlyBelowVersion; Flags: []));
-  Flags: array[0..17] of PChar = (
+  Flags: array[0..18] of PChar = (
     'nowait', 'waituntilidle', 'shellexec', 'skipifdoesntexist',
     'runminimized', 'runmaximized', 'showcheckbox', 'postinstall',
     'unchecked', 'skipifsilent', 'skipifnotsilent', 'hidewizard',
     'runhidden', 'waituntilterminated', '32bit', '64bit', 'runasoriginaluser',
-    'runascurrentuser');
+    'runascurrentuser', 'dontlogparameters');
 var
   Values: array[TParam] of TParamValue;
   NewRunEntry: PSetupRunEntry;
@@ -6833,6 +6672,7 @@ begin
                RunAsOriginalUser := True;
              end;
           17: RunAsCurrentUser := True;
+          18: Include(Options, roDontLogParameters);
         end;
 
       if not WaitFlagSpecified then begin
@@ -6859,8 +6699,11 @@ begin
       WorkingDir := Values[paWorkingDir].Data;
 
       { RunOnceId }
-      if (Ext = 0) and (Values[paRunOnceId].Data <> '') then
-        AbortCompileOnLine(SCompilerRunCantUseRunOnceId);
+      if Values[paRunOnceId].Data <> '' then begin
+        if Ext = 0 then
+          AbortCompileOnLine(SCompilerRunCantUseRunOnceId);
+      end else if Ext = 1 then
+        MissingRunOnceIds := True;
       RunOnceId := Values[paRunOnceId].Data;
 
       { Description }
@@ -7362,6 +7205,11 @@ procedure TSetupCompiler.ReadMessagesFromScript;
     ReadMessagesFromFiles('compiler:Default.isl', LanguageEntries.Count-1);
   end;
 
+  function IsOptional(const MessageID: TSetupMessageID): Boolean;
+  begin
+    Result := False; { Currently there are no optional messages }
+  end;
+
 var
   I: Integer;
   LangData: TLangData;
@@ -7387,8 +7235,7 @@ begin
   for I := 0 to LanguageEntries.Count-1 do begin
     LangData := LangDataList[I];
     for J := Low(LangData.Messages) to High(LangData.Messages) do
-      if not LangData.MessagesDefined[J] and
-         not (J in [msgComponentsDiskSpaceGBLabel, msgDiskSpaceGBLabel, msgPrepareToInstallNeedsRestart]) then begin
+      if not LangData.MessagesDefined[J] and not IsOptional(J) then begin
         { Use the message from Default.isl }
         if not (J in [msgHelpTextNote, msgTranslatorNote]) then
           WarningsList.Add(Format(SCompilerMessagesMissingMessageWarning,
@@ -8407,23 +8254,31 @@ var
   procedure PrepareSetupE32(var M: TMemoryFile);
   var
     TempFilename, E32Filename, ConvertFilename: String;
+    ConvertFile: TFile;
   begin
     TempFilename := '';
     try
       E32Filename := CompilerDir + 'SETUP.E32';
+      { make a copy and update icons and version info }
+      ConvertFilename := OutputDir + OutputBaseFilename + '.e32.tmp';
+      CopyFileOrAbort(E32Filename, ConvertFilename);
+      SetFileAttributes(PChar(ConvertFilename), FILE_ATTRIBUTE_ARCHIVE);
+      TempFilename := ConvertFilename;
       if SetupIconFilename <> '' then begin
-        { make a copy and update icons }
-        ConvertFilename := OutputDir + OutputBaseFilename + '.e32.tmp';
-        CopyFileOrAbort(E32Filename, ConvertFilename);
-        SetFileAttributes(PChar(ConvertFilename), FILE_ATTRIBUTE_ARCHIVE);
-        TempFilename := ConvertFilename;
         AddStatus(Format(SCompilerStatusUpdatingIcons, ['SETUP.E32']));
         LineNumber := SetupDirectiveLines[ssSetupIconFile];
         UpdateIcons(ConvertFileName, PrependSourceDirName(SetupIconFilename));
         LineNumber := 0;
-      end else
-        ConvertFilename := E32Filename;
-
+      end;
+      AddStatus(Format(SCompilerStatusUpdatingVersionInfo, ['SETUP.E32']));
+      ConvertFile := TFile.Create(ConvertFilename, fdOpenExisting, faReadWrite, fsNone);
+      try
+        UpdateVersionInfo(ConvertFile, TFileVersionNumbers(nil^), VersionInfoProductVersion, VersionInfoCompany,
+          '', '', VersionInfoCopyright, VersionInfoProductName, VersionInfoProductTextVersion, VersionInfoOriginalFileName,
+          False);
+      finally
+        ConvertFile.Free;
+      end;
       M := TMemoryFile.Create(ConvertFilename);
       UpdateSetupPEHeaderFields(M, TerminalServicesAware, DEPCompatible, ASLRCompatible);
       if shSignedUninstaller in SetupHeader.Options then
@@ -8641,6 +8496,7 @@ begin
     SignToolRetryDelay := 500;
     SetupHeader.CloseApplicationsFilter := '*.exe,*.dll,*.chm';
     SetupHeader.WizardImageAlphaFormat := afIgnored;
+    MissingRunOnceIdsWarning := True;
     UsedUserAreasWarning := True;
     SetupHeader.WizardStyle := wsClassic;
 
@@ -9056,6 +8912,9 @@ begin
     EnumIniSection(EnumRunProc, 'UninstallRun', 1, True, True, '', False, False);
     CallIdleProc;
 
+    if MissingRunOnceIdsWarning and MissingRunOnceIds then
+      WarningsList.Add(Format(SCompilerMissingRunOnceIdsWarning, ['UninstallRun', 'RunOnceId']));
+
     { Read [Files] section }
     if not TryStrToBoolean(SetupHeader.Uninstallable, Uninstallable) or Uninstallable then
       EnumFilesProc('', 1);
@@ -9213,10 +9072,11 @@ begin
             ExeFile.WriteBuffer(SetupLdrOffsetTable, SizeOf(SetupLdrOffsetTable));
 
             { Update version info }
-            AddStatus(SCompilerStatusUpdatingVersionInfo);
+            AddStatus(Format(SCompilerStatusUpdatingVersionInfo, ['SETUP.EXE']));
             UpdateVersionInfo(ExeFile, VersionInfoVersion, VersionInfoProductVersion, VersionInfoCompany,
               VersionInfoDescription, VersionInfoTextVersion,
-              VersionInfoCopyright, VersionInfoProductName, VersionInfoProductTextVersion, VersionInfoOriginalFileName);
+              VersionInfoCopyright, VersionInfoProductName, VersionInfoProductTextVersion, VersionInfoOriginalFileName,
+              True);
 
             { For some reason, on Win95 the date/time of the EXE sometimes
               doesn't get updated after it's been written to so it has to

+ 288 - 0
Projects/DotNet.pas

@@ -0,0 +1,288 @@
+unit DotNet;
+
+{
+  Inno Setup
+  Copyright (C) 1997-2020 Jordan Russell
+  Portions by Martijn Laan
+  For conditions of distribution and use, see LICENSE.TXT.
+
+  .NET functions
+
+  Fusion code based on LibFusion.pas by RemObject Software
+  License:
+  // LibFusion.pas
+  // copyright (c) 2009 by RemObjects Software
+  //
+  // Uses InnoSetup License
+
+  Also see https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/fusion
+           https://docs.microsoft.com/en-us/windows/win32/sbscs/side-by-side-assembly-api
+
+  IsDotNetInstalled code based on http://www.kynosarges.de/DotNetVersion.html by Cristoph Nahr
+  License:
+  // I’m placing this small bit of code in the public domain, so you may embed it in your own
+  // projects, modify and redistribute it as you see fit.
+
+  Also see https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed
+}
+
+interface
+
+uses
+  Ole2, SysUtils, Windows, CmnFunc2;
+
+type
+  IAssemblyCache = class(Ole2.IUnknown)
+    function UninstallAssembly(dwFlags: Integer; pszAssemblyName: PWideChar; pvReserved: Integer; var pulDisposition: Integer): Integer; virtual; stdcall; abstract;
+    function QueryAssemblyInfo(dwFlags: Integer; pszAssemblyName: PWideChar; pAsmInfo: Integer): Integer; virtual; stdcall; abstract;
+    function CreateAssemblyCacheItem(dwFlags: Integer; pvReserved: Integer; var ppAsmItem: Integer; pszAssemblyName: PWideChar): Integer; virtual; stdcall; abstract;
+    function CreateAssemblyScavenger(var ppAsmScavenger: Pointer): Integer; virtual; stdcall; abstract;
+    function InstallAssembly(dwFlags: Integer; pszManifestFilePath: PWideChar; pvReserved: Integer): Integer; virtual; stdcall; abstract;
+  end;
+
+  TAssemblyCacheInfo = class
+  private
+    fDll: THandle;
+    fCache: IAssemblyCache;
+  public
+    constructor Create(const RegView: TRegView);
+    destructor Destroy; override;
+    property Cache: IAssemblyCache read FCache;
+    procedure InstallAssembly(const FileName: string);
+    procedure UninstallAssembly(const StrongAssemblyName: string); // Full name! in 'AssemblyName, version=1.0.0.0, culture=neutral, publickeytoken=abcdef123456' format
+  end;
+
+  TDotNetBaseVersion = (netbase11, netbase20, netbase40, netbaseHighestKnown);
+  TDotNetVersion = (net11, net20, net30, net35, net4Client, net4Full, net45, net451, net452, net46, net461, net462, net47, net471, net472, net48);
+
+function GetDotNetInstallRoot(const RegView: TRegView): String;
+function GetDotNetVersionInstallRoot(const RegView: TRegView; const Version: TDotNetBaseVersion): String;
+function IsDotNetInstalled(const RegView: TRegView; const MinVersion: TDotNetVersion; const MinServicePack: DWORD): Boolean;
+
+implementation
+
+uses
+  InstFunc, PathFunc;
+
+var
+  DotNetRoot: array [TRegView] of String;
+  DotNetVersionRoot: array [TRegView, TDotNetBaseVersion] of String;
+
+{ GetDotNet(Version)InstallRoot }
+
+function GetDotNetInstallRoot(const RegView: TRegView): String;
+var
+  K: HKEY;
+begin
+  if DotNetRoot[RegView] = '' then begin
+    if RegOpenKeyExView(RegView, HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\.NETFramework', 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS then begin
+      RegQueryStringValue(K, 'InstallRoot', DotNetRoot[RegView]);
+      RegCloseKey(K);
+    end;
+    if DotNetRoot[RegView] = '' then
+      InternalError('.NET Framework not found');
+  end;
+  Result := DotNetRoot[RegView];
+end;
+
+function GetDotNetVersionInstallRoot(const RegView: TRegView; const Version: TDotNetBaseVersion): String;
+const
+  VersionStrings: array [TDotNetBaseVersion] of String = ('1.1', '2.0', '4.0', '');
+var
+  K: HKEY;
+begin
+  if DotNetVersionRoot[RegView, Version] = '' then begin
+    GetDotNetInstallRoot(RegView);
+    if (Version in [netbase40, netbaseHighestKnown]) and (RegOpenKeyExView(RegView, HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\.NETFramework\Policy\v4.0', 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS) then begin
+      DotNetVersionRoot[RegView, Version] := AddBackslash(DotNetRoot[RegView]) + 'v4.0.30319';
+      RegCloseKey(K);
+    end else if (Version in [netbase20, netbaseHighestKnown]) and (RegOpenKeyExView(RegView, HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\.NETFramework\Policy\v2.0', 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS) then begin
+      DotNetVersionRoot[RegView, Version] := AddBackslash(DotNetRoot[RegView]) + 'v2.0.50727';
+      RegCloseKey(K);
+    end else if (Version in [netbase11, netbaseHighestKnown]) and (RegOpenKeyExView(RegView, HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\.NETFramework\Policy\v1.1', 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS) then begin
+      DotNetVersionRoot[RegView, Version] := AddBackslash(DotNetRoot[RegView]) + 'v1.1.4322';
+      RegCloseKey(K);
+    end;
+    if DotNetVersionRoot[RegView, Version] = '' then begin
+      if Version <> netbaseHighestKnown then
+        InternalError(Format('.NET Framework version %s not found', [VersionStrings[Version]]))
+      else
+        InternalError('.NET Framework not found');
+    end;
+  end;
+  Result := DotNetVersionRoot[RegView, Version];
+end;
+
+
+{ TAssemblyCacheInfo }
+
+constructor TAssemblyCacheInfo.Create(const RegView: TRegView);
+type
+  TCreateAssemblyCache = function (var ppAsmCache: IAssemblyCache; dwReserved: Integer): Integer; stdcall;
+var
+  FileName: string;
+  Proc: TCreateAssemblyCache;
+begin
+  inherited Create;
+  FileName := AddBackslash(GetDotNetVersionInstallRoot(RegView, netbaseHighestKnown)) + 'Fusion.dll';
+  fDll := SafeLoadLibrary(PChar(FileName), SEM_NOOPENFILEERRORBOX);
+  if fDll = 0 then
+    InternalError(Format('Failed to load .NET Framework DLL "%s"', [FileName]));
+  Proc := GetProcAddress(fDll, 'CreateAssemblyCache');
+  if not Assigned(Proc) then
+    InternalError('Failed to get address of .NET Framework CreateAssemblyCache function');
+  Proc(fCache, 0);
+  if fCache = nil then
+    InternalError('.NET Framework CreateAssemblyCache function failed');
+end;
+
+destructor TAssemblyCacheInfo.Destroy;
+begin
+  if fCache <> nil then
+    fCache.Release;
+  fCache := nil;
+  FreeLibrary(fDll);
+  inherited Destroy;
+end;
+
+procedure TAssemblyCacheInfo.InstallAssembly(const FileName: string);
+const
+  IASSEMBLYCACHE_INSTALL_FLAG_FORCE_REFRESH = 2;
+var
+  lOleString: PWideChar;
+  OleResult: HRESULT;
+begin
+  lOleString := StringToOleStr(FileName);
+  try
+    OleResult := fCache.InstallAssembly(IASSEMBLYCACHE_INSTALL_FLAG_FORCE_REFRESH, lOleString, 0);
+    if Failed(OleResult) then
+      RaiseOleError('InstallAssembly', OleResult);
+  finally
+    SysFreeString(lOleString);
+  end;
+end;
+
+procedure TAssemblyCacheInfo.UninstallAssembly(
+  const StrongAssemblyName: string);
+var
+  lOleString: PWideChar;
+  OleResult: HRESULT;
+begin
+  lOleString := StringToOleStr(StrongAssemblyName);
+  try
+    OleResult := fCache.UninstallAssembly(0, lOleString, 0, Integer(nil^));
+    if Failed(OleResult) then
+      RaiseOleError('UninstallAssembly', OleResult);
+  finally
+    SysFreeString(lOleString);
+  end;
+end;
+
+{ IsDotNetDetected }
+
+function IsDotNetInstalled(const RegView: TRegView; const MinVersion: TDotNetVersion; const MinServicePack: DWORD): Boolean;
+
+  function GetVersionString(const Version: TDotNetVersion): String;
+  begin
+    case Version of
+      net11: Result := 'v1.1';
+      net20: Result := 'v2.0';
+      net30: Result := 'v3.0';
+      net35: Result := 'v3.5';
+      net4Client: Result := 'v4\Client';
+      net4Full: Result := 'v4\Full';
+      net45: Result := 'v4.5';
+      net451: Result := 'v4.5.1';
+      net452: Result := 'v4.5.2';
+      net46: Result := 'v4.6';
+      net461: Result := 'v4.6.1';
+      net462: Result := 'v4.6.2';
+      net47: Result := 'v4.7';
+      net471: Result := 'v4.7.1';
+      net472: Result := 'v4.7.2';
+      net48: Result := 'v4.8';
+      else
+        InternalError('IsDotNetDetected: Invalid Version');
+    end;
+  end;
+
+  function QueryDWord(const SubKey, ValueName: String; var Value: DWORD): Boolean;
+  var
+    K: HKEY;
+    Typ, Size: DWORD;
+  begin
+    if RegOpenKeyExView(RegView, HKEY_LOCAL_MACHINE, PChar(SubKey), 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS then begin
+      Size := SizeOf(Value);
+      Result := (RegQueryValueEx(K, PChar(ValueName), nil, @Typ, @Value, @Size) = ERROR_SUCCESS) and (Typ = REG_DWORD);
+      RegCloseKey(K);
+    end else
+      Result := False;
+  end;
+
+var
+  VersionString, VersionKey, SubKey: String;
+  Install, InstalledRelease, InstalledServicePack, RequiredRelease: DWORD;
+  Success: Boolean;
+begin
+  VersionString := GetVersionString(MinVersion);
+  RequiredRelease := 0;
+
+  // .NET 1.1 and 2.0 embed release number in version key
+  if VersionString = 'v1.1' then
+    VersionKey := 'v1.1.4322'
+  else if VersionString = 'v2.0' then
+    VersionKey := 'v2.0.50727'
+  else begin
+    // .NET 4.5 and newer install as update to .NET 4.0 Full
+    if Pos('v4.', VersionString) = 1 then begin
+      VersionKey := 'v4\Full';
+      if VersionString = 'v4.5' then
+        RequiredRelease := 378389
+      else if VersionString = 'v4.5.1' then
+        RequiredRelease := 378675 // 378758 on Windows 8 and older
+      else if VersionString = 'v4.5.2' then
+        RequiredRelease := 379893
+      else if VersionString = 'v4.6' then
+        RequiredRelease := 393295 // 393297 on Windows 8.1 and older
+      else if VersionString = 'v4.6.1' then
+        RequiredRelease := 394254 // 394271 before Win10 November Update
+      else if VersionString = 'v4.6.2' then
+        RequiredRelease := 394802 // 394806 before Win10 Anniversary Update
+      else if VersionString = 'v4.7' then
+        RequiredRelease := 460798 // 460805 before Win10 Creators Update
+      else if VersionString = 'v4.7.1' then
+        RequiredRelease := 461308 // 461310 before Win10 Fall Creators Update
+      else if VersionString = 'v4.7.2' then
+        RequiredRelease := 461808 // 461814 before Win10 April 2018 Update
+      else if VersionString = 'v4.8' then
+        RequiredRelease := 528040 // 528049 before Win10 May 2019 Update
+      else
+        InternalError('IsDotNetDetected: Invalid VersionString');
+    end else
+      VersionKey := VersionString;
+  end;
+
+  SubKey := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + VersionKey;
+
+  if Pos('v3.0', VersionString) = 1 then
+    Success := QueryDWord(SubKey + '\Setup', 'InstallSuccess', Install)
+  else
+    Success := QueryDWord(SubKey, 'Install', Install);
+
+  if Success and (Install = 1) then begin
+    if Pos('v4', VersionString) = 1 then
+      Success := QueryDWord(SubKey, 'Servicing', InstalledServicePack)
+    else
+      Success := QueryDWord(SubKey, 'SP', InstalledServicePack);
+
+      if Success and (InstalledServicePack >= MinServicePack) then begin
+        if RequiredRelease > 0 then
+          Success := QueryDWord(SubKey, 'Release', InstalledRelease) and (InstalledRelease >= RequiredRelease);
+        Result := Success;
+      end else
+        Result := False;
+  end else
+    Result := False;
+end;
+
+end.

+ 34 - 13
Projects/ISCC.dpr

@@ -72,14 +72,34 @@ begin
   WriteFile(H, S[1], Length(S), BytesWritten, nil);
 end;
 
-procedure WriteStdOut(const S: String);
+procedure WriteStdOut(const S: String; const Warning: Boolean = False);
+var
+  CSBI: TConsoleScreenBufferInfo;
+  DidSetColor: Boolean;
 begin
-  WriteToStdHandle(StdOutHandle, AnsiString(S));
+  DidSetColor := Warning and GetConsoleScreenBufferInfo(StdOutHandle, CSBI) and
+                 SetConsoleTextAttribute(StdOutHandle, FOREGROUND_INTENSITY or FOREGROUND_RED or FOREGROUND_GREEN);
+  try
+    WriteToStdHandle(StdOutHandle, AnsiString(S));
+  finally
+    if DidSetColor then
+      SetConsoleTextAttribute(StdOutHandle, CSBI.wAttributes);
+  end;
 end;
 
-procedure WriteStdErr(const S: String);
+procedure WriteStdErr(const S: String; const Error: Boolean = False);
+var
+  CSBI: TConsoleScreenBufferInfo;
+  DidSetColor: Boolean;
 begin
-  WriteToStdHandle(StdErrHandle, AnsiString(S));
+  DidSetColor := Error and GetConsoleScreenBufferInfo(StdErrHandle, CSBI) and
+                 SetConsoleTextAttribute(StdErrHandle, FOREGROUND_INTENSITY or FOREGROUND_RED);
+  try
+    WriteToStdHandle(StdErrHandle, AnsiString(S));
+  finally
+    if DidSetColor then
+      SetConsoleTextAttribute(StdErrHandle, CSBI.wAttributes);
+  end;
 end;
 
 function GetCursorPos: TPoint;
@@ -222,7 +242,7 @@ begin
       end;
     iscbNotifyStatus:
       if not Quiet then
-        WriteStdOut(Data.StatusMsg)
+        WriteStdOut(Data.StatusMsg, Data.Warning)
       else if ShowProgress then
         PrintProgress(Trim(Data.StatusMsg));
     iscbNotifySuccess: begin
@@ -250,7 +270,7 @@ begin
         else if ScriptFilename <> '' then
           S := S + ' in ' + ScriptFilename;
         S := S + ': ' + Data.ErrorMsg;
-        WriteStdErr(S);
+        WriteStdErr(S, True);
       end;
     iscbNotifyIdle:
       if ShowProgress and (Data.CompressProgress <> 0) then begin
@@ -351,6 +371,7 @@ procedure ProcessCommandLine;
     WriteStdOut('Portions Copyright (C) 2000-2020 Martijn Laan. All rights reserved.');
     if IsppMode then
       WriteStdOut('Portions Copyright (C) 2001-2004 Alex Yackimoff. All rights reserved.');
+    WriteStdOut('https://www.innosetup.com');
     WriteStdOut('');
   end;
 
@@ -411,7 +432,7 @@ begin
       else if GetParam(S, 'S') then begin
         if Pos('=', S) = 0 then begin
           ShowBanner;
-          WriteStdErr('Invalid option: ' + S);
+          WriteStdErr('Invalid option: ' + S, True);
           Halt(1);
         end;
         SignTools.Add(S);
@@ -443,7 +464,7 @@ begin
       end
       else begin
         ShowBanner;
-        WriteStdErr('Unknown option: ' + S);
+        WriteStdErr('Unknown option: ' + S, True);
         Halt(1);
       end;
     end
@@ -451,7 +472,7 @@ begin
       { Not a switch; must be the script filename }
       if ScriptFilename <> '' then begin
         ShowBanner;
-        WriteStdErr('You may not specify more than one script filename.');
+        WriteStdErr('You may not specify more than one script filename.', True);
         Halt(1);
       end;
       ScriptFilename := S;
@@ -528,7 +549,7 @@ begin
   {$ENDIF}
   if Ver.BinVersion < $05000500 then begin
     { 5.0.5 or later is required since we use TCompileScriptParamsEx }
-    WriteStdErr('Incompatible compiler engine version.');
+    WriteStdErr('Incompatible compiler engine version.', True);
     Halt(1);
   end;
 
@@ -592,12 +613,12 @@ begin
       isceNoError: ;
       isceCompileFailure: begin
           ExitCode := 2;
-          WriteStdErr('Compile aborted.');
+          WriteStdErr('Compile aborted.', True);
         end;
     else
       ExitCode := 1;
       WriteStdErr(Format('Internal error: ISDllCompileScript returned ' +
-        'unexpected result (%d).', [Res]));
+        'unexpected result (%d).', [Res]), True);
     end;
   finally
     FreeScriptLines;
@@ -619,7 +640,7 @@ begin
     except
       { Show a friendlier exception message. (By default, Delphi prints out
         the exception class and address.) }
-      WriteStdErr(GetExceptMessage);
+      WriteStdErr(GetExceptMessage, True);
       Halt(2);
     end;
   finally

BIN
Projects/ISCC.res


BIN
Projects/ISCmplr.res


+ 1 - 1
Projects/ISPP/Help/Staging/contents-template.htm

@@ -11,7 +11,7 @@
 function init_ispp_contents()
 {
  init_contents(2);
- searchTabBaseUrl = "http://www.jrsoftware.org/ispphelp/";
+ searchTabBaseUrl = "https://jrsoftware.org/ispphelp/";
 }
 --></script>
 </head>

+ 2 - 4
Projects/ISPP/Help/Staging/contents.js

@@ -1,15 +1,13 @@
 /*
   Inno Setup
-  Copyright (C) 1997-2010 Jordan Russell
+  Copyright (C) 1997-2020 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
-  $jrsoftware: ishelp/Staging/contents.js,v 1.12 2010/04/26 19:37:55 jr Exp $
-
   JavaScript code used by contents.htm
 */
 
-var searchTabBaseUrl = "http://www.jrsoftware.org/ishelp/";
+var searchTabBaseUrl = "https://jrsoftware.org/ishelp/";
 
 function get_absolute_top(obj)
 {

+ 3 - 5
Projects/ISPP/Help/Staging/topic.js

@@ -1,11 +1,9 @@
 /*
   Inno Setup
-  Copyright (C) 1997-2010 Jordan Russell
+  Copyright (C) 1997-2020 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
-  $jrsoftware: ishelp/Staging/topic.js,v 1.7 2010/04/25 02:48:24 jr Exp $
-
   JavaScript code used by topic_*.htm
 */
 
@@ -76,8 +74,8 @@ function topic_loaded()
 	var matches;
 
 	if (window == window.top &&
-	    window.location.protocol == "http:" &&
-	    window.location.hostname == "www.jrsoftware.org" &&
+	    (window.location.protocol == "http:" || window.location.protocol == "https:") &&
+	    (window.location.hostname == "jrsoftware.org" || window.location.hostname == "www.jrsoftware.org") &&
 	    (matches = window.location.pathname.match(/^(\/.+\/)topic_([a-z0-9_\-]+)\.htm$/)) &&
 	    window.location.hash != "#noredir") {
 

+ 6 - 0
Projects/ISPP/Help/compile.bat

@@ -37,6 +37,12 @@ if exist Staging\ispp.chm goto failed
 if %errorlevel% neq 1 goto failed
 if not exist Staging\ispp.chm goto failed
 
+rem  HHC leaves behind a temporary file each time it runs...
+if exist "%TEMP%\~hh*.tmp" del /q "%TEMP%\~hh*.tmp"
+
+copy Staging\ispp.chm ..\..\..\Files\ISPP.chm
+if not exist ..\..\..\Files\ISPP.chm goto failed
+
 echo Success!
 exit /b 0
 

+ 242 - 78
Projects/ISPP/Help/ispp.xml

@@ -29,43 +29,23 @@
  <!ENTITY expr    '<synel>expr</synel>'> <!-- not a directive -->
  <!ENTITY curtrans '<link href="current-translation" popup="yes">current translation</link>'>
  <!ENTITY translation '<link href="translation" popup="yes">translation</link>'>
- <!ENTITY builtins '<link href="builtinsiss">ISPPBuiltins.iss file</link>'>
+ <!ENTITY builtins '<link href="builtinsiss">ISPPBuiltins.iss</link>'>
  <!ENTITY dash "&#8211;">
 ]>
 <yasyx>
 	<topic id="isppoverview">
 		<title>Introduction</title>
 		<description header="no">
-			<para>Inno Setup Preprocessor (ISPP) is a preprocessor add-on for Inno Setup.</para>
-			<para>The main purpose of ISPP is to automate compile-time tasks and avoid repetition in your scripts. For example, you can declare an ISPP variable (compile-time variable) &dash; your application name, for instance &dash; and then use its value in several places of your script. If for some reason you need to change the name of your application, you'll have to change it only once in your script. Without ISPP, you would need to change all occurrences of your application name throughout the script (AppName, AppVerName, DefaultGroupName etc. <extlink href="ms-its:isetup.chm::/topic_setupsection.htm">[Setup] section</extlink> directives).</para>
-			<para>Another example of using ISPP would be gathering version information from your application at compile-time by reading the version info of an EXE file, and using it in AppVerName <extlink href="ms-its:isetup.chm::/topic_setupsection.htm">[Setup] section</extlink> directive or anywhere else. Without ISPP, you would have to modify your script each time the version of your application changes.</para>
-			<para>Similarly, you can use ISPP to scan your source folder and generate script lines for the found files. Without ISPP, you would have to manually maintain the list of files.</para>
-			<para>Also, conditional in- and exclusion of portions of script is made possible by ISPP: you can create one single script for different versions/levels of your applications (for example, trial versus fully functional).</para>
+			<para>The main purpose of Inno Setup Preprocessor (ISPP) is to automate compile-time tasks and avoid repetition in your scripts. For example, you can declare a compile-time ISPP variable &dash; containing your application name, for instance &dash; and then use its value in several places of your script. If for some reason you need to change the name of your application, you'll have to change it only once in your script. Without ISPP, you would need to change all occurrences of your application name throughout the script.</para>
+			<para>Another example of using ISPP would be gathering version information from your application at compile-time by reading the version info of an EXE file, and using it in your <extlink href="ms-its:isetup.chm::/topic_setup_appvername.htm">AppVerName</extlink> [Setup] section directive or anywhere else. Without ISPP, you would have to modify your script each time the version of your application changes.</para>
+			<para>ISPP can even scan your source folder and generate script lines for the found files. Without ISPP, you would have to manually maintain the list of files.</para>
+			<para>Conditional in- and exclusion of portions of script is also possible by using ISPP: you can create one single script for different versions/levels of your applications (for example, trial versus fully functional). Without ISPP, you would need multiple scripts.</para>
 			<para>Finally, ISPP makes it possible to split long lines using a line spanning symbol.</para>
 			<para>Note: ISPP works exclusively at compile-time, and has no run-time functionality.</para>
     </description>
 		<subtopicstitle>All topics</subtopicstitle>
-		<topic id="docconv">
-			<title>Documentation Conventions</title>
-			<section title="Directive syntax documenting conventions">
-				<para>Directive usage syntax uses the following conventions.</para>
-				<table>
-					<tr><td><code>()</code></td><td>Group of tokens.</td></tr>
-					<tr><td><code>[]</code></td><td>Optional token or group of tokens.</td></tr>
-					<tr><td><code>|</code></td><td>Mutually exclusive tokens.</td></tr>
-					<tr><td><code>...</code></td><td>Previous token or group of tokens can be repeated.</td></tr>
-					<tr><td><code><b>token</b></code></td><td>Reserved word or symbol(s). Must be typed exactly as shown.</td></tr>
-					<tr><td><code>&lt;token&gt;</code></td><td>Non-terminal. Its syntax is either shown before, or explained.</td></tr>
-				</table>
-			</section>
-			<section title="Function prototypes documenting conventions">
-				<para>Function prototypes are shown as function result type, function name and list of formal arguments in parentheses.</para>
-				<para>Words <synel>int</synel>, <synel>str</synel>, <synel>any</synel>, and <synel>void</synel> are used to specify integer type, string type, any type, or null type (also referred to as nothing, void), respectively. Null type as function result means that function does not return any value.</para>
-				<para>Question mark (<synel>?</synel>) after the type of an argument means that this argument is optional.</para>
-			</section>
-		</topic>
 		<topic id="directives">
-			<title>Directives</title>
+			<title>Directives Reference</title>
  			<description header="no">
 				<para>There are two kinds of directives in ISPP: simple and inline.</para>
 				<para>Simple directives occupy a whole line and begin with the <synel>#</synel> symbol. For example the following defines a variable called <synel>MyAppName</synel>:</para>
@@ -79,6 +59,17 @@
 				</pre>
 				<para>As seen in the above example it is not necessary to specify the name of the &emit; directive when it is used inline, so <synel>{#MyAppName}</synel> is short for <synel>{#emit MyAppName}</synel>.</para>
 			</description>
+			<section title="Directive syntax documenting conventions">
+				<para>Directive usage syntax uses the following conventions.</para>
+				<table>
+					<tr><td><code>()</code></td><td>Group of tokens.</td></tr>
+					<tr><td><code>[]</code></td><td>Optional token or group of tokens.</td></tr>
+					<tr><td><code>|</code></td><td>Mutually exclusive tokens.</td></tr>
+					<tr><td><code>...</code></td><td>Previous token or group of tokens can be repeated.</td></tr>
+					<tr><td><code><b>token</b></code></td><td>Reserved word or symbol(s). Must be typed exactly as shown.</td></tr>
+					<tr><td><code>&lt;token&gt;</code></td><td>Non-terminal. Its syntax is either shown before, or explained.</td></tr>
+				</table>
+			</section>
 			<subtopicstitle>Available directives</subtopicstitle>
 			<topic id="define">
 				<title>#define</title>
@@ -146,7 +137,7 @@
 				<section title="Examples">
 					<pre>
 						<line>#define MyAppName "My Program"</line>
-						<line>#define MyAppVer <link href="GetFileVersion">GetFileVersion</link>("MyProg.exe")</line>
+						<line>#define MyAppVer <link href="GetVersionNumbersString">GetVersionNumbersString</link>("MyProg.exe")</line>
 						<line>#define MyArray[0] 15</line>
 						<line>#define Multiply(int A, int B = 10) A * B</line>
 					</pre>
@@ -310,8 +301,8 @@
 				<section title="Examples">
 					<pre>
 						<line>[Files]</line>
-						<line>#emit 'Filename: "file1.ext"; DestDir: &ob;' + MyDestDir + '&cb;'</line>
-						<line>Filename: "file2.ext"; DestDir: &ob;&ob;#MyDestDir&cb;&cb;</line>
+						<line>#emit 'Source: "file1.ext"; DestDir: &ob;' + MyDestDir + '&cb;'</line>
+						<line>Source: "file2.ext"; DestDir: &ob;#MyDestDir&cb;</line>
 						<line>#emit GenerateVisualCppFilesEntries ; user defined function</line>
 						<line></line>
 						<line>[Code]</line>
@@ -632,7 +623,7 @@ The list of options is provided at the end of this topic.</para>
 					<pre>
 						<line>#pragma parseroption -b- -u+</line>
 						<line>#pragma option -c-</line>
-						<line>#pragma warning "Variable value is: " + MyVar</line>
+						<line>#pragma warning "Variable value is: " + Str(MyVar)</line>
 						<line>#pragma option -v+</line>
 						<line>#pragma verboselevel 9</line>
 						<line>#pragma inlinestart "$("</line>
@@ -641,6 +632,9 @@ The list of options is provided at the end of this topic.</para>
 						<line>#pragma spansymbol "_"</line>
 					</pre>
 				</section>
+				<section title="See also">
+					<para><synel><link href="Message">Message</link></synel>, <synel><link href="Warning">Warning</link></synel>, <synel><link href="Error2">Error</link></synel>.</para>
+				</section>
 			</topic>
 			<topic id="error">
 				<title>#error</title>
@@ -661,35 +655,28 @@ The list of options is provided at the end of this topic.</para>
 					</pre>
 				</section>
 				<section title="See also">
-					<para>&pragma;, &if;.</para>
+					<para>&pragma;, &if;, <synel><link href="Error2">Error</link></synel>.</para>
 				</section>
 			</topic>
 		</topic>
 		<!--   FUNCTIONS -->
 		<topic id="funcs">
-			<title>Functions</title>
+			<title>Support Functions Reference</title>
 			<description header="no">
-				<para>There are a number of predefined functions provided by ISPP which you can use to perform compile-time actions and/or change your script. For example the following reads version info from an EXE and uses the return value of the function to change the script:</para>
+				<para>There are a number of built-in support functions which you can use to perform compile-time actions and/or change your script. For example the following uses ISPP function <link href="GetVersionNumbersString">GetVersionNumbersString</link> to read version info from an EXE and uses the return value of the function to set the <extlink href="ms-its:isetup.chm::/topic_setup_appvername.htm">AppVerName</extlink> [Setup] section directive using ISPP directive &emit;:</para>
         <pre>
-          <line>#define MyAppVer GetFileVersion(AddBackslash(SourcePath) + "MyProg.exe")</line>
+          <line>#define MyAppVer GetVersionNumbersString(AddBackslash(SourcePath) + "MyProg.exe")</line>
           <line></line>
           <line>[Setup]</line>
           <line>AppVerName=MyProg version {#MyAppVer}</line>
         </pre>
       </description>
+			<section title="Function prototypes documenting conventions">
+				<para>Function prototypes show the function result type, name, and arguments.</para>
+				<para>Return and argument types <synel>int</synel>, <synel>str</synel>, <synel>any</synel>, and <synel>void</synel> respectively specify the integer type, the string type, any type, and the null type. The integer type is a signed 64-bit integer. When the null type is specified as a function result type then the function does not return a value.</para>
+				<para>A question mark (<synel>?</synel>) after an argument type means that the argument is optional.</para>
+      </section>
 			<subtopicstitle>Available functions</subtopicstitle>
-			<topic id="GetFileVersion">
-				<title>GetFileVersion</title>
-				<section title="Prototype">
-					<pre>
-						<line><b>str</b> GetFileVersion(<b>str</b>)</line>
-					</pre>
-				</section>
-				<description>
-					<para>Takes a string argument which must be set to the name of the file whose version information is to be queried. Returns a string composed of four decimal numbers delimited with periods. Returns an empty string if the file does not contain valid version info.</para>
-					<para>ISPP also has <link href="GetStringFileInfo">GetStringFileInfo</link> function, which also can be used to retrieve file version (using "FileVersion" or "ProductVersion" as second parameter). The difference is that GetFileVersion takes it from the fixed block of version info, unlike GetStringFileInfo, which extracts string from the language specific block.</para>
-				</description>
-			</topic>
 			<topic id="GetStringFileInfo">
 				<title>GetStringFileInfo</title>
 				<section title="Prototype">
@@ -767,7 +754,7 @@ The list of options is provided at the end of this topic.</para>
 					</pre>
 				</section>
 				<description>
-					<para>Returns size, in bytes, of the specified file. If the file does not exist, the result is -1. Beware of ISPP supporting only signed 32 bit integers: for files larger than 2 GB (and smaller than 4 GB) the result is negative.</para>
+					<para>Returns size, in bytes, of the specified file. If the file does not exist, the result is -1.</para>
 				</description>
 			</topic>
 			<topic id="ReadIni">
@@ -1323,23 +1310,168 @@ The list of options is provided at the end of this topic.</para>
 					<para>&dim;, &redim;.</para>
 				</section>
 			</topic>
-			<topic id="ParseVersion">
-				<title>ParseVersion</title>
+			<topic id="GetVersionNumbers">
+				<title>GetVersionNumbers</title>
+				<section title="Prototype">
+					<pre>
+						<line><b>str</b> GetVersionNumbers(<b>str</b> Filename, <b>int</b> *VersionMS, <b>int</b> *VersionLS)</line>
+					</pre>
+				</section>
+				<description>
+					<para>Gets the version numbers of the specified file. Returns the version as a string (in "0.0.0.0" format) if successful, an empty string otherwise.</para>
+					<para>Declared in &builtins;.</para>
+				</description>
+				<section title="See also">
+					<para><synel><link href="PackVersionNumbers">PackVersionNumbers</link></synel></para>
+				</section>
+			</topic>
+			<topic id="GetVersionComponents">
+				<title>GetVersionComponents</title>
+				<section title="Prototype">
+					<pre>
+						<line><b>str</b> GetVersionComponents(<b>str</b> Filename, <b>int</b> *Major, <b>int</b> *Minor, <b>int</b> *Revision, <b>int</b> *Build)</line>
+					</pre>
+				</section>
+				<description>
+					<para>Gets the individual version components of the specified file. Returns the version as a string (in "0.0.0.0" format) if successful, an empty string otherwise.</para>
+          <para>Declared in &builtins;.</para>
+				</description>
+				<section title="See also">
+					<para><synel><link href="PackVersionComponents">PackVersionComponents</link></synel></para>
+				</section>
+			</topic>
+			<topic id="GetVersionNumbersString">
+				<title>GetVersionNumbersString</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define ParseVersion(str FileName, *Major, *Minor, *Rev, *Build)</line>
+						<line><b>str</b> GetVersionNumbersString(<b>str</b> Filename)</line>
 					</pre>
 				</section>
 				<description>
-					<para>Calls the <synel><link href="GetFileVersion">GetFileVersion</link></synel> function and parses the string returned by that function (in form "0.0.0.0"). All four version elements are stored in by-reference parameters Major, Minor, Rev, and Build. Returns the string returned by GetFileVersion.</para>
+					<para>Returns the version of the specified file as a string (in "0.0.0.0" format) if successful, an empty string otherwise.</para>
+					<para>Also see <link href="GetStringFileInfo">GetStringFileInfo</link>, which can also be used to retrieve file versions using "FileVersion" or "ProductVersion" as the second parameter. The difference is that GetVersionNumbersString takes it from the fixed block of version info, unlike GetStringFileInfo which extracts string from the language specific block.</para>
+				</description>
+			</topic>
+			<topic id="GetPackedVersion">
+				<title>GetPackedVersion</title>
+				<section title="Prototype">
+					<pre>
+						<line><b>str</b> GetPackedVersion(<b>str</b> Filename, <b>int</b> *Version)</line>
+					</pre>
+				</section>
+				<description>
+					<para>Gets the packed version of the specified file. Returns the version as a string (in "0.0.0.0" format) if successful, an empty string otherwise.</para>
+          <para>Always use <synel><link href="ComparePackedVersion">ComparePackedVersion</link></synel> or <synel><link href="SamePackedVersion">SamePackedVersion</link></synel> to compare packed versions.</para>
           <para>Declared in &builtins;.</para>
 				</description>
+				<section title="See also">
+					<para><synel><link href="PackVersionComponents">PackVersionComponents</link></synel></para>
+				</section>
+			</topic>
+			<topic id="PackVersionNumbers">
+				<title>PackVersionNumbers</title>
+				<section title="Prototype">
+					<pre>
+						<line><b>int</b> PackVersionNumbers(<b>int</b> VersionMS, <b>int</b> VersionLS)</line>
+					</pre>
+				</section>
+				<description>
+					<para>Packs version numbers into a single value.</para>
+          <para>Always use <synel><link href="ComparePackedVersion">ComparePackedVersion</link></synel> or <synel><link href="SamePackedVersion">SamePackedVersion</link></synel> to compare packed versions.</para>
+					<para>Declared in &builtins;.</para>
+				</description>
+				<section title="See also">
+					<para><synel><link href="GetVersionNumbers">GetVersionNumbers</link></synel>, <synel><link href="PackVersionComponents">PackVersionComponents</link></synel>, <synel><link href="UnpackVersionNumbers">UnpackVersionNumbers</link></synel></para>
+				</section>
+			</topic>
+			<topic id="PackVersionComponents">
+				<title>PackVersionComponents</title>
+				<section title="Prototype">
+					<pre>
+						<line><b>int</b> PackVersionComponents(<b>int</b> Major, <b>int</b> Minor, <b>int</b> Revision, <b>int</b> Build)</line>
+					</pre>
+				</section>
+				<description>
+					<para>Packs individual version components into a single value.</para>
+          <para>Always use <synel><link href="ComparePackedVersion">ComparePackedVersion</link></synel> or <synel><link href="SamePackedVersion">SamePackedVersion</link></synel> to compare packed versions.</para>
+					<para>Declared in &builtins;.</para>
+				</description>
+				<section title="See also">
+					<para><synel><link href="GetVersionComponents">GetVersionComponents</link></synel>, <synel><link href="PackVersionNumbers">PackVersionNumbers</link></synel>, <synel><link href="UnpackVersionComponents">UnpackVersionComponents</link></synel></para>
+				</section>
+			</topic>
+			<topic id="ComparePackedVersion">
+				<title>ComparePackedVersion</title>
+				<section title="Prototype">
+					<pre>
+						<line><b>int</b> ComparePackedVersion(<b>int</b> Version1, <b>int</b> Version2)</line>
+					</pre>
+				</section>
+				<description>
+					<para>Compares Version1 to Version2. The return value is less than 0 if Version1 is less than Version2, 0 if Version1 equals Version2, or greater than 0 if Version1 is greater than Version2.</para>
+				</description>
+			</topic>
+			<topic id="SamePackedVersion">
+				<title>SamePackedVersion</title>
+				<section title="Prototype">
+					<pre>
+						<line><b>int</b> SamePackedVersion(<b>int</b> Version1, <b>int</b> Version2)</line>
+					</pre>
+				</section>
+				<description>
+					<para>Compares the packed versions Version1 and Version2 and returns True if they are equal.</para>
+				</description>
+			</topic>
+			<topic id="UnpackVersionNumbers">
+				<title>UnpackVersionNumbers</title>
+				<section title="Prototype">
+					<pre>
+						<line><b>void</b> UnpackVersionNumbers(<b>int</b> Version, <b>int</b> *VersionMS, <b>int</b> *VersionLS)</line>
+					</pre>
+				</section>
+				<description>
+					<para>Unpacks a packed version into version numbers.</para>
+					<para>Declared in &builtins;.</para>
+				</description>
+				<section title="See also">
+					<para><synel><link href="UnpackVersionComponents">UnpackVersionComponents</link></synel>, <synel><link href="PackVersionNumbers">PackVersionNumbers</link></synel></para>
+				</section>
+			</topic>
+			<topic id="UnpackVersionComponents">
+				<title>UnpackVersionComponents</title>
+				<section title="Prototype">
+					<pre>
+						<line><b>void</b> UnpackVersionComponents(<b>int</b> Version, <b>int</b> *Major, <b>int</b> *Minor, <b>int</b> *Revision, <b>int</b> *Build)</line>
+					</pre>
+				</section>
+				<description>
+					<para>Unpacks a packed version into individual version components.</para>
+					<para>Declared in &builtins;.</para>
+				</description>
+				<section title="See also">
+					<para><synel><link href="UnpackVersionNumbers">UnpackVersionNumbers</link></synel>, <synel><link href="PackVersionComponents">PackVersionComponents</link></synel></para>
+				</section>
+			</topic>
+			<topic id="VersionToStr">
+				<title>VersionToStr</title>
+				<section title="Prototype">
+					<pre>
+						<line><b>void</b> VersionToStr(<b>int</b> Version)</line>
+					</pre>
+				</section>
+				<description>
+					<para>Returns the specified packed version as a string (in "0.0.0.0" format).</para>
+					<para>Declared in &builtins;.</para>
+				</description>
+				<section title="See also">
+					<para><synel><link href="PackVersionNumbers">PackVersionNumbers</link></synel>, <synel><link href="PackVersionComponents">PackVersionComponents</link></synel></para>
+				</section>
 			</topic>
 			<topic id="EncodeVer">
 				<title>EncodeVer</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define EncodeVer(int Major, int Minor, int Revision = 0, int Build = -1)</line>
+						<line><b>int</b> EncodeVer(<b>int</b> Major, <b>int</b> Minor, <b>int</b> Revision = 0, <b>int</b> Build = -1)</line>
 					</pre>
 				</section>
 				<description>
@@ -1351,7 +1483,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>DecodeVer</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define DecodeVer(int Ver, int Digits = 3)</line>
+						<line><b>str</b> DecodeVer(<b>int</b> Version, <b>int</b> Digits = 3)</line>
 					</pre>
 				</section>
 				<description>
@@ -1363,7 +1495,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>FindSection</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define FindSection(str Section = "Files")</line>
+						<line><b>int</b> FindSection(<b>str</b> Section = "Files")</line>
 					</pre>
 				</section>
 				<description>
@@ -1375,7 +1507,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>FindSectionEnd</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define FindSectionEnd(str Section = "Files")</line>
+						<line><b>int</b> FindSectionEnd(<b>str</b> Section = "Files")</line>
 					</pre>
 				</section>
 				<description>
@@ -1387,7 +1519,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>FindCode</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define FindCode()</line>
+						<line><b>int</b> FindCode()</line>
 					</pre>
 				</section>
 				<description>
@@ -1399,7 +1531,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>ExtractFilePath</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define ExtractFilePath(str PathName)</line>
+						<line><b>str</b> ExtractFilePath(<b>str</b> PathName)</line>
 					</pre>
 				</section>
 				<description>
@@ -1411,7 +1543,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>ExtractFileDir</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define ExtractFileDir(str PathName)</line>
+						<line><b>str</b> ExtractFileDir(<b>str</b> PathName)</line>
 					</pre>
 				</section>
 				<description>
@@ -1423,7 +1555,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>ExtractFileExt</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define ExtractFileExt(str PathName)</line>
+						<line><b>str</b> ExtractFileExt(<b>str</b> PathName)</line>
 					</pre>
 				</section>
 				<description>
@@ -1435,7 +1567,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>ExtractFileName</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define ExtractFileName(str PathName)</line>
+						<line><b>str</b> ExtractFileName(<b>str</b> PathName)</line>
 					</pre>
 				</section>
 				<description>
@@ -1447,7 +1579,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>ChangeFileExt</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define ChangeFileExt(str FileName, str NewExt)</line>
+						<line><b>str</b> ChangeFileExt(<b>str</b> FileName, <b>str</b> NewExt)</line>
 					</pre>
 				</section>
 				<description>
@@ -1459,7 +1591,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>RemoveFileExt</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define RemoveFileExt(str FileName)</line>
+						<line><b>void</b> RemoveFileExt(<b>str</b> FileName)</line>
 					</pre>
 				</section>
 				<description>
@@ -1471,11 +1603,11 @@ The list of options is provided at the end of this topic.</para>
 				<title>AddBackslash</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define AddBackslash(str S)</line>
+						<line><b>str</b> AddBackslash(<b>str</b> S)</line>
 					</pre>
 				</section>
 				<description>
-					<para>Appends a backslash to the string, if it's not already there.</para>
+					<para>Appends a backslash to the string, if it's not already there, and returns the result.</para>
           <para>Declared in &builtins;.</para>
 				</description>
 			</topic>
@@ -1483,11 +1615,11 @@ The list of options is provided at the end of this topic.</para>
 				<title>RemoveBackslash</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define RemoveBackslash(str S)</line>
+						<line><b>str</b> RemoveBackslash(<b>str</b> S)</line>
 					</pre>
 				</section>
 				<description>
-					<para>Removes the trailing backslash from the string unless the string points to a root directory.</para>
+					<para>Removes the trailing backslash from the string unless the string points to a root directory, and returns the result.</para>
           <para>Declared in &builtins;.</para>
 				</description>
 			</topic>
@@ -1495,7 +1627,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>Delete</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define Delete(str *S, int Index, int Count = MaxInt)</line>
+						<line><b>void</b> Delete(<b>str</b> *S, <b>int</b> Index, <b>int</b> Count = MaxInt)</line>
 					</pre>
 				</section>
 				<description>
@@ -1507,7 +1639,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>Insert</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define Insert(str *S, int Index, str Substr)</line>
+						<line><b>void</b> Insert(<b>str</b> *S, <b>int</b> Index, <b>str</b> Substr)</line>
 					</pre>
 				</section>
 				<description>
@@ -1519,7 +1651,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>YesNo</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define YesNo(str S)</line>
+						<line><b>int</b> YesNo(<b>str</b> S)</line>
 					</pre>
 				</section>
 				<description>
@@ -1531,7 +1663,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>Power</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define Power(int X, int P = 2)</line>
+						<line><b>int</b> Power(<b>int</b> X, <b>int</b> P = 2)</line>
 					</pre>
 				</section>
 				<description>
@@ -1542,7 +1674,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>Min</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define Min(int A, int B, int C = MaxInt)</line>
+						<line><b>int</b> Min(<b>int</b> A, <b>int</b> B, <b>int</b> C = MaxInt)</line>
 					</pre>
 				</section>
 				<description>
@@ -1553,7 +1685,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>Max</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define Max(int A, int B, int C = MinInt)</line>
+						<line><b>int</b> Max(<b>int</b> A, <b>int</b> B, <b>int</b> C = MinInt)</line>
 					</pre>
 				</section>
 				<description>
@@ -1564,7 +1696,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>SameText</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define SameText(str S1, str S2)</line>
+						<line><b>int</b> SameText(<b>str</b> S1, <b>str</b> S2)</line>
 					</pre>
 				</section>
 				<description>
@@ -1576,7 +1708,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>SameStr</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define SameStr(str S1, str S2)</line>
+						<line><b>int</b> SameStr(<b>str</b> S1, <b>str</b> S2)</line>
 					</pre>
 				</section>
 				<description>
@@ -1584,6 +1716,39 @@ The list of options is provided at the end of this topic.</para>
           <para>Declared in &builtins;.</para>
 				</description>
 			</topic>
+			<topic id="Message">
+				<title>Message</title>
+				<section title="Prototype">
+					<pre>
+						<line><b>void</b> Message(<b>str</b> S)</line>
+					</pre>
+				</section>
+				<description>
+					<para>Functional version of <synel><link href="pragma">pragma message</link></synel>.</para>
+				</description>
+			</topic>
+			<topic id="Warning">
+				<title>Warning</title>
+				<section title="Prototype">
+					<pre>
+						<line><b>void</b> Warning(<b>str</b> S)</line>
+					</pre>
+				</section>
+				<description>
+					<para>Functional version of <synel><link href="pragma">pragma warning</link></synel>.</para>
+				</description>
+			</topic>
+			<topic id="Error2">
+				<title>Error</title>
+				<section title="Prototype">
+					<pre>
+						<line><b>void</b> Error(<b>str</b> S)</line>
+					</pre>
+				</section>
+				<description>
+					<para>Functional version of &error;.</para>
+				</description>
+			</topic>
 		</topic>
     <topic id="macros">
 			<keywords>
@@ -1596,7 +1761,7 @@ The list of options is provided at the end of this topic.</para>
 			<description header="no">
 				<para>You can define user defined functions.</para>
 				<para>A user defined function declaration consists of a formal parameter list and an expression. That expression is evaluated when the function is called (see below). The result of the function call is the result of the expression. The expression can contain parameter names, they are treated as usual variables.</para>
-				<para>The formal syntax of a user defined function is provided in &define; and the &builtins; contains many example functions.</para>
+				<para>The formal syntax of a user defined function is provided in &define; and &builtins; contains many example functions.</para>
         <para>Please note that there must be no space between the function name and opening parenthesis.</para>
 				<para>Actual parameters for parameters declared as by-reference must be modifiable l-values (in other words, other defined variables or expressions that evaluate to l-values). If the expression modifies by-reference parameter, the variable that is passed as this parameter gets modified. By-value parameters can also be modified by the expression (using assignment operators), but this modification doesn't affect the value of a variable which could be passed as this parameter.</para>
 				<para>Though a user defined function can only contain one expression, sequential evaluation operators (comma), assignment operators (simple and compound) and conditional operators (<synel>?:</synel>) can be used to build more complicated functions.</para>
@@ -1621,7 +1786,7 @@ The list of options is provided at the end of this topic.</para>
       <title>Expression Syntax</title>
 			<description header="no">
 				<para>ISPP uses C/C++-like expression syntax. It supports simple and compound assignment operators, conditional operator, and sequential evaluation operator. Although ISPP is an interpreter, it does support short circuit boolean evaluation and never evaluates expressions (nor calls any user defined functions mentioned in those expressions) that should not be evaluated due to specific rules (for example, when conditional operator is used, always only 2 out of 3 operands are evaluated).</para>
-        <para>The &builtins; contains many example expressions.</para>
+        <para>&builtins; contains many example expressions.</para>
 			</description>
 			<section title="Differences between C and ISPP expression syntax">
 				<ul>
@@ -1751,8 +1916,7 @@ The list of options is provided at the end of this topic.</para>
 		<topic id="builtinsiss">
 			<title>ISPPBuiltins.iss</title>
 			<description header="no">
-				<para>The ISPPBuiltins.iss file is accompanying the Inno Setup Preprocessor. It is automatically included, if it exists in the compiler directory, as if the very first line of your script contained an &include; directive for it. This file contains common declarations, such as special constants for using with functions, and some useful user defined functions. The file is a regular Inno Setup Script file but mostly contains only ISPP directives.</para>
-        <para>To learn more about the functionality provided by this file please open it with the Inno Setup Compiler, it is well commented.</para>
+				<para>The ISPPBuiltins.iss file is part of Inno Setup Preprocessor and is automatically installed to root of your Inno Setup folder. This file is automatically included at the start of preprocessing: some of ISPP's functions are actually implemented by this file instead of being built-in. It also contains common declarations such as special constants. The file is a regular Inno Setup Script file so you can use all of its techniques in your own script as well.</para>
 			</description>
 		</topic>
 		<topic id="visibility">

+ 7 - 6
Projects/ISPP/Help/ispp.xsl

@@ -9,8 +9,10 @@
 
   <xsl:comment>
     Inno Setup Preprocessor Reference
-    Copyright (C) 2001-2004 Alex Yackimoff
-    Portions by Martijn Laan
+    Copyright (C) 1997-2020 Jordan Russell
+    Portions Copyright (C) 2000-2020 Martijn Laan
+    For conditions of distribution and use, see LICENSE.TXT.
+    Portions Copyright (C) 2001-2004 Alex Yackimoff
 
     This file is automatically generated. Do not edit.
   </xsl:comment>
@@ -22,9 +24,8 @@
   <contents>
     <contentsheading title="Inno Setup Preprocessor">
       <contentstopic title="Introduction" topic="isppoverview" />
-      <contentstopic title="Documentation Conventions" topic="docconv" />
-      <contentstopic title="Directives" topic="directives" />
-      <contentstopic title="Functions" topic="funcs" />
+      <contentstopic title="Directives Reference" topic="directives" />
+      <contentstopic title="Support Functions Reference" topic="funcs" />
       <contentstopic title="User Defined Functions" topic="macros" />
       <contentstopic title="Expression Syntax" topic="expressions" />
       <contentstopic title="Predefined Variables" topic="predefinedvars" />
@@ -60,7 +61,7 @@
   <body>
     <xsl:apply-templates select="*[name()!='topic']"/>
     <xsl:if test="topic">
-      <p><b><xsl:value-of select="subtopicstitle"/></b></p>
+      <heading><xsl:value-of select="subtopicstitle"/></heading>
       <ul>
         <xsl:for-each select="topic">
           <xsl:if test="title">

+ 6 - 1
Projects/ISPP/IsppBase.pas

@@ -1,6 +1,11 @@
 {
   Inno Setup Preprocessor
   Copyright (C) 2001-2002 Alex Yackimoff
+
+  Inno Setup
+  Copyright (C) 1997-2010 Jordan Russell
+  Portions by Martijn Laan
+  For conditions of distribution and use, see LICENSE.TXT.
 }
 
 unit IsppBase;
@@ -19,7 +24,7 @@ type
     AsStr: string;
     AsCallContext: ICallContext;
     case TIsppVarType of
-      evInt: (AsInt: Longint);
+      evInt: (AsInt: Int64);
       evLValue: (AsPtr: PIsppVariant);
   end;
 

+ 147 - 23
Projects/ISPP/IsppFuncs.pas

@@ -9,14 +9,16 @@ interface
 
 {$I ..\Version.inc}
 
-uses Windows, Classes, IsppVarUtils, IsppIntf, IsppTranslate, IsppParser;
+uses
+  Windows, Classes, IsppVarUtils, IsppIntf, IsppTranslate, IsppParser;
 
 procedure Register(Preproc: TPreprocessor);
 
 implementation
 
-uses SysUtils, IniFiles, Registry, IsppConsts, IsppBase, IsppIdentMan,
-  IsppSessions, DateUtils, FileClass, MD5, SHA1, PathFunc, CmnFunc2;
+uses
+  SysUtils, IniFiles, Registry, IsppConsts, IsppBase, IsppIdentMan,
+  IsppSessions, DateUtils, FileClass, MD5, SHA1, PathFunc, CmnFunc2, Int64Em;
   
 var
   IsWin64: Boolean;
@@ -186,19 +188,20 @@ end;
 {FileSize(<filename>)}
 function FileSize(Ext: Longint; const Params: IIsppFuncParams; const FuncResult: IIsppFuncResult): TIsppFuncResult; stdcall;
 var
-  F: file of byte;
+  SearchRec: TSearchRec;
 begin
   if CheckParams(Params, [evStr], 1, Result) then
   try
     with IInternalFuncParams(Params) do
     begin
-      {$I-}
-      FileMode := fmOpenRead;
-      AssignFile(F, PrependPath(Ext, Get(0).AsStr));
-      Reset(F);
-      MakeInt(ResPtr^, System.FileSize(F));
-      CloseFile(F);
-      {$I-}
+      if FindFirst(PrependPath(Ext, Get(0).AsStr), faAnyFile, SearchRec) = 0 then begin
+        try
+          MakeInt(ResPtr^, SearchRec.Size);
+        finally
+          FindClose(SearchRec);
+        end;
+      end else
+        MakeInt(ResPtr^, -1);
     end
   except
     on E: Exception do
@@ -766,7 +769,7 @@ function CopyFunc(Ext: Longint; const Params: IIsppFuncParams;
   const FuncResult: IIsppFuncResult): TIsppFuncResult; stdcall;
 var
   S: string;
-  B, C: Integer;
+  B, C: Int64;
 begin
   if CheckParams(Params, [evStr, evInt, evInt], 2, Result) then
   try
@@ -775,7 +778,19 @@ begin
       S := Get(0).AsStr;
       B := Get(1).AsInt;
       if GetCount > 2 then C := Get(2).AsInt else C := MaxInt;
-      MakeStr(ResPtr^, Copy(S, B, C));
+
+      { Constrain 64-bit arguments to 32 bits without truncating them }
+      if B < 1 then
+        B := 1;
+      if C > Maxint then
+        C := Maxint;
+      if (B > Maxint) or (C < 0) then begin
+        { Result should be empty in these cases }
+        B := 1;
+        C := 0;
+      end;
+
+      MakeStr(ResPtr^, Copy(S, Integer(B), Integer(C)));
     end;
   except
     on E: Exception do
@@ -863,7 +878,7 @@ begin
   end;
 end;
 
-function GetFileVersion(Ext: Longint; const Params: IIsppFuncParams;
+function GetVersionNumbersStringFunc(Ext: Longint; const Params: IIsppFuncParams;
   const FuncResult: IIsppFuncResult): TIsppFuncResult; stdcall;
 var
   Filename: string;
@@ -908,6 +923,41 @@ begin
   end;
 end;
 
+function ComparePackedVersionFunc(Ext: Longint; const Params: IIsppFuncParams;
+  const FuncResult: IIsppFuncResult): TIsppFuncResult; stdcall;
+begin
+  if CheckParams(Params, [evInt, evInt], 2, Result) then
+  try
+    with IInternalFuncParams(Params) do
+      MakeInt(ResPtr^, Compare64(Integer64(Get(0).AsInt), Integer64(Get(1).AsInt)));
+  except
+    on E: Exception do
+    begin
+      FuncResult.Error(PChar(E.Message));
+      Result.Error := ISPPFUNC_FAIL
+    end;
+  end;
+end;
+
+function SamePackedVersionFunc(Ext: Longint; const Params: IIsppFuncParams;
+  const FuncResult: IIsppFuncResult): TIsppFuncResult; stdcall;
+begin
+  if CheckParams(Params, [evInt, evInt], 2, Result) then
+  try
+    with IInternalFuncParams(Params) do
+      if Compare64(Integer64(Get(0).AsInt), Integer64(Get(1).AsInt)) = 0 then
+        MakeInt(ResPtr^, 1)
+      else
+        MakeInt(ResPtr^, 0)
+  except
+    on E: Exception do
+    begin
+      FuncResult.Error(PChar(E.Message));
+      Result.Error := ISPPFUNC_FAIL
+    end;
+  end;
+end;
+
 {str GetStringFileInfo(str FileName, str StringName, int Lang)}
 function GetFileVersionInfoItem(Ext: Longint; const Params: IIsppFuncParams;
   const FuncResult: IIsppFuncResult): TIsppFuncResult; stdcall;
@@ -1204,6 +1254,8 @@ begin
     with IInternalFuncParams(Params) do
     begin
       Integer(F) := Get(0).AsInt;
+      if Integer(F) = 0 then
+        raise Exception.Create('Invalid file handle');
       {$I-}
       Readln(F^, S);
       {$I+}
@@ -1231,11 +1283,13 @@ begin
     with IInternalFuncParams(Params) do
     begin
       Integer(F) := Get(0).AsInt;
+      if Integer(F) = 0 then
+        raise Exception.Create('Invalid file handle');
       {$I-}
       Reset(F^);
       {$I+}
       if IOResult <> 0 then
-        FuncResult.Error('Failed to reset a file')
+        raise Exception.Create('Failed to reset a file')
       else
         ResPtr^ := NULL
     end;
@@ -1259,6 +1313,8 @@ begin
     with IInternalFuncParams(Params) do
     begin
       Integer(F) := Get(0).AsInt;
+      if Integer(F) = 0 then
+        raise Exception.Create('Invalid file handle');
       {$I-}
       IsEof := Eof(F^);
       {$I+}
@@ -1286,6 +1342,8 @@ begin
     with IInternalFuncParams(Params) do
     begin
       Integer(F) := Get(0).AsInt;
+      if Integer(F) = 0 then
+        raise Exception.Create('Invalid file handle');
       {$I-}
       Close(F^);
       {$I+}
@@ -1294,11 +1352,6 @@ begin
       TPreprocessor(Ext).UncollectGarbage(Pointer(F));
     end;
   except
-    on E: EAccessViolation do
-    begin
-      FuncResult.Error('Invalid file handle');
-      Result.Error := ISPPFUNC_FAIL
-    end;
     on E: Exception do
     begin
       FuncResult.Error(PChar(E.Message));
@@ -1331,7 +1384,7 @@ begin
         New(FileDate);
         FileDate^ := Age;
         TPreprocessor(Ext).CollectGarbage(FileDate, GarbageReleaseDateTime);
-        MakeInt(ResPtr^, Integer(FileDate));
+        MakeInt(ResPtr^, Int64(FileDate));
       end
       else
         MakeInt(ResPtr^, -1);
@@ -1357,7 +1410,7 @@ begin
       New(DateTime);
       DateTime^ := Now;
       TPreprocessor(Ext).CollectGarbage(DateTime, GarbageReleaseDateTime);
-      MakeInt(ResPtr^, Integer(DateTime));
+      MakeInt(ResPtr^, Int64(DateTime));
     end;
   except
     on E: Exception do
@@ -1709,6 +1762,72 @@ begin
   end;
 end;
 
+function MessageFunc(Ext: Longint; const Params: IIsppFuncParams;
+  const FuncResult: IIsppFuncResult): TIsppFuncResult; stdcall;
+begin
+  if CheckParams(Params, [evStr], 1, Result) then
+  try
+    with IInternalFuncParams(Params) do begin
+      { Also see Pragma in IsppTranslate }
+      TPreprocessor(Ext).SendMsg(Get(0).AsStr, imtStatus);
+      ResPtr^ := NULL;
+    end;
+  except
+    on E: Exception do
+    begin
+      FuncResult.Error(PChar(E.Message));
+      Result.Error := ISPPFUNC_FAIL
+    end;
+  end;
+end;
+
+function WarningFunc(Ext: Longint; const Params: IIsppFuncParams;
+  const FuncResult: IIsppFuncResult): TIsppFuncResult; stdcall;
+begin
+  if CheckParams(Params, [evStr], 1, Result) then
+  try
+    with IInternalFuncParams(Params) do begin
+      { Also see Pragma in IsppTranslate }
+      TPreprocessor(Ext).Warning(Get(0).AsStr, []);
+      ResPtr^ := NULL;
+    end;
+  except
+    on E: Exception do
+    begin
+      FuncResult.Error(PChar(E.Message));
+      Result.Error := ISPPFUNC_FAIL
+    end;
+  end;
+end;
+
+function ErrorFunc(Ext: Longint; const Params: IIsppFuncParams;
+  const FuncResult: IIsppFuncResult): TIsppFuncResult; stdcall;
+var
+  CatchException: Boolean;
+  ErrorMsg: String;
+begin
+  CatchException := True;
+  if CheckParams(Params, [evStr], 1, Result) then
+  try
+    with IInternalFuncParams(Params) do begin
+      { Also see Pragma and pcErrorDir in IsppTranslate }
+      ErrorMsg := Get(0).AsStr;
+      if ErrorMsg = '' then ErrorMsg := 'Error';
+      CatchException := False;
+      TPreprocessor(Ext).RaiseError(ErrorMsg);
+    end;
+  except
+    on E: Exception do
+    begin
+      if CatchException then begin
+        FuncResult.Error(PChar(E.Message));
+        Result.Error := ISPPFUNC_FAIL
+      end else
+        raise;
+    end;
+  end;
+end;
+
 procedure Register(Preproc: TPreprocessor);
 begin
   with Preproc do
@@ -1729,7 +1848,9 @@ begin
     RegisterFunction('Pos', PosFunc, -1);
     RegisterFunction('RPos', RPosFunc, -1);
     RegisterFunction('Len', LenFunc, -1);
-    RegisterFunction('GetFileVersion', GetFileVersion, -1);
+    RegisterFunction('GetVersionNumbersString', GetVersionNumbersStringFunc, -1);
+    RegisterFunction('ComparePackedVersion', ComparePackedVersionFunc, -1);
+    RegisterFunction('SamePackedVersion', SamePackedVersionFunc, -1);
     RegisterFunction('GetStringFileInfo', GetFileVersionInfoItem, -1);
     RegisterFunction('SaveToFile', IsppFuncs.SaveToFile, -1);
     RegisterFunction('Find', FindLine, -1);
@@ -1767,6 +1888,9 @@ begin
     RegisterFunction('Trim', TrimFunc, -1);
     RegisterFunction('StringChange', StringChangeFunc, -1);
     RegisterFunction('IsWin64', IsWin64Func, -1);
+    RegisterFunction('Message', MessageFunc, -1);
+    RegisterFunction('Warning', WarningFunc, -1);
+    RegisterFunction('Error', ErrorFunc, -1);
   end;
 end;
 

+ 9 - 4
Projects/ISPP/IsppIdentMan.pas

@@ -1,6 +1,11 @@
 {
   Inno Setup Preprocessor
   Copyright (C) 2001-2002 Alex Yackimoff
+
+  Inno Setup
+  Copyright (C) 1997-2010 Jordan Russell
+  Portions by Martijn Laan
+  For conditions of distribution and use, see LICENSE.TXT.
 }
 
 unit IsppIdentMan;
@@ -546,7 +551,7 @@ type
   protected
     constructor Create(Value: PIsppVariant);
     function GetType: TIsppVarType; stdcall;
-    function GetAsInt: Integer; stdcall;
+    function GetAsInt: Int64; stdcall;
     function GetAsString(Buf: PChar; BufSize: Integer): Integer; stdcall;
   end;
 
@@ -555,7 +560,7 @@ begin
   FValue := Value
 end;
 
-function TFuncParam.GetAsInt: Integer;
+function TFuncParam.GetAsInt: Int64;
 begin
   Result := FValue^.AsInt
 end;
@@ -593,7 +598,7 @@ type
     function InternalGet(Index: Integer): PIsppVariant;
     function ResPtr: PIsppVariant;
     { IIsppFuncResult }
-    procedure SetAsInt(Value: Integer); stdcall;
+    procedure SetAsInt(Value: Int64); stdcall;
     procedure SetAsString(Value: PChar); stdcall;
     procedure SetAsNull; stdcall;
     procedure Error(Message: PChar); stdcall;
@@ -675,7 +680,7 @@ begin
   Result := @FResult
 end;
 
-procedure TFuncCallContext.SetAsInt(Value: Integer);
+procedure TFuncCallContext.SetAsInt(Value: Int64);
 begin
   MakeInt(FResult, Value)
 end;

+ 8 - 4
Projects/ISPP/IsppIntf.pas

@@ -1,7 +1,11 @@
 {
   Inno Setup Preprocessor
   Copyright (C) 2001-2002 Alex Yackimoff
-  $Id: IsppIntf.pas,v 1.2 2009/04/02 14:20:59 mlaan Exp $
+
+  Inno Setup
+  Copyright (C) 1997-2020 Jordan Russell
+  Portions by Martijn Laan
+  For conditions of distribution and use, see LICENSE.TXT.
 }
 
 unit IsppIntf;
@@ -32,12 +36,12 @@ type
 
   IIsppFuncParam = interface
     function GetType: TIsppVarType; stdcall;
-    function GetAsInt: Integer; stdcall;
+    function GetAsInt: Int64; stdcall;
     function GetAsString(Buf: PChar; BufSize: Integer): Integer; stdcall;
   end;
 
   IIsppFuncResult = interface
-    procedure SetAsInt(Value: Integer); stdcall;
+    procedure SetAsInt(Value: Int64); stdcall;
     procedure SetAsString(Value: PChar); stdcall;
     procedure SetAsNull; stdcall;
     procedure Error(Message: PChar); stdcall;
@@ -58,7 +62,7 @@ type
     const FuncResult: IIsppFuncResult): TIsppFuncResult; stdcall;
 
   IPreprocessor = interface
-    procedure DefineVariable(Name: PChar; Typ: TIsppVarType; Value: Longint);
+    procedure DefineVariable(Name: PChar; Typ: TIsppVarType; Value: Int64);
     procedure QueueLine(Line: PChar);
   end;
 

+ 15 - 10
Projects/ISPP/IsppParser.pas

@@ -1,6 +1,11 @@
 {
   Inno Setup Preprocessor
   Copyright (C) 2001-2002 Alex Yackimoff
+
+  Inno Setup
+  Copyright (C) 1997-2010 Jordan Russell
+  Portions by Martijn Laan
+  For conditions of distribution and use, see LICENSE.TXT.
 }
 
 unit IsppParser;
@@ -32,13 +37,13 @@ type
       Offset: Integer; Options: PIsppParserOptions);
     function Evaluate: TIsppVariant;
     function Expr(StopOnComma: Boolean): TIsppVariant;
-    function IntExpr(StopOnComma: Boolean): Integer;
+    function IntExpr(StopOnComma: Boolean): Int64;
     function StrExpr(StopOnComma: Boolean): string;
   end;
 
 function Parse(const VarMan: IIdentManager; const AExpr: string; Offset: Integer; Options: PIsppParserOptions): TIsppVariant;
 function ParseStr(const VarMan: IIdentManager; const AExpr: string; Offset: Integer; Options: PIsppParserOptions): string;
-function ParseInt(const VarMan: IIdentManager; const AExpr: string; Offset: Integer; Options: PIsppParserOptions): Integer;
+function ParseInt(const VarMan: IIdentManager; const AExpr: string; Offset: Integer; Options: PIsppParserOptions): Int64;
 
 implementation
 
@@ -65,7 +70,7 @@ begin
   end;
 end;
 
-function ParseInt(const VarMan: IIdentManager; const AExpr: string; Offset: Integer; Options: PIsppParserOptions): Integer;
+function ParseInt(const VarMan: IIdentManager; const AExpr: string; Offset: Integer; Options: PIsppParserOptions): Int64;
 begin
   with TParser.Create(VarMan, AExpr, Offset, Options) do
   try
@@ -195,7 +200,7 @@ function TParser.Factor(DoEval: Boolean): TIsppVariant;
   end;
 
 var
-  I: Integer;
+  I: Int64;
   IdentType: TIdentType;
   CallContext: ICallContext;
   Op: TTokenKind;
@@ -267,7 +272,7 @@ begin
       end;
     tkNumber:
       begin
-        if not TryStrToInt(TokenString, I) then
+        if not TryStrToInt64(TokenString, I) then
           ErrorFmt(SCannotConvertToInteger, [TokenString]);
         MakeInt(Result, I);
       end;
@@ -301,7 +306,7 @@ end;
 
 function TParser.PerformOperation(Op1, Op2: TIsppVariant; Op: TTokenKind): TIsppVariant;
 var
-  A, B: Integer;
+  A, B: Int64;
   AsBool: Boolean;
 begin
   MakeRValue(Op1);
@@ -342,7 +347,7 @@ begin
           opEqual: AsBool := A = 0;
           opNotEqual: AsBool := A <> 0;
         end;
-        AsInt := Integer(AsBool)
+        AsInt := Int64(AsBool)
       end;
     end
     else
@@ -371,7 +376,7 @@ begin
           opShr: AsInt := A shr B;
           opMod: AsInt := A mod B;
         end;
-        if Op in [opGreater..opNotEqual, opOr, opAnd] then AsInt := Integer(AsBool)
+        if Op in [opGreater..opNotEqual, opOr, opAnd] then AsInt := Int64(AsBool)
       end
   except
     on E: Exception do Error(E.Message);
@@ -380,7 +385,7 @@ end;
 
 function TParser.UnaryOperation(Op: TTokenKind; Op1: TIsppVariant): TIsppVariant;
 var
-  A: Integer;
+  A: Int64;
 begin
   MakeRValue(Op1);
   A := 0; // satisfy compiler
@@ -462,7 +467,7 @@ begin
   end;
 end;
 
-function TParser.IntExpr(StopOnComma: Boolean): Integer;
+function TParser.IntExpr(StopOnComma: Boolean): Int64;
 var
   V: TIsppVariant;
 begin

+ 10 - 10
Projects/ISPP/IsppTranslate.pas

@@ -92,7 +92,6 @@ type
     procedure PushFile(const FileName: string);
     procedure PopFile;
     function CheckFile(const FileName: string): Boolean;
-    procedure SendMsg(const Msg: string; Typ: TIsppMessageType);
     function EmitDestination: TStringList;
   protected
     function GetDefaultScope: TDefineScope;
@@ -121,13 +120,14 @@ type
     destructor Destroy; override;
     procedure VerboseMsg(Level: Byte; const Msg: string; const Args: array of const);
     procedure Warning(const Msg: string; const Args: array of const);
+    procedure IssueMessage(const Message: string; MsgType: TIsppMessageType);
+    procedure SendMsg(const Msg: string; Typ: TIsppMessageType);
     procedure AddLine(const LineRead: string);
     function GetFileName(Code: Integer): string;
     function GetLineNumber(Code: Integer): Word;
     function GetNext(var LineFilename: string; var LineNumber: Integer;
       var LineText: string): Boolean;
     procedure IncludeFile(FileName: string; UseIncludePathOnly, ResetCurrentFile: Boolean);
-    procedure IssueMessage(const Message: string; MsgType: TIsppMessageType);
     procedure QueueLine(const LineRead: string);
     function PrependDirName(const FileName, Dir: string): string;
     procedure RegisterFunction(const Name: string; Handler: TIsppFunction; Ext: Longint);
@@ -840,15 +840,14 @@ function TPreprocessor.ProcessPreprocCommand(Command: TPreprocessorCommand;
           FOptions.VerboseLevel := IntExpr(True);
           EndOfExpr;
         end
-        else if P = 'warning' then
+        else if P = 'warning' then begin
+          { Also see WarningFunc in IsppFuncs }
           Warning(StrPragma(True), [])
-        else if P = 'message' then
-        begin
-          IssueMessage(
-            Format('%s(%d): %s', [string(GetFileName(-1)), GetLineNumber(-1), StrPragma(True)]), imtStatus)
-        end
-        else if P = 'error' then
-        begin
+        end else if P = 'message' then begin
+          { Also see MessageFunc in IsppFuncs }
+          SendMsg(StrPragma(True), imtStatus)
+        end else if P = 'error' then begin
+          { Also see ErrorFunc in IsppFuncs }
           ErrorMsg := StrPragma(True);
           if ErrorMsg = '' then ErrorMsg := 'Error';
           CatchException := False;
@@ -1015,6 +1014,7 @@ begin
       pcInclude: IncludeFile(Params);
       pcErrorDir:
         begin
+          { Also see ErrorFunc in IsppFuncs }
           if Params = '' then Params := 'Error';
           RaiseError(Params);
         end;

+ 8 - 4
Projects/ISPP/IsppVarUtils.pas

@@ -1,7 +1,11 @@
 {
   Inno Setup Preprocessor
   Copyright (C) 2001-2002 Alex Yackimoff
-  $Id: IsppVarUtils.pas,v 1.1 2004/02/26 22:24:19 mlaan Exp $
+
+  Inno Setup
+  Copyright (C) 1997-2010 Jordan Russell
+  Portions by Martijn Laan
+  For conditions of distribution and use, see LICENSE.TXT.
 }
 
 unit IsppVarUtils;
@@ -14,7 +18,7 @@ function SimplifyLValue(var Src: TIsppVariant): Boolean;
 procedure MakeRValue(var Src: TIsppVariant);
 function GetRValue(const Src: TIsppVariant): TIsppVariant;
 procedure CopyExpVar(Src: TIsppVariant; var Dest: TIsppVariant);
-procedure MakeInt(var Op: TIsppVariant; Value: Integer);
+procedure MakeInt(var Op: TIsppVariant; Value: Int64);
 procedure MakeStr(var Op: TIsppVariant; const Value: string);
 procedure MakeBool(var Op: TIsppVariant; Value: Boolean);
 function TryStrToInt(Str: string; var Int: Integer): Boolean;
@@ -59,7 +63,7 @@ begin
     Move(Src, Dest, SizeOf(TIsppVariant));
 end;
 
-procedure MakeInt(var Op: TIsppVariant; Value: Integer);
+procedure MakeInt(var Op: TIsppVariant; Value: Int64);
 begin
   Op.Typ := evInt;
   Op.AsInt := Value;
@@ -75,7 +79,7 @@ end;
 
 procedure MakeBool(var Op: TIsppVariant; Value: Boolean);
 begin
-  MakeInt(Op, Integer(Value));
+  MakeInt(Op, Int64(Value));
 end;
 
 function TryStrToInt(Str: string; var Int: Integer): Boolean;

+ 28 - 3
Projects/InstFnc2.pas

@@ -16,6 +16,7 @@ interface
 function CreateShellLink(const Filename, Description, ShortcutTo, Parameters,
   WorkingDir: String; IconFilename: String; const IconIndex, ShowCmd: Integer;
   const HotKey: Word; FolderShortcut: Boolean; const AppUserModelID: String;
+  const AppUserModelToastActivatorCLSID: PGUID;
   const ExcludeFromShowInNewInstall, PreventPinning: Boolean): String;
 procedure RegisterTypeLibrary(const Filename: String);
 procedure UnregisterTypeLibrary(const Filename: String);
@@ -53,6 +54,12 @@ begin
   Result := (WindowsVersion >= Cardinal($06020000));
 end;
 
+function IsWindows10: Boolean;
+{ Returns True if running Windows 10 or later }
+begin
+  Result := (WindowsVersion >= Cardinal($0A000000));
+end;
+
 procedure AssignWorkingDir(const SL: IShellLink; const WorkingDir: String);
 { Assigns the specified working directory to SL. If WorkingDir is empty then
   we select one ourself as best we can. (Leaving the working directory field
@@ -156,6 +163,7 @@ type
 function CreateShellLink(const Filename, Description, ShortcutTo, Parameters,
   WorkingDir: String; IconFilename: String; const IconIndex, ShowCmd: Integer;
   const HotKey: Word; FolderShortcut: Boolean; const AppUserModelID: String;
+  const AppUserModelToastActivatorCLSID: PGUID;
   const ExcludeFromShowInNewInstall, PreventPinning: Boolean): String;
 { Creates a lnk file named Filename, with a description of Description, with a
   HotKey hotkey, which points to ShortcutTo. Filename should be a full path.
@@ -179,6 +187,9 @@ const
   PKEY_AppUserModel_StartPinOption: TPropertyKey = (
     fmtid: (D1:$9F4C2855; D2:$9F79; D3:$4B39; D4:($A8,$D0,$E1,$D4,$2D,$E1,$D5,$F3));
     pid: 12);
+  PKEY_AppUserModel_ToastActivatorCLSID: TPropertyKey = (
+    fmtid: (D1:$9F4C2855; D2:$9F79; D3:$4B39; D4:($A8,$D0,$E1,$D4,$2D,$E1,$D5,$F3));
+    pid: 26);
   APPUSERMODEL_STARTPINOPTION_NOPINONINSTALL = 1;
 
 {$IFNDEF Delphi3OrHigher}
@@ -231,7 +242,7 @@ begin
 
     { Note: Vista and newer support IPropertyStore but Vista errors if you try to
       commit a PKEY_AppUserModel_ID, so avoid setting the property on Vista. }
-    if IsWindows7 and ((AppUserModelID <> '') or ExcludeFromShowInNewInstall or PreventPinning) then begin
+    if IsWindows7 and ((AppUserModelID <> '') or (AppUserModelToastActivatorCLSID <> nil) or ExcludeFromShowInNewInstall or PreventPinning) then begin
       OleResult := SL.QueryInterface(IID_IPropertyStore, PS);
       if OleResult <> S_OK then
         RaiseOleError('IShellLink::QueryInterface(IID_IPropertyStore)', OleResult);
@@ -244,7 +255,7 @@ begin
         if OleResult <> S_OK then
           RaiseOleError('IPropertyStore::SetValue(PKEY_AppUserModel_PreventPinning)', OleResult);
       end;
-      if (AppUserModelID <> '') then begin
+      if AppUserModelID <> '' then begin
         PV.vt := VT_BSTR;
         PV.bstrVal := StringToOleStr(AppUserModelID);
         if PV.bstrVal = nil then
@@ -257,6 +268,13 @@ begin
           SysFreeString(PV.bstrVal);
         end;
       end;
+      if IsWindows10 and (AppUserModelToastActivatorCLSID <> nil) then begin
+        PV.vt := VT_CLSID;
+        PV.puuid := AppUserModelToastActivatorCLSID;
+        OleResult := PS.SetValue(PKEY_AppUserModel_ToastActivatorCLSID, PV);
+        if OleResult <> S_OK then
+          RaiseOleError('IPropertyStore::SetValue(PKEY_AppUserModel_ToastActivatorCLSID)', OleResult);
+      end;
       if ExcludeFromShowInNewInstall then begin
         PV.vt := VT_BOOL;
         Smallint(PV.vbool) := -1;
@@ -349,7 +367,7 @@ begin
 
   { Note: Vista and newer support IPropertyStore but Vista errors if you try to
     commit a PKEY_AppUserModel_ID, so avoid setting the property on Vista. }
-  if IsWindows7 and ((AppUserModelID <> '') or ExcludeFromShowInNewInstall or PreventPinning) then begin
+  if IsWindows7 and ((AppUserModelID <> '') or (AppUserModelToastActivatorCLSID <> nil) or ExcludeFromShowInNewInstall or PreventPinning) then begin
     PS := Obj as {$IFDEF IS_D14}PropSys.{$ENDIF}IPropertyStore;
     { According to MSDN the PreventPinning property should be set before the ID property. In practice
       this doesn't seem to matter - at least not for shortcuts - but do it first anyway. }
@@ -368,6 +386,13 @@ begin
       if OleResult <> S_OK then
         RaiseOleError('IPropertyStore::SetValue(PKEY_AppUserModel_ID)', OleResult);
     end;
+    if IsWindows10 and (AppUserModelToastActivatorCLSID <> nil) then begin
+      PV.vt := VT_CLSID;
+      PV.puuid := AppUserModelToastActivatorCLSID;
+      OleResult := PS.SetValue(PKEY_AppUserModel_ToastActivatorCLSID, PV);
+      if OleResult <> S_OK then
+        RaiseOleError('IPropertyStore::SetValue(PKEY_AppUserModel_ToastActivatorCLSID)', OleResult);
+    end;
     if ExcludeFromShowInNewInstall then begin
       PV.vt := VT_BOOL;
       PV.boolVal := True;

+ 61 - 6
Projects/InstFunc.pas

@@ -2,7 +2,7 @@ unit InstFunc;
 
 {
   Inno Setup
-  Copyright (C) 1997-2019 Jordan Russell
+  Copyright (C) 1997-2020 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -80,6 +80,11 @@ function GetSHA1OfAnsiString(const S: AnsiString): TSHA1Digest;
 {$IFDEF UNICODE}
 function GetSHA1OfUnicodeString(const S: UnicodeString): TSHA1Digest;
 {$ENDIF}
+function GetSHA256OfFile(const DisableFsRedir: Boolean; const Filename: String): String;
+function GetSHA256OfAnsiString(const S: AnsiString): String;
+{$IFDEF UNICODE}
+function GetSHA256OfUnicodeString(const S: UnicodeString): String;
+{$ENDIF}
 function GetRegRootKeyName(const RootKey: HKEY): String;
 function GetSpaceOnDisk(const DisableFsRedir: Boolean; const DriveRoot: String;
   var FreeBytes, TotalBytes: Integer64): Boolean;
@@ -106,7 +111,7 @@ procedure RaiseOleError(const FunctionName: String; const ResultCode: HRESULT);
 procedure RefreshEnvironment;
 function ReplaceSystemDirWithSysWow64(const Path: String): String;
 function ReplaceSystemDirWithSysNative(Path: String; const IsWin64: Boolean): String;
-procedure UnregisterFont(const FontName, FontFilename: String);
+procedure UnregisterFont(const FontName, FontFilename: String; const PerUserFont: Boolean);
 function RestartComputer: Boolean;
 procedure RestartReplace(const DisableFsRedir: Boolean; TempFile, DestFile: String);
 procedure SplitNewParamStr(const Index: Integer; var AName, AValue: String);
@@ -117,7 +122,7 @@ function ForceDirectories(const DisableFsRedir: Boolean; Dir: String): Boolean;
 implementation
 
 uses
-  Messages, ShellApi, PathFunc, Msgs, MsgIDs, FileClass, RedirFunc, SetupTypes;
+  Messages, ShellApi, PathFunc, Msgs, MsgIDs, FileClass, RedirFunc, SetupTypes, Hash, Classes;
 
 procedure InternalError(const Id: String);
 begin
@@ -736,6 +741,21 @@ begin
   Result := SHA1Final(Context);
 end;
 
+function GetSHA256OfFile(const DisableFsRedir: Boolean; const Filename: String): String;
+{ Gets SHA-256 sum as a string of the file Filename. An exception will be raised upon
+  failure. }
+var
+  PrevState: TPreviousFsRedirectionState;
+begin
+  if not DisableFsRedirectionIf(DisableFsRedir, PrevState) then
+    InternalError('GetSHA256OfFile: DisableFsRedirectionIf failed.');
+  try
+    Result := THashSHA2.GetHashStringFromFile(Filename, SHA256);
+  finally
+    RestoreFsRedirection(PrevState);
+  end;
+end;
+
 function GetMD5OfAnsiString(const S: AnsiString): TMD5Digest;
 begin
   Result := MD5Buf(Pointer(S)^, Length(S)*SizeOf(S[1]));
@@ -760,6 +780,36 @@ begin
 end;
 {$ENDIF}
 
+function GetSHA256OfAnsiString(const S: AnsiString): String;
+var
+  M: TMemoryStream;
+begin
+  M := TMemoryStream.Create;
+  try
+    M.Write(Pointer(S)^, Length(S)*SizeOf(S[1]));
+    M.Seek(0, soFromBeginning);
+    Result := THashSHA2.GetHashString(M, SHA256);
+  finally
+    M.Free;
+  end;
+end;
+
+{$IFDEF UNICODE}
+function GetSHA256OfUnicodeString(const S: UnicodeString): String;
+var
+  M: TMemoryStream;
+begin
+  M := TMemoryStream.Create;
+  try
+    M.Write(Pointer(S)^, Length(S)*SizeOf(S[1]));
+    M.Seek(0, soFromBeginning);
+    Result := THashSHA2.GetHashString(M, SHA256);
+  finally
+    M.Free;
+  end;
+end;
+{$ENDIF}
+
 var
   SFCInitialized: Boolean;
   SfcIsFileProtectedFunc: function(RpcHandle: THandle; ProtFileName: PWideChar): BOOL; stdcall;
@@ -1247,15 +1297,20 @@ begin
     DoNonNT;
 end;
 
-procedure UnregisterFont(const FontName, FontFilename: String);
+procedure UnregisterFont(const FontName, FontFilename: String; const PerUserFont: Boolean);
 const
   FontsKeys: array[Boolean] of PChar =
     (NEWREGSTR_PATH_SETUP + '\Fonts',
      'Software\Microsoft\Windows NT\CurrentVersion\Fonts');
 var
-  K: HKEY;
+  RootKey, K: HKEY;
 begin
-  if RegOpenKeyExView(rvDefault, HKEY_LOCAL_MACHINE, FontsKeys[UsingWinNT],
+  if PerUserFont then
+    RootKey := HKEY_CURRENT_USER
+  else
+    RootKey := HKEY_LOCAL_MACHINE;
+
+  if RegOpenKeyExView(rvDefault, RootKey, FontsKeys[UsingWinNT],
      0, KEY_SET_VALUE, K) = ERROR_SUCCESS then begin
     RegDeleteValue(K, PChar(FontName));
     RegCloseKey(K);

+ 358 - 62
Projects/Install.pas

@@ -2,7 +2,7 @@ unit Install;
 
 {
   Inno Setup
-  Copyright (C) 1997-2011 Jordan Russell
+  Copyright (C) 1997-2020 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -16,8 +16,14 @@ interface
 procedure PerformInstall(var Succeeded: Boolean; const ChangesEnvironment,
   ChangesAssociations: Boolean);
 
+
+type
+  TOnDownloadProgress = function(const Url, BaseName: string; const Progress, ProgressMax: Int64): Boolean of object;
+
 procedure ExtractTemporaryFile(const BaseName: String);
 function ExtractTemporaryFiles(const Pattern: String): Integer;
+function DownloadTemporaryFile(const Url, BaseName, RequiredSHA256OfFile: String; const OnDownloadProgress: TOnDownloadProgress): Int64;
+function DownloadTemporaryFileSize(const Url: String): Int64;
 
 implementation
 
@@ -26,7 +32,7 @@ uses
   InstFunc, InstFnc2, SecurityFunc, Msgs, Main, Logging, Extract, FileClass,
   Compress, SHA1, PathFunc, CmnFunc, CmnFunc2, RedirFunc, Int64Em, MsgIDs,
   Wizard, DebugStruct, DebugClient, VerInfo, ScriptRunner, RegDLL, Helper,
-  ResUpdate, LibFusion, TaskbarProgressFunc, NewProgressBar, RestartManager;
+  ResUpdate, DotNet, TaskbarProgressFunc, NewProgressBar, RestartManager, Net.HTTPClient;
 
 type
   TSetupUninstallLog = class(TUninstallLog)
@@ -310,6 +316,13 @@ begin
       Result := PathExtractName(Result);
 end;
 
+function LastErrorIndicatesPossiblyInUse(const LastError: DWORD; const CheckAlreadyExists: Boolean): Boolean;
+begin
+  Result := (LastError = ERROR_ACCESS_DENIED) or
+            (LastError = ERROR_SHARING_VIOLATION) or
+            (CheckAlreadyExists and (LastError = ERROR_ALREADY_EXISTS));
+end;
+
 procedure PerformInstall(var Succeeded: Boolean; const ChangesEnvironment,
   ChangesAssociations: Boolean);
 type
@@ -897,37 +910,54 @@ var
     F.WriteBuffer(UninstallerMsgTail, SizeOf(UninstallerMsgTail));
   end;
 
+  type
+    TOverwriteAll = (oaUnknown, oaOverwrite, oaKeep);
+
   procedure ProcessFileEntry(const CurFile: PSetupFileEntry;
     const DisableFsRedir: Boolean; ASourceFile, ADestName: String;
-    const FileLocationFilenames: TStringList; const AExternalSize: Integer64);
+    const FileLocationFilenames: TStringList; const AExternalSize: Integer64;
+    var ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll;
+    var WarnedPerUserFonts: Boolean);
 
     procedure InstallFont(const Filename, FontName: String;
-      const AddToFontTableNow: Boolean);
+      const PerUserFont, AddToFontTableNow: Boolean; var WarnedPerUserFonts: Boolean);
     const
       FontsKeys: array[Boolean] of PChar =
         (NEWREGSTR_PATH_SETUP + '\Fonts',
          'Software\Microsoft\Windows NT\CurrentVersion\Fonts');
     var
-      K: HKEY;
+      RootKey, K: HKEY;
     begin
-      { 64-bit Windows note: The Fonts key is evidently exempt from registry
-        redirection. When a 32-bit app writes to the Fonts key, it's the main
-        64-bit key that is modified. (There is actually a Fonts key under
-        Wow6432Node but it appears it's never used or updated.)
-        Also: We don't bother with any FS redirection stuff here. I'm not sure
-        it's safe to disable FS redirection when calling AddFontResource, or
-        if it would even work. Users should be installing their fonts to the
-        Fonts directory instead of the System directory anyway. }
-      if RegOpenKeyExView(rvDefault, HKEY_LOCAL_MACHINE, FontsKeys[IsNT], 0,
-         KEY_SET_VALUE, K) = ERROR_SUCCESS then begin
-        if RegSetValueEx(K, PChar(FontName), 0, REG_SZ, PChar(Filename),
-           (Length(Filename)+1)*SizeOf(Filename[1])) <> ERROR_SUCCESS then
-          Log('Failed to set value in Fonts registry key.');
-        RegCloseKey(K);
-      end
-      else
-        Log('Failed to open Fonts registry key.');
-
+      if PerUserFont and (WindowsVersion < Cardinal($0A0042EE)) then begin
+        { Per-user fonts require Windows 10 Version 1803 (10.0.17134) or newer. }
+        if not WarnedPerUserFonts then begin
+          Log('Failed to set value in Fonts registry key: per-user fonts are not supported by this version of Windows.');
+          WarnedPerUserFonts := True;
+        end;
+      end else begin
+        { 64-bit Windows note: The Fonts key is evidently exempt from registry
+          redirection. When a 32-bit app writes to the Fonts key, it's the main
+          64-bit key that is modified. (There is actually a Fonts key under
+          Wow6432Node but it appears it's never used or updated.)
+          Also: We don't bother with any FS redirection stuff here. I'm not sure
+          it's safe to disable FS redirection when calling AddFontResource, or
+          if it would even work. Users should be installing their fonts to the
+          Fonts directory instead of the System directory anyway. }
+        if PerUserFont then
+          RootKey := HKEY_CURRENT_USER
+        else
+          RootKey := HKEY_LOCAL_MACHINE;
+        if RegOpenKeyExView(rvDefault, RootKey, FontsKeys[IsNT], 0,
+           KEY_SET_VALUE, K) = ERROR_SUCCESS then begin
+          if RegSetValueEx(K, PChar(FontName), 0, REG_SZ, PChar(Filename),
+             (Length(Filename)+1)*SizeOf(Filename[1])) <> ERROR_SUCCESS then
+            Log('Failed to set value in Fonts registry key.');
+          RegCloseKey(K);
+        end
+        else
+          Log('Failed to open Fonts registry key.');
+      end;
+      
       if AddToFontTableNow then begin
         repeat
           { Note: AddFontResource doesn't set the thread's last error code }
@@ -1034,6 +1064,26 @@ var
       end;
     end;
 
+    function AskOverwrite(const DestFile, Instruction, Caption: string; const ButtonLabels: array of String;
+      const VerificationText: String; const Typ: TMsgBoxType; const Default, Overwrite: Integer;
+      var OverwriteAll: TOverwriteAll): Boolean;
+    var
+      VerificationFlagChecked: BOOL;
+    begin
+      if OverwriteAll = oaKeep then
+        Result := False { The user already said to keep (=not overwrite) all }
+      else begin
+        Result := LoggedTaskDialogMsgBox('', Instruction, DestFile + SNewLine2 + Caption, '',
+          Typ, MB_YESNO, ButtonLabels, 0, True, Default, VerificationText, @VerificationFlagChecked) = Overwrite;
+        if VerificationFlagChecked then begin
+          if Result then
+            OverwriteAll := oaOverwrite
+          else
+            OverwriteAll := oaKeep;
+        end;
+      end;
+    end;
+
   var
     ProgressUpdated: Boolean;
     PreviousProgress: Integer64;
@@ -1057,6 +1107,7 @@ var
     LastError: DWORD;
     DestF, SourceF: TFile;
     Flags: TMakeDirFlags;
+    Overwrite, PerUserFont: Boolean;
   label Retry, Skip;
   begin
     Log('-- File entry --');
@@ -1203,10 +1254,20 @@ var
                  ((ExistingVersionInfo.MS > CurFileVersionInfo.MS) or
                   ((ExistingVersionInfo.MS = CurFileVersionInfo.MS) and
                    (ExistingVersionInfo.LS > CurFileVersionInfo.LS))) then begin
-                if not(foPromptIfOlder in CurFile^.Options) or
-                   IsProtectedFile or
-                   (LoggedMsgBox(DestFile + SNewLine2 + SetupMessages[msgExistingFileNewer],
-                    '', mbError, MB_YESNO, True, IDYES) <> IDNO) then begin
+                { Existing file is newer, ask user what to do unless we shouldn't }
+                if (foPromptIfOlder in CurFile^.Options) and not IsProtectedFile then begin
+                  if PromptIfOlderOverwriteAll <> oaOverwrite then begin
+                    Overwrite := AskOverwrite(DestFile, SetupMessages[msgExistingFileNewerSelectAction],
+                      SetupMessages[msgExistingFileNewer2],
+                      [SetupMessages[msgExistingFileNewerKeepExisting], SetupMessages[msgExistingFileNewerOverwriteExisting]],
+                      SetupMessages[msgExistingFileNewerOverwriteOrKeepAll],
+                     mbError, IDYES, IDNO, PromptIfOlderOverwriteAll);
+                    if not Overwrite then begin
+                      Log('User opted not to overwrite the existing file. Skipping.');
+                      goto Skip;
+                    end;
+                  end;
+                end else begin
                   Log('Existing file is a newer version. Skipping.');
                   goto Skip;
                 end;
@@ -1280,11 +1341,20 @@ var
               goto Skip;
             end;
             if CompareFileTime(ExistingFileDate, CurFileDate) > 0 then begin
-              { Existing file has a later time stamp }
-              if not(foPromptIfOlder in CurFile^.Options) or
-                 IsProtectedFile or
-                 (LoggedMsgBox(DestFile + SNewLine2 + SetupMessages[msgExistingFileNewer],
-                  '', mbError, MB_YESNO, True, IDYES) <> IDNO) then begin
+              { Existing file has a later time stamp, ask user what to do unless we shouldn't }
+              if (foPromptIfOlder in CurFile^.Options) and not IsProtectedFile then begin
+                if PromptIfOlderOverwriteAll <> oaOverwrite then begin
+                  Overwrite := AskOverwrite(DestFile, SetupMessages[msgExistingFileNewerSelectAction],
+                    SetupMessages[msgExistingFileNewer2],
+                    [SetupMessages[msgExistingFileNewerKeepExisting], SetupMessages[msgExistingFileNewerOverwriteExisting]],
+                    SetupMessages[msgExistingFileNewerOverwriteOrKeepAll],
+                    mbError, IDYES, IDNO, PromptIfOlderOverwriteAll);
+                  if not Overwrite then begin
+                    Log('User opted not to overwrite the existing file. Skipping.');
+                    goto Skip;
+                  end;
+                end;
+              end else begin
                 Log('Existing file has a later time stamp. Skipping.');
                 goto Skip;
               end;
@@ -1301,13 +1371,19 @@ var
             goto Skip;
           end;
 
-          { If file already exists and foConfirmOverwrite is in Options, ask
-            the user if it's OK to overwrite }
-          if (foConfirmOverwrite in CurFile^.Options) and
-             (LoggedMsgBox(DestFile + SNewLine2 + SetupMessages[msgFileExists],
-              '', mbConfirmation, MB_YESNO, True, IDNO) <> IDYES) then begin
-            Log('User opted not to overwrite the existing file. Skipping.');
-            goto Skip;
+          { If file already exists and foConfirmOverwrite is in Options, ask the user what to do }
+          if foConfirmOverwrite in CurFile^.Options then begin
+            if ConfirmOverwriteOverwriteAll <> oaOverwrite then begin
+              Overwrite := AskOverwrite(DestFile, SetupMessages[msgFileExistsSelectAction],
+                SetupMessages[msgFileExists2],
+                [SetupMessages[msgFileExistsOverwriteExisting], SetupMessages[msgFileExistsKeepExisting]],
+                SetupMessages[msgFileExistsOverwriteOrKeepAll],
+                mbConfirmation, IDNO, IDYES, ConfirmOverwriteOverwriteAll);
+              if not Overwrite then begin
+                Log('User opted not to overwrite the existing file. Skipping.');
+                goto Skip;
+              end;
+            end;
           end;
 
           { Check if existing file is read-only }
@@ -1442,8 +1518,7 @@ var
             if LastError = ERROR_FILE_NOT_FOUND then
               Break;
             { Does the error code indicate that it is possibly in use? }
-            if (LastError = ERROR_ACCESS_DENIED) or
-               (LastError = ERROR_SHARING_VIOLATION) then begin
+            if LastErrorIndicatesPossiblyInUse(LastError, False) then begin
               DoHandleFailedDeleteOrMoveFileTry('DeleteFile', TempFile, DestFile,
                 LastError, RetriesLeft, LastOperation, NeedsRestart, ReplaceOnRestart,
                 DoBreak, DoContinue);
@@ -1468,15 +1543,13 @@ var
                 ((CurFile^.FileType = ftUninstExe) and DestFileExistedBefore)) then begin
           LastOperation := SetupMessages[msgErrorRenamingTemp];
           { Since the DeleteFile above succeeded you would expect the rename to
-            also always succeed, but if it doesn't anyway. }
+            also always succeed, but if it doesn't retry anyway. }
           RetriesLeft := 4;
           while not MoveFileRedir(DisableFsRedir, TempFile, DestFile) do begin
             { Couldn't rename the temporary file... }
             LastError := GetLastError;
             { Does the error code indicate that it is possibly in use? }
-            if (LastError = ERROR_ACCESS_DENIED) or
-               (LastError = ERROR_SHARING_VIOLATION) or
-               (LastError = ERROR_ALREADY_EXISTS) then begin
+            if LastErrorIndicatesPossiblyInUse(LastError, True) then begin
               DoHandleFailedDeleteOrMoveFileTry('MoveFile', TempFile, DestFile,
                 LastError, RetriesLeft, LastOperation, NeedsRestart, ReplaceOnRestart,
                 DoBreak, DoContinue);
@@ -1526,8 +1599,11 @@ var
         if CurFile^.InstallFontName <> '' then begin
           LastOperation := '';
           LogFmt('Registering file as a font ("%s")', [CurFile^.InstallFontName]);
-          InstallFont(FontFilename, CurFile^.InstallFontName, not ReplaceOnRestart);
+          PerUserFont := not IsAdminInstallMode;
+          InstallFont(FontFilename, CurFile^.InstallFontName, PerUserFont, not ReplaceOnRestart, WarnedPerUserFonts);
           DeleteFlags := DeleteFlags or utDeleteFile_IsFont;
+          if PerUserFont then
+            DeleteFlags := DeleteFlags or utDeleteFile_PerUserFont;
         end;
 
         { There were no errors so add the uninstall log entry, unless the file
@@ -1683,7 +1759,8 @@ var
     function RecurseExternalCopyFiles(const DisableFsRedir: Boolean;
       const SearchBaseDir, SearchSubDir, SearchWildcard: String; const SourceIsWildcard: Boolean;
       const CurFile: PSetupFileEntry; const FileLocationFilenames: TStringList;
-      var ExpectedBytesLeft: Integer64): Boolean;
+      var ExpectedBytesLeft: Integer64; var ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll;
+      var WarnedPerUserFonts: Boolean): Boolean;
     var
       SearchFullPath, FileName, SourceFile, DestName: String;
       H: THandle;
@@ -1723,7 +1800,8 @@ var
                 Size := ExpectedBytesLeft;
               end;
               ProcessFileEntry(CurFile, DisableFsRedir, SourceFile, DestName,
-                FileLocationFilenames, Size);
+                FileLocationFilenames, Size, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,
+                WarnedPerUserFonts);
               Dec6464(ExpectedBytesLeft, Size);
             end;
           until not FindNextFile(H, FindData);
@@ -1741,7 +1819,8 @@ var
                 Result := RecurseExternalCopyFiles(DisableFsRedir, SearchBaseDir,
                   SearchSubDir + FindData.cFileName + '\', SearchWildcard,
                   SourceIsWildcard, CurFile, FileLocationFileNames,
-                  ExpectedBytesLeft) or Result;
+                  ExpectedBytesLeft, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,
+                  WarnedPerUserFonts) or Result;
             until not FindNextFile(H, FindData);
           finally
             Windows.FindClose(H);
@@ -1781,7 +1860,13 @@ var
     SourceWildcard: String;
     ProgressBefore, ExpectedBytesLeft: Integer64;
     DisableFsRedir, FoundFiles: Boolean;
+    ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll;
+    WarnedPerUserFonts: Boolean;
   begin
+    ConfirmOverwriteOverwriteAll := oaUnknown;
+    PromptIfOlderOverwriteAll := oaUnknown;
+    WarnedPerUserFonts := False;
+
     FileLocationFilenames := TStringList.Create;
     try
       for I := 0 to Entries[seFileLocation].Count-1 do
@@ -1805,7 +1890,8 @@ var
           if CurFile^.LocationEntry <> -1 then begin
             ExternalSize.Hi := 0;  { not used... }
             ExternalSize.Lo := 0;
-            ProcessFileEntry(CurFile, DisableFsRedir, '', '', FileLocationFilenames, ExternalSize);
+            ProcessFileEntry(CurFile, DisableFsRedir, '', '', FileLocationFilenames, ExternalSize,
+              ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll, WarnedPerUserFonts);
           end
           else begin
             { File is an 'external' file }
@@ -1823,7 +1909,8 @@ var
               FoundFiles := RecurseExternalCopyFiles(DisableFsRedir,
                 PathExtractPath(SourceWildcard), '', PathExtractName(SourceWildcard),
                 IsWildcard(SourceWildcard), CurFile, FileLocationFileNames,
-                ExpectedBytesLeft);
+                ExpectedBytesLeft, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,
+                WarnedPerUserFonts);
             until FoundFiles or
                   (foSkipIfSourceDoesntExist in CurFile^.Options) or
                   AbortRetryIgnoreTaskDialogMsgBox(
@@ -1913,8 +2000,8 @@ var
       WorkingDir, IconFilename: String; const IconIndex, ShowCmd: Integer;
       const NeverUninstall: Boolean; const CloseOnExit: TSetupIconCloseOnExit;
       const HotKey: Word; FolderShortcut: Boolean;
-      const AppUserModelID: String; const ExcludeFromShowInNewInstall: Boolean;
-      const PreventPinning: Boolean);
+      const AppUserModelID: String; const AppUserModelToastActivatorCLSID: PGUID;
+      const ExcludeFromShowInNewInstall, PreventPinning: Boolean);
     var
       BeginsWithGroup: Boolean;
       LinkFilename, PifFilename, UrlFilename, DirFilename, ProbableFilename,
@@ -1970,8 +2057,8 @@ var
           environment-variable strings (e.g. %SystemRoot%\...) }
         ResultingFilename := CreateShellLink(LinkFilename, Description, Path,
           Parameters, WorkingDir, IconFilename, IconIndex, ShowCmd, HotKey,
-          FolderShortcut, AppUserModelID, ExcludeFromShowInNewInstall,
-          PreventPinning);
+          FolderShortcut, AppUserModelID, AppUserModelToastActivatorCLSID,
+          ExcludeFromShowInNewInstall, PreventPinning);
         FolderShortcutCreated := FolderShortcut and DirExists(ResultingFilename);
 
         { If a .pif file was created, apply the "Close on exit" setting }
@@ -2046,6 +2133,7 @@ var
     CurIconNumber: Integer;
     CurIcon: PSetupIconEntry;
     FN: String;
+    TACLSID: PGUID;
   begin
     for CurIconNumber := 0 to Entries[seIcon].Count-1 do begin
       try
@@ -2058,15 +2146,19 @@ var
             FN := ExpandConst(Filename);
             if ioUseAppPaths in Options then
               FN := ExpandAppPath(FN);
-            if not(ioCreateOnlyIfFileExists in Options) or NewFileExistsRedir(IsWin64, FN) then
+            if not(ioCreateOnlyIfFileExists in Options) or NewFileExistsRedir(IsWin64, FN) then begin
+              if ioHasAppUserModelToastActivatorCLSID in Options then
+                TACLSID := @AppUserModelToastActivatorCLSID
+              else
+                TACLSID := nil;
               CreateAnIcon(IconName, ExpandConst(Comment), FN,
                 ExpandConst(Parameters), ExpandConst(WorkingDir),
                 ExpandConst(IconFilename), IconIndex, ShowCmd,
                 ioUninsNeverUninstall in Options, CloseOnExit, HotKey,
-                ioFolderShortcut in Options, ExpandConst(AppUserModelID),
+                ioFolderShortcut in Options, ExpandConst(AppUserModelID), TACLSID,
                 ioExcludeFromShowInNewInstall in Options,
                 ioPreventPinning in Options)
-            else
+            end else
               Log('Skipping due to "createonlyiffileexists" flag.');
 
             { Increment progress meter }
@@ -2756,6 +2848,8 @@ var
           SW_SHOWMAXIMIZED: Flags := Flags or utRun_RunMaximized;
           SW_HIDE: Flags := Flags or utRun_RunHidden;
         end;
+        if roDontLogParameters in RunEntry.Options then
+          Flags := Flags or utRun_DontLogParameters;
         UninstLog.Add(utRun, [ExpandConst(RunEntry.Name),
           ExpandConst(RunEntry.Parameters), ExpandConst(RunEntry.WorkingDir),
           ExpandConst(RunEntry.RunOnceId), ExpandConst(RunEntry.Verb)],
@@ -2882,8 +2976,7 @@ var
         Break;
       LastError := GetLastError;
       { Does the error code indicate that the file is possibly in use? }
-      if (LastError = ERROR_ACCESS_DENIED) or
-         (LastError = ERROR_SHARING_VIOLATION) then begin
+      if LastErrorIndicatesPossiblyInUse(LastError, False) then begin
         if RetriesLeft > 0 then begin
           LogFmt('The existing file appears to be in use (%d). ' +
             'Retrying.', [LastError]);
@@ -3315,7 +3408,7 @@ begin
       Exit;
     end;
   end;
-  InternalError(Format('ExtractTemporaryFile: The file "%s" was not found', [BaseName]));
+  InternalErrorFmt('ExtractTemporaryFile: The file "%s" was not found', [BaseName]);
 end;
 
 function ExtractTemporaryFiles(const Pattern: String): Integer;
@@ -3349,7 +3442,210 @@ begin
   end;
 
   if Result = 0 then
-    InternalError(Format('ExtractTemporaryFiles: No files matching "%s" found', [Pattern]));
+    InternalErrorFmt('ExtractTemporaryFiles: No files matching "%s" found', [Pattern]);
+end;
+
+type
+  THTTPDataReceiver = class
+  private
+    FBaseName, FUrl: String;
+    FOnDownloadProgress: TOnDownloadProgress;
+    FAborted: Boolean;
+    FProgress, FProgressMax: Int64;
+    FLastReportedProgress, FLastReportedProgressMax: Int64;
+  public
+    property BaseName: String write FBaseName;
+    property Url: String write FUrl;
+    property OnDownloadProgress: TOnDownloadProgress write FOnDownloadProgress;
+    property Aborted: Boolean read FAborted;
+    property Progress: Int64 read FProgress;
+    property ProgressMax: Int64 read FProgressMax;
+    procedure OnReceiveData(const Sender: TObject; AContentLength: Int64; AReadCount: Int64; var Abort: Boolean);
+  end;
+
+procedure THTTPDataReceiver.OnReceiveData(const Sender: TObject; AContentLength: Int64; AReadCount: Int64; var Abort: Boolean);
+begin
+  FProgress := AReadCount;
+  FProgressMax := AContentLength;
+
+  if Assigned(FOnDownloadProgress) then begin
+    { Make sure script isn't called crazy often because that would slow the download significantly. Only report:
+      -At start or finish
+      -Or if somehow Progress decreased or Max changed
+      -Or if at least 512 KB progress was made since last report
+    }
+    if (FProgress = 0) or (FProgress = FProgressMax) or
+       (FProgress < FLastReportedProgress) or (FProgressMax <> FLastReportedProgressMax) or
+       ((FProgress - FLastReportedProgress) > 524288) then begin
+      try
+        if not FOnDownloadProgress(FUrl, FBaseName, FProgress, FProgressMax) then
+          Abort := True;
+      finally
+        FLastReportedProgress := FProgress;
+        FLastReportedProgressMax := FProgressMax;
+      end;
+    end;
+  end;
+
+  if not Abort and DownloadTemporaryFileProcessMessages then
+    Application.ProcessMessages;
+
+  if Abort then
+    FAborted := True
+end;
+
+procedure SetUserAgentAndSecureProtocols(const AHTTPClient: THTTPClient);
+begin
+  AHTTPClient.UserAgent := SetupTitle + ' ' + SetupVersion;
+  { TLS 1.2 isn't enabled by default on older versions of Windows }
+  AHTTPClient.SecureProtocols := [THTTPSecureProtocol.TLS1, THTTPSecureProtocol.TLS11, THTTPSecureProtocol.TLS12];
+end;
+
+function DownloadTemporaryFile(const Url, BaseName, RequiredSHA256OfFile: String; const OnDownloadProgress: TOnDownloadProgress): Int64;
+var
+  DisableFsRedir: Boolean;
+  DestFile, TempFile: String;
+  TempF: TFileRedir;
+  HandleStream: THandleStream;
+  TempFileLeftOver: Boolean;
+  HTTPDataReceiver: THTTPDataReceiver;
+  HTTPClient: THTTPClient;
+  HTTPResponse: IHTTPResponse;
+  SHA256OfFile: String;
+  RetriesLeft: Integer;
+  LastError: DWORD;
+begin
+  if Url = '' then
+    InternalError('DownloadTemporaryFile: Invalid Url value');
+  if BaseName = '' then
+    InternalError('DownloadTemporaryFile: Invalid BaseName value');
+
+  DestFile := AddBackslash(TempInstallDir) + BaseName;
+
+  LogFmt('Downloading temporary file from %s: %s', [Url, DestFile]);
+
+  DisableFsRedir := InstallDefaultDisableFsRedir;
+
+  { Prepare directory }
+  if FileExists(DestFile) then begin
+    if (RequiredSHA256OfFile <> '') and (RequiredSHA256OfFile = GetSHA256OfFile(DisableFsRedir, DestFile)) then begin
+      Log('  File already downloaded.');
+      Result := 0;
+      Exit;
+    end;    
+    SetFileAttributesRedir(DisableFsRedir, DestFile, GetFileAttributesRedir(DisableFsRedir, DestFile) and not FILE_ATTRIBUTE_READONLY);
+    DelayDeleteFile(DisableFsRedir, DestFile, 13, 50, 250);
+  end else
+    ForceDirectories(DisableFsRedir, PathExtractPath(DestFile));
+
+  HTTPDataReceiver := nil;
+  HTTPClient := nil;
+  TempF := nil;
+  TempFileLeftOver := False;
+  HandleStream := nil;
+  try
+    { Setup downloader }
+    HTTPDataReceiver := THTTPDataReceiver.Create;
+    HTTPDataReceiver.BaseName := BaseName;
+    HTTPDataReceiver.Url := Url;
+    HTTPDataReceiver.OnDownloadProgress := OnDownloadProgress;
+
+    HTTPClient := THTTPClient.Create; { http://docwiki.embarcadero.com/RADStudio/Rio/en/Using_an_HTTP_Client }
+    SetUserAgentAndSecureProtocols(HTTPClient);
+    HTTPClient.OnReceiveData := HTTPDataReceiver.OnReceiveData;
+
+    { Create temporary file }
+    TempFile := GenerateUniqueName(DisableFsRedir, PathExtractPath(DestFile), '.tmp');
+    TempF := TFileRedir.Create(DisableFsRedir, TempFile, fdCreateAlways, faWrite, fsNone);
+    TempFileLeftOver := True;
+
+    { To test redirects: https://jrsoftware.org/download.php/is.exe
+      To test expired certificates: https://expired.badssl.com/
+      To test self-signed certificates: https://self-signed.badssl.com/
+      To test basic authentication: https://guest:[email protected]/HTTP/Basic/
+      To test 100 MB file: https://speed.hetzner.de/100MB.bin
+      To test 1 GB file: https://speed.hetzner.de/1GB.bin }
+
+    { Download to temporary file}
+    HandleStream := THandleStream.Create(TempF.Handle);
+    HTTPResponse := HTTPClient.Get(Url, HandleStream);
+    if HTTPDataReceiver.Aborted then
+      raise Exception.Create(SetupMessages[msgErrorDownloadAborted])
+    else if (HTTPResponse.StatusCode < 200) or (HTTPResponse.StatusCode > 299) then
+      raise Exception.Create(FmtSetupMessage(msgErrorDownloadFailed, [IntToStr(HTTPResponse.StatusCode), HTTPResponse.StatusText]))
+    else begin
+      { Download completed, get temporary file size and close it }
+      Result := HandleStream.Size;
+      FreeAndNil(HandleStream);
+      FreeAndNil(TempF);
+
+      { Check hash if specified, otherwise check everything else we can check }
+      if RequiredSHA256OfFile <> '' then begin
+        try
+          SHA256OfFile := GetSHA256OfFile(DisableFsRedir, TempFile);
+        except on E: Exception do
+          raise Exception.Create(FmtSetupMessage(msgErrorFileHash1, [E.Message]));
+        end;
+        if RequiredSHA256OfFile <> SHA256OfFile then
+          raise Exception.Create(FmtSetupMessage(msgErrorFileHash2, [RequiredSHA256OfFile, SHA256OfFile]));
+      end else begin
+        if HTTPDataReceiver.Progress <> HTTPDataReceiver.ProgressMax then
+          raise Exception.Create(FmtSetupMessage(msgErrorProgress, [IntToStr(HTTPDataReceiver.Progress), IntToStr(HTTPDataReceiver.ProgressMax)]))
+        else if HTTPDataReceiver.ProgressMax <> Result then
+          raise Exception.Create(FmtSetupMessage(msgErrorFileSize, [IntToStr(HTTPDataReceiver.ProgressMax), IntToStr(Result)]));
+      end;
+
+      { Rename the temporary file to the new name now, with retries if needed }
+      RetriesLeft := 4;
+      while not MoveFileRedir(DisableFsRedir, TempFile, DestFile) do begin
+        { Couldn't rename the temporary file... }
+        LastError := GetLastError;
+        { Does the error code indicate that it is possibly in use? }
+        if LastErrorIndicatesPossiblyInUse(LastError, True) then begin
+          LogFmt('  The existing file appears to be in use (%d). ' +
+            'Retrying.', [LastError]);
+          Dec(RetriesLeft);
+          Sleep(1000);
+          if RetriesLeft > 0 then
+            Continue;
+        end;
+        { Some other error occurred, or we ran out of tries }
+        SetLastError(LastError);
+        Win32ErrorMsg('MoveFile'); { Throws an exception }
+      end;
+      TempFileLeftOver := False;
+    end;
+  finally
+    HandleStream.Free;
+    TempF.Free;
+    HTTPClient.Free;
+    HTTPDataReceiver.Free;
+    if TempFileLeftOver then
+      DeleteFileRedir(DisableFsRedir, TempFile);
+  end;
+end;
+
+function DownloadTemporaryFileSize(const Url: String): Int64;
+var
+  HTTPClient: THTTPClient;
+  HTTPResponse: IHTTPResponse;
+begin
+  if Url = '' then
+    InternalError('DownloadTemporaryFileSize: Invalid Url value');
+
+  LogFmt('Getting size of %s.', [Url]);
+
+  HTTPClient := THTTPClient.Create;
+  try
+    SetUserAgentAndSecureProtocols(HTTPClient);
+    HTTPResponse := HTTPClient.Head(Url);
+    if (HTTPResponse.StatusCode < 200) or (HTTPResponse.StatusCode > 299) then
+      raise Exception.Create(FmtSetupMessage(msgErrorDownloadSizeFailed, [IntToStr(HTTPResponse.StatusCode), HTTPResponse.StatusText]))
+    else
+      Result := HTTPResponse.ContentLength; { Could be -1 }
+  finally
+    HTTPClient.Free;
+  end;
 end;
 
 end.

+ 32 - 0
Projects/LangOptionsSectionDirectives.pas

@@ -0,0 +1,32 @@
+unit LangOptionsSectionDirectives;
+
+{
+  Inno Setup
+  Copyright (C) 1997-2020 Jordan Russell
+  Portions by Martijn Laan
+  For conditions of distribution and use, see LICENSE.TXT.
+
+  LangOptions section directives
+}
+
+interface
+
+type
+  TLangOptionsSectionDirective = (
+    lsCopyrightFontName,
+    lsCopyrightFontSize,
+    lsDialogFontName,
+    lsDialogFontSize,
+    lsDialogFontStandardHeight,
+    lsLanguageCodePage,
+    lsLanguageID,
+    lsLanguageName,
+    lsRightToLeft,
+    lsTitleFontName,
+    lsTitleFontSize,
+    lsWelcomeFontName,
+    lsWelcomeFontSize);
+    
+implementation
+
+end.

+ 0 - 170
Projects/LibFusion.pas

@@ -1,170 +0,0 @@
-unit LibFusion;
-
-{
-  Inno Setup
-  Copyright (C) 1997-2009 Jordan Russell
-  Portions by Martijn Laan
-  For conditions of distribution and use, see LICENSE.TXT.
-
-  .NET functions
-
-  Also see http://msdn.microsoft.com/en-us/library/ms404523.aspx
-           http://msdn.microsoft.com/en-us/library/aa376204(VS.85).aspx
-
-  $jrsoftware: issrc/Projects/LibFusion.pas,v 1.6 2010/04/15 08:35:26 mlaan Exp $
-
-  Based on LibFusion.pas by RemObject Software updated for D2 compatibility, for
-  Inno Setup support functions usage and some other improvements.
-
-  // LibFusion.pas
-  // copyright (c) 2009 by RemObjects Software
-  //
-  // Uses InnoSetup License
-}
-
-interface
-
-uses
-  Ole2, SysUtils, Windows, CmnFunc2;
-
-type
-  IAssemblyCache = class(Ole2.IUnknown)
-    function UninstallAssembly(dwFlags: Integer; pszAssemblyName: PWideChar; pvReserved: Integer; var pulDisposition: Integer): Integer; virtual; stdcall; abstract;
-    function QueryAssemblyInfo(dwFlags: Integer; pszAssemblyName: PWideChar; pAsmInfo: Integer): Integer; virtual; stdcall; abstract;
-    function CreateAssemblyCacheItem(dwFlags: Integer; pvReserved: Integer; var ppAsmItem: Integer; pszAssemblyName: PWideChar): Integer; virtual; stdcall; abstract;
-    function CreateAssemblyScavenger(var ppAsmScavenger: Pointer): Integer; virtual; stdcall; abstract;
-    function InstallAssembly(dwFlags: Integer; pszManifestFilePath: PWideChar; pvReserved: Integer): Integer; virtual; stdcall; abstract;
-  end;
-
-  TAssemblyCacheInfo = class
-  private
-    fDll: THandle;
-    fCache: IAssemblyCache;
-  public
-    constructor Create(RegView: TRegView);
-    destructor Destroy; override;
-    property Cache: IAssemblyCache read FCache;
-    procedure InstallAssembly(const FileName: string);
-    procedure UninstallAssembly(const StrongAssemblyName: string); // Full name! in 'AssemblyName, version=1.0.0.0, culture=neutral, publickeytoken=abcdef123456' format
-  end;
-
-  TDotNetVersion = (dt11, dt20, dt40, dtHighestKnown);
-
-function GetDotNetRoot(RegView: TRegView): String;
-function GetDotNetVersionRoot(RegView: TRegView; Version: TDotNetVersion): String;
-
-implementation
-
-uses
-  InstFunc, PathFunc;
-
-var
-  DotNetRoot: array [TRegView] of String;
-  DotNetVersionRoot: array [TRegView, TDotNetVersion] of String;
-
-function GetDotNetRoot(RegView: TRegView): String;
-var
-  K: HKEY;
-begin
-  if DotNetRoot[RegView] = '' then begin
-    if RegOpenKeyExView(RegView, HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\.NETFramework', 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS then begin
-      RegQueryStringValue(K, 'InstallRoot', DotNetRoot[RegView]);
-      RegCloseKey(K);
-    end;
-    if DotNetRoot[RegView] = '' then
-      InternalError('.NET Framework not found');
-  end;
-  Result := DotNetRoot[RegView];
-end;
-
-function GetDotNetVersionRoot(RegView: TRegView; Version: TDotNetVersion): String;
-const
-  VersionStrings: array [TDotNetVersion] of String = ('1.1', '2.0', '4.0', '');
-var
-  K: HKEY;
-begin
-  if DotNetVersionRoot[RegView, Version] = '' then begin
-    GetDotNetRoot(RegView);
-    if (Version in [dt40, dtHighestKnown]) and (RegOpenKeyExView(RegView, HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\.NETFramework\Policy\v4.0', 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS) then begin
-      DotNetVersionRoot[RegView, Version] := AddBackslash(DotNetRoot[RegView]) + 'v4.0.30319';
-      RegCloseKey(K);
-    end else if (Version in [dt20, dtHighestKnown]) and (RegOpenKeyExView(RegView, HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\.NETFramework\Policy\v2.0', 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS) then begin
-      DotNetVersionRoot[RegView, Version] := AddBackslash(DotNetRoot[RegView]) + 'v2.0.50727';
-      RegCloseKey(K);
-    end else if (Version in [dt11, dtHighestKnown]) and (RegOpenKeyExView(RegView, HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\.NETFramework\Policy\v1.1', 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS) then begin
-      DotNetVersionRoot[RegView, Version] := AddBackslash(DotNetRoot[RegView]) + 'v1.1.4322';
-      RegCloseKey(K);
-    end;
-    if DotNetVersionRoot[RegView, Version] = '' then begin
-      if Version <> dtHighestKnown then
-        InternalError(Format('.NET Framework version %s not found', [VersionStrings[Version]]))
-      else
-        InternalError('.NET Framework not found');
-    end;
-  end;
-  Result := DotNetVersionRoot[RegView, Version];
-end;
-
-constructor TAssemblyCacheInfo.Create(RegView: TRegView);
-type
-  TCreateAssemblyCache = function (var ppAsmCache: IAssemblyCache; dwReserved: Integer): Integer; stdcall;
-var
-  FileName: string;
-  Proc: TCreateAssemblyCache;
-begin
-  inherited Create;
-  FileName := AddBackslash(GetDotNetVersionRoot(RegView, dtHighestKnown)) + 'Fusion.dll';
-  fDll := SafeLoadLibrary(PChar(FileName), SEM_NOOPENFILEERRORBOX);
-  if fDll = 0 then
-    InternalError(Format('Failed to load .NET Framework DLL "%s"', [FileName]));
-  Proc := GetProcAddress(fDll, 'CreateAssemblyCache');
-  if not Assigned(Proc) then
-    InternalError('Failed to get address of .NET Framework CreateAssemblyCache function');
-  Proc(fCache, 0);
-  if fCache = nil then
-    InternalError('.NET Framework CreateAssemblyCache function failed');
-end;
-
-destructor TAssemblyCacheInfo.Destroy;
-begin
-  if fCache <> nil then
-    fCache.Release;
-  fCache := nil;
-  FreeLibrary(fDll);
-  inherited Destroy;
-end;
-
-procedure TAssemblyCacheInfo.InstallAssembly(const FileName: string);
-const
-  IASSEMBLYCACHE_INSTALL_FLAG_FORCE_REFRESH = 2;
-var
-  lOleString: PWideChar;
-  OleResult: HRESULT;
-begin
-  lOleString := StringToOleStr(FileName);
-  try
-    OleResult := fCache.InstallAssembly(IASSEMBLYCACHE_INSTALL_FLAG_FORCE_REFRESH, lOleString, 0);
-    if Failed(OleResult) then
-      RaiseOleError('InstallAssembly', OleResult);
-  finally
-    SysFreeString(lOleString);
-  end;
-end;
-
-procedure TAssemblyCacheInfo.UninstallAssembly(
-  const StrongAssemblyName: string);
-var
-  lOleString: PWideChar;
-  OleResult: HRESULT;
-begin
-  lOleString := StringToOleStr(StrongAssemblyName);
-  try
-    OleResult := fCache.UninstallAssembly(0, lOleString, 0, Integer(nil^));
-    if Failed(OleResult) then
-      RaiseOleError('UninstallAssembly', OleResult);
-  finally
-    SysFreeString(lOleString);
-  end;
-end;
-
-end.

+ 66 - 46
Projects/Main.pas

@@ -105,7 +105,8 @@ var
   InitLoadInf, InitSaveInf: String;
   InitNoIcons, InitSilent, InitVerySilent, InitNoRestart, InitCloseApplications,
     InitNoCloseApplications, InitForceCloseApplications, InitNoForceCloseApplications,
-    InitRestartApplications, InitNoRestartApplications, InitNoCancel: Boolean;
+    InitLogCloseApplications, InitRestartApplications, InitNoRestartApplications,
+    InitNoCancel: Boolean;
   InitSetupType: String;
   InitComponents, InitTasks: TStringList;
   InitComponentsSpecified: Boolean;
@@ -156,6 +157,7 @@ var
   RmSessionStarted, RmFoundApplications, RmDoRestart: Boolean;
   RmSessionHandle: DWORD;
   RmSessionKey: array[0..CCH_RM_SESSION_KEY] of WideChar;
+  RmRegisteredFilesCount: Integer;
 
   { Other }
   ShowLanguageDialog, MatchedLangParameter: Boolean;
@@ -177,7 +179,7 @@ var
   DisableCodeConsts: Integer;
   SetupExitCode: Integer;
   CreatedIcon: Boolean;
-  RestartInitiatedByThisProcess: Boolean;
+  RestartInitiatedByThisProcess, DownloadTemporaryFileProcessMessages: Boolean;
 {$IFDEF IS_D12}
   TaskbarButtonHidden: Boolean;
 {$ENDIF}
@@ -226,7 +228,8 @@ function LoggedMsgBox(const Text, Caption: String; const Typ: TMsgBoxType;
   const Buttons: Cardinal; const Suppressible: Boolean; const Default: Integer): Integer;
 function LoggedTaskDialogMsgBox(const Icon, Instruction, Text, Caption: String;
   const Typ: TMsgBoxType; const Buttons: Cardinal; const ButtonLabels: array of String;
-  const ShieldButton: Integer; const Suppressible: Boolean; const Default: Integer): Integer;
+  const ShieldButton: Integer; const Suppressible: Boolean; const Default: Integer;
+  const VerificationText: String = ''; const pfVerificationFlagChecked: PBOOL = nil): Integer;
 procedure LogWindowsVersion;
 procedure NotifyAfterInstallEntry(const AfterInstall: String);
 procedure NotifyAfterInstallFileEntry(const FileEntry: PSetupFileEntry);
@@ -262,7 +265,7 @@ uses
   Compress, CompressZlib, bzlib, LZMADecomp, ArcFour, SetupEnt, SelLangForm,
   Wizard, DebugClient, VerInfo, Extract, FileClass, Logging, MD5, SHA1,
   {$IFNDEF Delphi3orHigher} OLE2, {$ELSE} ActiveX, {$ENDIF}
-  SimpleExpression, Helper, SpawnClient, SpawnServer, LibFusion, BitmapImage,
+  SimpleExpression, Helper, SpawnClient, SpawnServer, DotNet, BitmapImage,
   TaskDialog;
 
 {$R *.DFM}
@@ -675,6 +678,7 @@ begin
   InitNoCloseApplications := GetIniBool(Section, 'NoCloseApplications', InitNoCloseApplications, FileName);
   InitForceCloseApplications := GetIniBool(Section, 'ForceCloseApplications', InitForceCloseApplications, FileName);
   InitNoForceCloseApplications := GetIniBool(Section, 'NoForceCloseApplications', InitNoForceCloseApplications, FileName);
+  InitLogCloseApplications := GetIniBool(Section, 'LogCloseApplications', InitLogCloseApplications, FileName);
   InitRestartApplications := GetIniBool(Section, 'RestartApplications', InitRestartApplications, FileName);
   InitNoRestartApplications := GetIniBool(Section, 'NoRestartApplications', InitNoRestartApplications, FileName);
   InitNoCancel := GetIniBool(Section, 'NoCancel', InitNoCancel, FileName);
@@ -1017,10 +1021,10 @@ function ExpandIndividualConst(Cnst: String;
 const
   FolderConsts: array[Boolean, TShellFolderID] of String =
     (('userdesktop', 'userstartmenu', 'userprograms', 'userstartup',
-      'usersendto', 'fonts', 'userappdata', 'userdocs', 'usertemplates',
+      'usersendto', 'commonfonts', 'userappdata', 'userdocs', 'usertemplates',
       'userfavorites', 'localappdata'),
      ('commondesktop', 'commonstartmenu', 'commonprograms', 'commonstartup',
-      'usersendto', 'fonts', 'commonappdata', 'commondocs', 'commontemplates',
+      'usersendto', 'commonfonts', 'commonappdata', 'commondocs', 'commontemplates',
       'commonfavorites' { not accepted anymore by the compiler }, 'localappdata'));
   NoUninstallConsts: array[0..6] of String =
     ('src', 'srcexe', 'userinfoname', 'userinfoorg', 'userinfoserial', 'hwnd',
@@ -1112,6 +1116,7 @@ begin
       InternalError('Cannot expand "' + OriginalCnst + '" constant on this version of Windows');
   end
   else if Cnst = 'usersavedgames' then Result := SavedGamesUserDir
+  else if Cnst = 'userfonts' then Result := ExpandConst('{localappdata}\Microsoft\Windows\Fonts') { supported by Windows 10 Version 1803 and newer. doesn't have a KNOWNFOLDERID. }
   else if Cnst = 'dao' then Result := ExpandConst('{cf}\Microsoft Shared\DAO')
   else if Cnst = 'cmd' then Result := CmdFilename
   else if Cnst = 'computername' then Result := GetComputerNameString
@@ -1169,20 +1174,20 @@ begin
       Result := '0';
   end
   else if Cnst = 'log' then Result := GetLogFileName
-  else if Cnst = 'dotnet11' then Result := GetDotNetVersionRoot(rv32Bit, dt11)
-  else if Cnst = 'dotnet20' then Result := GetDotNetVersionRoot(InstallDefaultRegView, dt20)
-  else if Cnst = 'dotnet2032' then Result := GetDotNetVersionRoot(rv32Bit, dt20)
+  else if Cnst = 'dotnet11' then Result := GetDotNetVersionInstallRoot(rv32Bit, netbase11)
+  else if Cnst = 'dotnet20' then Result := GetDotNetVersionInstallRoot(InstallDefaultRegView, netbase20)
+  else if Cnst = 'dotnet2032' then Result := GetDotNetVersionInstallRoot(rv32Bit, netbase20)
   else if Cnst = 'dotnet2064' then begin
     if IsWin64 then
-      Result := GetDotNetVersionRoot(rv64Bit, dt20)
+      Result := GetDotNetVersionInstallRoot(rv64Bit, netbase20)
     else
       InternalError('Cannot expand "' + OriginalCnst + '" constant on this version of Windows');
   end
-  else if Cnst = 'dotnet40' then Result := GetDotNetVersionRoot(InstallDefaultRegView, dt40)
-  else if Cnst = 'dotnet4032' then Result := GetDotNetVersionRoot(rv32Bit, dt40)
+  else if Cnst = 'dotnet40' then Result := GetDotNetVersionInstallRoot(InstallDefaultRegView, netbase40)
+  else if Cnst = 'dotnet4032' then Result := GetDotNetVersionInstallRoot(rv32Bit, netbase40)
   else if Cnst = 'dotnet4064' then begin
     if IsWin64 then
-      Result := GetDotNetVersionRoot(rv64Bit, dt40)
+      Result := GetDotNetVersionInstallRoot(rv64Bit, netbase40)
     else
       InternalError('Cannot expand "' + OriginalCnst + '" constant on this version of Windows');
   end
@@ -1853,13 +1858,13 @@ begin
           case DeleteType of
             dfFiles, dfFilesAndOrSubdirs:
               if not DelTree(InstallDefaultDisableFsRedir, ExpandConst(Name), False, True, DeleteType = dfFilesAndOrSubdirs, True,
-                 DummyDeleteDirProc, EnumFilesProc, nil) then begin
+                 DummyDeleteDirProc, EnumFilesProc, Param) then begin
                 Result := False;
                 Exit;
               end;
             dfDirIfEmpty:
               if not DelTree(InstallDefaultDisableFsRedir, ExpandConst(Name), True, False, False, True,
-                 DummyDeleteDirProc, EnumFilesProc, nil) then begin
+                 DummyDeleteDirProc, EnumFilesProc, Param) then begin
                 Result := False;
                 Exit;
               end;
@@ -1921,8 +1926,8 @@ type
   PArrayOfPWideChar = ^TArrayOfPWideChar;
 
 var
-  RegisterFileFilenames: PArrayOfPWideChar;
-  RegisterFileFilenamesMax, RegisterFileFilenamesCount: Integer;
+  RegisterFileBatchFilenames: PArrayOfPWideChar;
+  RegisterFileFilenamesBatchMax, RegisterFileFilenamesBatchCount: Integer;
 
 function RegisterFile(const DisableFsRedir: Boolean; const AFilename: String;
   const Param: Pointer): Boolean;
@@ -1933,7 +1938,7 @@ var
 begin
   Filename := AFilename;
 
-  { First: check filter. }
+  { First: check filter and self. }
   if Filename <> '' then begin
     CheckFilter := Boolean(Param);
     if CheckFilter then begin
@@ -1946,20 +1951,26 @@ begin
         end;
       end;
       if not Match then begin
+        { No match with filter so exit but don't return an error. }
         Result := True;
         Exit;
       end;
     end;
+    if PathCompare(Filename, SetupLdrOriginalFilename) = 0 then begin
+      { Don't allow self to be registered but don't return an error. }
+      Result := True;
+      Exit;
+    end;
   end;
 
   { Secondly: check if we need to register this batch, either because the batch is full
     or because we're done scanning and have leftovers. }
-  if ((Filename <> '') and (RegisterFileFilenamesCount = RegisterFileFilenamesMax)) or
-     ((Filename = '') and (RegisterFileFilenamesCount > 0)) then begin
-    if RmRegisterResources(RmSessionHandle, RegisterFileFilenamesCount, RegisterFileFilenames, 0, nil, 0, nil) = ERROR_SUCCESS then begin
-      for I := 0 to RegisterFileFilenamesCount-1 do
-        FreeMem(RegisterFileFilenames[I]);
-      RegisterFileFilenamesCount := 0;
+  if ((Filename <> '') and (RegisterFileFilenamesBatchCount = RegisterFileFilenamesBatchMax)) or
+     ((Filename = '') and (RegisterFileFilenamesBatchCount > 0)) then begin
+    if RmRegisterResources(RmSessionHandle, RegisterFileFilenamesBatchCount, RegisterFileBatchFilenames, 0, nil, 0, nil) = ERROR_SUCCESS then begin
+      for I := 0 to RegisterFileFilenamesBatchCount-1 do
+        FreeMem(RegisterFileBatchFilenames[I]);
+      RegisterFileFilenamesBatchCount := 0;
     end else begin
       RmEndSession(RmSessionHandle);
       RmSessionStarted := False;
@@ -1976,14 +1987,19 @@ begin
     if DisableFsRedir then
       Filename := ReplaceSystemDirWithSysNative(Filename, IsWin64);
 
+    if InitLogCloseApplications then
+      LogFmt('Found a file to register with RestartManager: %s', [Filename]);
+
     Len := Length(Filename);
-    GetMem(RegisterFileFilenames[RegisterFileFilenamesCount], (Len + 1) * SizeOf(RegisterFileFilenames[RegisterFileFilenamesCount][0]));
+    GetMem(RegisterFileBatchFilenames[RegisterFileFilenamesBatchCount], (Len + 1) * SizeOf(RegisterFileBatchFilenames[RegisterFileFilenamesBatchCount][0]));
     {$IFNDEF UNICODE}
       RegisterFileFilenames[RegisterFileFilenamesCount][MultiByteToWideChar(CP_ACP, 0, PChar(Filename), Len, RegisterFileFilenames[RegisterFileFilenamesCount], Len)] := #0;
     {$ELSE}
-      StrPCopy(RegisterFileFilenames[RegisterFileFilenamesCount], Filename);
+      StrPCopy(RegisterFileBatchFilenames[RegisterFileFilenamesBatchCount], Filename);
     {$ENDIF}
-    Inc(RegisterFileFilenamesCount);
+    Inc(RegisterFileFilenamesBatchCount);
+
+    Inc(RmRegisteredFilesCount);
   end;
 
   Result := RmSessionStarted; { Break the enum if there was an error, else continue. }
@@ -2010,10 +2026,11 @@ var
 begin
   { Note: MSDN says we shouldn't call RmRegisterResources for each file because of speed, but calling
     it once for all files adds extra memory usage, so calling it in batches. }
-  RegisterFileFilenamesMax := 1000;
-  GetMem(RegisterFileFilenames, RegisterFileFilenamesMax * SizeOf(RegisterFileFilenames[0]));
+  RegisterFileFilenamesBatchMax := 1000;
+  GetMem(RegisterFileBatchFilenames, RegisterFileFilenamesBatchMax * SizeOf(RegisterFileBatchFilenames[0]));
   try
     { Register our files. }
+    RmRegisteredFilesCount := 0;
     EnumFiles(RegisterFile, WizardComponents, WizardTasks, Pointer(True));
     { Ask [Code] for more files. }
     if CodeRunner <> nil then begin
@@ -2033,9 +2050,9 @@ begin
     if RmSessionStarted then
       RegisterFile(False, '', nil);
   finally
-    for I := 0 to RegisterFileFilenamesCount-1 do
-      FreeMem(RegisterFileFilenames[I]);
-    FreeMem(RegisterFileFilenames);
+    for I := 0 to RegisterFileFilenamesBatchCount-1 do
+      FreeMem(RegisterFileBatchFilenames[I]);
+    FreeMem(RegisterFileBatchFilenames);
   end;
 end;
 
@@ -2414,7 +2431,8 @@ end;
 
 function LoggedTaskDialogMsgBox(const Icon, Instruction, Text, Caption: String;
   const Typ: TMsgBoxType; const Buttons: Cardinal; const ButtonLabels: array of String;
-  const ShieldButton: Integer; const Suppressible: Boolean; const Default: Integer): Integer;
+  const ShieldButton: Integer; const Suppressible: Boolean; const Default: Integer;
+  const VerificationText: String = ''; const pfVerificationFlagChecked: PBOOL = nil): Integer;
 begin
   if InitSuppressMsgBoxes and Suppressible then begin
     LogSuppressedMessageBox(PChar(Text), Buttons, Default);
@@ -2422,10 +2440,12 @@ begin
   end else begin
     LogMessageBox(PChar(Text), Buttons);
     Result := TaskDialogMsgBox(Icon, Instruction, Text,
-      Caption, Typ, Buttons, ButtonLabels, ShieldButton);
-    if Result <> 0 then
-      LogFmt('User chose %s.', [GetMessageBoxResultText(Result)])
-    else
+      Caption, Typ, Buttons, ButtonLabels, ShieldButton, VerificationText, pfVerificationFlagChecked);
+    if Result <> 0 then begin
+      LogFmt('User chose %s.', [GetMessageBoxResultText(Result)]);
+      if pfVerificationFlagChecked <> nil then
+        LogFmt('User chose %s for the verification.', [SYesNo[pfVerificationFlagChecked^]]);
+    end else
       Log('TaskDialogMsgBox failed.');
   end;
 end;
@@ -2978,6 +2998,9 @@ begin
     if CompareText(ParamName, '/NoForceCloseApplications') = 0 then
       InitNoForceCloseApplications := True
     else
+    if CompareText(ParamName, '/LogCloseApplications') = 0 then
+      InitLogCloseApplications := True
+    else
     if CompareText(ParamName, '/RestartApplications') = 0 then
       InitRestartApplications := True
     else
@@ -3814,9 +3837,9 @@ begin
     'Portions Copyright (C) 2000-2020 Martijn Laan' + SNewLine +
     'All rights reserved.' + SNewLine2 +
     'Inno Setup home page:' + SNewLine +
-    'http://www.innosetup.com/');
+    'https://www.innosetup.com/');
   S := S + SNewLine2 + 'RemObjects Pascal Script home page:' + SNewLine +
-    'http://www.remobjects.com/ps';
+    'https://www.remobjects.com/ps';
   if SetupMessages[msgAboutSetupNote] <> '' then
     S := S + SNewLine2 + SetupMessages[msgAboutSetupNote];
   if SetupMessages[msgTranslatorNote] <> '' then
@@ -3918,7 +3941,7 @@ begin
     ExpandedFilename := ExpandConst(RunEntry.Name);
     Log('Filename: ' + ExpandedFilename);
     ExpandedParameters := ExpandConst(RunEntry.Parameters);
-    if ExpandedParameters <> '' then
+    if not(roDontLogParameters in RunEntry.Options) and (ExpandedParameters <> '') then
       Log('Parameters: ' + ExpandedParameters);
 
     Wait := ewWaitUntilTerminated;
@@ -4259,13 +4282,10 @@ begin
               RestartSystem := WizardForm.YesRadio.Checked;
           imSilent:
             begin
-              if FromPreparingPage then begin
-                S := ExpandSetupMessage(msgPrepareToInstallNeedsRestart);
-                if S = '' then
-                  S := ExpandSetupMessage(msgFinishedRestartMessage);
+              if FromPreparingPage then
                 S := WizardForm.PrepareToInstallFailureMessage + SNewLine +
-                  SNewLine + SNewLine + S
-              end else
+                  SNewLine + SNewLine + ExpandSetupMessage(msgPrepareToInstallNeedsRestart)
+              else
                 S := ExpandSetupMessage(msgFinishedRestartMessage);
               RestartSystem :=
                 LoggedMsgBox(S, '', mbConfirmation, MB_YESNO, True, IDYES) = IDYES;

+ 21 - 3
Projects/MsgIDs.pas

@@ -2,7 +2,7 @@ unit MsgIDs;
 
 {
   Inno Setup
-  Copyright (C) 1997-2012 Jordan Russell
+  Copyright (C) 1997-2020 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -42,6 +42,7 @@ type
     msgButtonNo,
     msgButtonNoToAll,
     msgButtonOK,
+    msgButtonStopDownload,
     msgButtonWizardBrowse,
     msgButtonYes,
     msgButtonYesToAll,
@@ -72,18 +73,26 @@ type
     msgDiskSpaceWarning,
     msgDiskSpaceWarningTitle,
     msgDontCloseApplications,
+    msgDownloadingLabel,
     msgErrorChangingAttr,
     msgErrorCloseApplications,
     msgErrorCopying,
     msgErrorCreatingDir,
     msgErrorCreatingTemp,
+    msgErrorDownloadAborted,
+    msgErrorDownloadFailed,
+    msgErrorDownloadSizeFailed,
     msgErrorExecutingProgram,
+    msgErrorFileHash1,
+    msgErrorFileHash2,
+    msgErrorFileSize,
     msgErrorFunctionFailed,
     msgErrorFunctionFailedNoCode,
     msgErrorFunctionFailedWithMessage,
     msgErrorIniEntry,
     msgErrorInternal2,
     msgErrorOpeningReadme,
+    msgErrorProgress,
     msgErrorReadingExistingDest,
     msgErrorReadingSource,
     msgErrorRegCreateKey,
@@ -98,7 +107,11 @@ type
     msgErrorRestartReplace,
     msgErrorTitle,
     msgErrorTooManyFilesInDir,
-    msgExistingFileNewer,
+    msgExistingFileNewerSelectAction,
+    msgExistingFileNewer2,
+    msgExistingFileNewerOverwriteExisting,
+    msgExistingFileNewerKeepExisting,
+    msgExistingFileNewerOverwriteOrKeepAll,
     msgExistingFileReadOnly2,
     msgExistingFileReadOnlyRetry,
     msgExistingFileReadOnlyKeepExisting,
@@ -106,7 +119,11 @@ type
     msgExitSetupTitle,
     msgFileAbortRetryIgnoreSkipNotRecommended,
     msgFileAbortRetryIgnoreIgnoreNotRecommended,
-    msgFileExists,
+    msgFileExistsSelectAction,
+    msgFileExists2,
+    msgFileExistsOverwriteExisting,
+    msgFileExistsKeepExisting,
+    msgFileExistsOverwriteOrKeepAll,
     msgFileNotInDir2,
     msgFinishedHeadingLabel,
     msgFinishedLabel,
@@ -214,6 +231,7 @@ type
     msgStatusSavingUninstall,
     msgStatusRunProgram,
     msgStatusUninstalling,
+    msgStopDownload,
     msgTranslatorNote,
     msgUninstallAppFullTitle,
     msgUninstallAppTitle,

+ 18 - 0
Projects/ScriptClasses_C.pas

@@ -295,6 +295,7 @@ procedure RegisterSetupForm_C(Cl: TPSPascalCompiler);
 begin
   with Cl.AddClassN(Cl.FindClass('TUIStateForm'), 'TSetupForm') do
   begin
+    RegisterMethod('function CalculateButtonWidth(const ButtonCaptions: array of String): Integer;');
     RegisterMethod('function ShouldSizeX: Boolean;');
     RegisterMethod('function ShouldSizeY: Boolean;');
     RegisterMethod('procedure FlipSizeAndCenterIfNeeded(const ACenterInsideControl: Boolean; const CenterInsideControlCtl: TWinControl; const CenterInsideControlInsideClientArea: Boolean)');
@@ -536,6 +537,20 @@ begin
   end;
 end;
 
+{$IFNDEF PS_NOINT64}
+procedure RegisterDownloadWizardPage_C(Cl: TPSPascalCompiler);
+begin
+  with CL.AddClassN(Cl.FindClass('TOutputProgressWizardPage'),'TDownloadWizardPage') do
+  begin
+    RegisterProperty('AbortButton', 'TNewButton', iptr);
+    RegisterMethod('procedure Add(const Url, BaseName, RequiredSHA256OfFile: String)');
+    RegisterMethod('procedure Clear');
+    RegisterMethod('function Download: Int64');
+    RegisterMethod('procedure Show'); { Without this TOutputProgressWizardPage's Show will be called }
+  end;
+end;
+{$ENDIF}
+
 procedure RegisterHandCursor_C(Cl: TPSPascalCompiler);
 begin
   cl.AddConstantN('crHand', 'Integer').Value.ts32 := crHand;
@@ -649,6 +664,9 @@ begin
   RegisterOutputMsgWizardPage_C(Cl);
   RegisterOutputMsgMemoWizardPage_C(Cl);
   RegisterOutputProgressWizardPage_C(Cl);
+{$IFNDEF PS_NOINT64}
+  RegisterDownloadWizardPage_C(Cl);
+{$ENDIF}
 
   RegisterHandCursor_C(Cl);
   

Деякі файли не було показано, через те що забагато файлів було змінено