diff --git a/Installer/CodeDependencies.iss b/Installer/CodeDependencies.iss new file mode 100644 index 00000000..b499d45c --- /dev/null +++ b/Installer/CodeDependencies.iss @@ -0,0 +1,832 @@ +; -- CodeDependencies.iss -- +; +; This script shows how to download and install any dependency such as .NET, +; Visual C++ or SQL Server during your application's installation process. +; +; contribute: https://github.com/DomGries/InnoDependencyInstaller + + +; ----------- +; SHARED CODE +; ----------- +[Code] +// types and variables +type + TDependency_Entry = record + Filename: String; + Parameters: String; + Title: String; + URL: String; + Checksum: String; + ForceSuccess: Boolean; + RestartAfter: Boolean; + end; + +var + Dependency_Memo: String; + Dependency_List: array of TDependency_Entry; + Dependency_NeedRestart, Dependency_ForceX86: Boolean; + Dependency_DownloadPage: TDownloadWizardPage; + +procedure Dependency_Add(const Filename, Parameters, Title, URL, Checksum: String; const ForceSuccess, RestartAfter: Boolean); +var + Dependency: TDependency_Entry; + DependencyCount: Integer; +begin + Dependency_Memo := Dependency_Memo + #13#10 + '%1' + Title; + + Dependency.Filename := Filename; + Dependency.Parameters := Parameters; + Dependency.Title := Title; + + if FileExists(ExpandConstant('{tmp}{\}') + Filename) then begin + Dependency.URL := ''; + end else begin + Dependency.URL := URL; + end; + + Dependency.Checksum := Checksum; + Dependency.ForceSuccess := ForceSuccess; + Dependency.RestartAfter := RestartAfter; + + DependencyCount := GetArrayLength(Dependency_List); + SetArrayLength(Dependency_List, DependencyCount + 1); + Dependency_List[DependencyCount] := Dependency; +end; + +procedure Dependency_InitializeWizard; +begin + Dependency_DownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), nil); +end; + +function Dependency_PrepareToInstall(var NeedsRestart: Boolean): String; +var + DependencyCount, DependencyIndex, ResultCode: Integer; + Retry: Boolean; + TempValue: String; +begin + DependencyCount := GetArrayLength(Dependency_List); + + if DependencyCount > 0 then begin + Dependency_DownloadPage.Show; + + for DependencyIndex := 0 to DependencyCount - 1 do begin + if Dependency_List[DependencyIndex].URL <> '' then begin + Dependency_DownloadPage.Clear; + Dependency_DownloadPage.Add(Dependency_List[DependencyIndex].URL, Dependency_List[DependencyIndex].Filename, Dependency_List[DependencyIndex].Checksum); + + Retry := True; + while Retry do begin + Retry := False; + + try + Dependency_DownloadPage.Download; + except + if Dependency_DownloadPage.AbortedByUser then begin + Result := Dependency_List[DependencyIndex].Title; + DependencyIndex := DependencyCount; + end else begin + case SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbError, MB_ABORTRETRYIGNORE, IDIGNORE) of + IDABORT: begin + Result := Dependency_List[DependencyIndex].Title; + DependencyIndex := DependencyCount; + end; + IDRETRY: begin + Retry := True; + end; + end; + end; + end; + end; + end; + end; + + if Result = '' then begin + for DependencyIndex := 0 to DependencyCount - 1 do begin + Dependency_DownloadPage.SetText(Dependency_List[DependencyIndex].Title, ''); + Dependency_DownloadPage.SetProgress(DependencyIndex + 1, DependencyCount + 1); + + while True do begin + ResultCode := 0; + if ShellExec('', ExpandConstant('{tmp}{\}') + Dependency_List[DependencyIndex].Filename, Dependency_List[DependencyIndex].Parameters, '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then begin + if Dependency_List[DependencyIndex].RestartAfter then begin + if DependencyIndex = DependencyCount - 1 then begin + Dependency_NeedRestart := True; + end else begin + NeedsRestart := True; + Result := Dependency_List[DependencyIndex].Title; + end; + break; + end else if (ResultCode = 0) or Dependency_List[DependencyIndex].ForceSuccess then begin // ERROR_SUCCESS (0) + break; + end else if ResultCode = 1641 then begin // ERROR_SUCCESS_REBOOT_INITIATED (1641) + NeedsRestart := True; + Result := Dependency_List[DependencyIndex].Title; + break; + end else if ResultCode = 3010 then begin // ERROR_SUCCESS_REBOOT_REQUIRED (3010) + Dependency_NeedRestart := True; + break; + end; + end; + + case SuppressibleMsgBox(FmtMessage(SetupMessage(msgErrorFunctionFailed), [Dependency_List[DependencyIndex].Title, IntToStr(ResultCode)]), mbError, MB_ABORTRETRYIGNORE, IDIGNORE) of + IDABORT: begin + Result := Dependency_List[DependencyIndex].Title; + break; + end; + IDIGNORE: begin + break; + end; + end; + end; + + if Result <> '' then begin + break; + end; + end; + + if NeedsRestart then begin + TempValue := '"' + ExpandConstant('{srcexe}') + '" /restart=1 /LANG="' + ExpandConstant('{language}') + '" /DIR="' + WizardDirValue + '" /GROUP="' + WizardGroupValue + '" /TYPE="' + WizardSetupType(False) + '" /COMPONENTS="' + WizardSelectedComponents(False) + '" /TASKS="' + WizardSelectedTasks(False) + '"'; + if WizardNoIcons then begin + TempValue := TempValue + ' /NOICONS'; + end; + RegWriteStringValue(HKA, 'SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce', '{#SetupSetting("AppName")}', TempValue); + end; + end; + + Dependency_DownloadPage.Hide; + end; +end; + +function Dependency_UpdateReadyMemo(const Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String; +begin + Result := ''; + if MemoUserInfoInfo <> '' then begin + Result := Result + MemoUserInfoInfo + Newline + NewLine; + end; + if MemoDirInfo <> '' then begin + Result := Result + MemoDirInfo + Newline + NewLine; + end; + if MemoTypeInfo <> '' then begin + Result := Result + MemoTypeInfo + Newline + NewLine; + end; + if MemoComponentsInfo <> '' then begin + Result := Result + MemoComponentsInfo + Newline + NewLine; + end; + if MemoGroupInfo <> '' then begin + Result := Result + MemoGroupInfo + Newline + NewLine; + end; + if MemoTasksInfo <> '' then begin + Result := Result + MemoTasksInfo; + end; + + if Dependency_Memo <> '' then begin + if MemoTasksInfo = '' then begin + Result := Result + SetupMessage(msgReadyMemoTasks); + end; + Result := Result + FmtMessage(Dependency_Memo, [Space]); + end; +end; + +function Dependency_IsX64: Boolean; +begin + Result := not Dependency_ForceX86 and Is64BitInstallMode; +end; + +function Dependency_String(const x86, x64: String): String; +begin + if Dependency_IsX64 then begin + Result := x64; + end else begin + Result := x86; + end; +end; + +function Dependency_ArchSuffix: String; +begin + Result := Dependency_String('', '_x64'); +end; + +function Dependency_ArchTitle: String; +begin + Result := Dependency_String(' (x86)', ' (x64)'); +end; + +function Dependency_IsNetCoreInstalled(const Version: String): Boolean; +var + ResultCode: Integer; +begin + // source code: https://github.com/dotnet/deployment-tools/tree/master/src/clickonce/native/projects/NetCoreCheck + if not FileExists(ExpandConstant('{tmp}{\}') + 'netcorecheck' + Dependency_ArchSuffix + '.exe') then begin + ExtractTemporaryFile('netcorecheck' + Dependency_ArchSuffix + '.exe'); + end; + Result := ShellExec('', ExpandConstant('{tmp}{\}') + 'netcorecheck' + Dependency_ArchSuffix + '.exe', Version, '', SW_HIDE, ewWaitUntilTerminated, ResultCode) and (ResultCode = 0); +end; + +procedure Dependency_AddMsi45; +var + PackedVersion: Int64; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=8483 + if not GetPackedVersion(ExpandConstant('{sys}{\}msi.dll'), PackedVersion) or (ComparePackedVersion(PackedVersion, PackVersionComponents(4, 5, 0, 0)) < 0) then begin + Dependency_Add('msi45' + Dependency_ArchSuffix + '.msu', + '/quiet /norestart', + 'Windows Installer 4.5', + Dependency_String('https://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/Windows6.0-KB942288-v2-x86.msu', 'https://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/Windows6.0-KB942288-v2-x64.msu'), + '', False, False); + end; +end; + +procedure Dependency_AddDotNet11; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=26 + if not IsDotNetInstalled(net11, 0) then begin + Dependency_Add('dotnetfx11.exe', + '/q', + '.NET Framework 1.1', + 'https://download.microsoft.com/download/a/a/c/aac39226-8825-44ce-90e3-bf8203e74006/dotnetfx.exe', + '', False, False); + end; + + // https://www.microsoft.com/en-US/download/details.aspx?id=33 + if not IsDotNetInstalled(net11, 1) then begin + Dependency_Add('dotnetfx11sp1.exe', + '/q', + '.NET Framework 1.1 Service Pack 1', + 'https://download.microsoft.com/download/8/b/4/8b4addd8-e957-4dea-bdb8-c4e00af5b94b/NDP1.1sp1-KB867460-X86.exe', + '', False, False); + end; +end; + +procedure Dependency_AddDotNet20; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=1639 + if not IsDotNetInstalled(net20, 2) then begin + Dependency_Add('dotnetfx20' + Dependency_ArchSuffix + '.exe', + '/lang:enu /passive /norestart', + '.NET Framework 2.0 Service Pack 2', + Dependency_String('https://download.microsoft.com/download/c/6/e/c6e88215-0178-4c6c-b5f3-158ff77b1f38/NetFx20SP2_x86.exe', 'https://download.microsoft.com/download/c/6/e/c6e88215-0178-4c6c-b5f3-158ff77b1f38/NetFx20SP2_x64.exe'), + '', False, False); + end; +end; + +procedure Dependency_AddDotNet35; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=22 + if not IsDotNetInstalled(net35, 1) then begin + Dependency_Add('dotnetfx35.exe', + '/lang:enu /passive /norestart', + '.NET Framework 3.5 Service Pack 1', + 'https://download.microsoft.com/download/0/6/1/061f001c-8752-4600-a198-53214c69b51f/dotnetfx35setup.exe', + '', False, False); + end; +end; + +procedure Dependency_AddDotNet40Client; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=24872 + if not IsDotNetInstalled(net4client, 0) and not IsDotNetInstalled(net4full, 0) then begin + Dependency_Add('dotNetFx40_Client_setup.exe', + '/lcid ' + IntToStr(GetUILanguage) + ' /passive /norestart', + '.NET Framework 4.0 Client', + 'https://download.microsoft.com/download/7/B/6/7B629E05-399A-4A92-B5BC-484C74B5124B/dotNetFx40_Client_setup.exe', + '', False, False); + end; +end; + +procedure Dependency_AddDotNet40Full; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=17718 + if not IsDotNetInstalled(net4full, 0) then begin + Dependency_Add('dotNetFx40_Full_setup.exe', + '/lcid ' + IntToStr(GetUILanguage) + ' /passive /norestart', + '.NET Framework 4.0', + 'https://download.microsoft.com/download/1/B/E/1BE39E79-7E39-46A3-96FF-047F95396215/dotNetFx40_Full_setup.exe', + '', False, False); + end; +end; + +procedure Dependency_AddDotNet45; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=42643 + if not IsDotNetInstalled(net452, 0) then begin + Dependency_Add('dotnetfx45.exe', + '/lcid ' + IntToStr(GetUILanguage) + ' /passive /norestart', + '.NET Framework 4.5.2', + 'https://download.microsoft.com/download/B/4/1/B4119C11-0423-477B-80EE-7A474314B347/NDP452-KB2901954-Web.exe', + '', False, False); + end; +end; + +procedure Dependency_AddDotNet46; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=53345 + if not IsDotNetInstalled(net462, 0) then begin + Dependency_Add('dotnetfx46.exe', + '/lcid ' + IntToStr(GetUILanguage) + ' /passive /norestart', + '.NET Framework 4.6.2', + 'https://download.microsoft.com/download/D/5/C/D5C98AB0-35CC-45D9-9BA5-B18256BA2AE6/NDP462-KB3151802-Web.exe', + '', False, False); + end; +end; + +procedure Dependency_AddDotNet47; +begin + // https://support.microsoft.com/en-US/help/4054531 + if not IsDotNetInstalled(net472, 0) then begin + Dependency_Add('dotnetfx47.exe', + '/lcid ' + IntToStr(GetUILanguage) + ' /passive /norestart', + '.NET Framework 4.7.2', + 'https://download.microsoft.com/download/0/5/C/05C1EC0E-D5EE-463B-BFE3-9311376A6809/NDP472-KB4054531-Web.exe', + '', False, False); + end; +end; + +procedure Dependency_AddDotNet48; +begin + // https://dotnet.microsoft.com/download/dotnet-framework/net48 + if not IsDotNetInstalled(net48, 0) then begin + Dependency_Add('dotnetfx48.exe', + '/lcid ' + IntToStr(GetUILanguage) + ' /passive /norestart', + '.NET Framework 4.8', + 'https://download.visualstudio.microsoft.com/download/pr/7afca223-55d2-470a-8edc-6a1739ae3252/c9b8749dd99fc0d4453b2a3e4c37ba16/ndp48-web.exe', + '', False, False); + end; +end; + +procedure Dependency_AddNetCore31; +begin + // https://dotnet.microsoft.com/download/dotnet-core/3.1 + if not Dependency_IsNetCoreInstalled('Microsoft.NETCore.App 3.1.16') then begin + Dependency_Add('netcore31' + Dependency_ArchSuffix + '.exe', + '/lcid ' + IntToStr(GetUILanguage) + ' /passive /norestart', + '.NET Core Runtime 3.1.16' + Dependency_ArchTitle, + Dependency_String('https://go.microsoft.com/fwlink/?linkid=2166324', 'https://go.microsoft.com/fwlink/?linkid=2166228'), + '', False, False); + end; +end; + +procedure Dependency_AddNetCore31Asp; +begin + // https://dotnet.microsoft.com/download/dotnet-core/3.1 + if not Dependency_IsNetCoreInstalled('Microsoft.AspNetCore.App 3.1.16') then begin + Dependency_Add('netcore31asp' + Dependency_ArchSuffix + '.exe', + '/lcid ' + IntToStr(GetUILanguage) + ' /passive /norestart', + 'ASP.NET Core Runtime 3.1.16' + Dependency_ArchTitle, + Dependency_String('https://go.microsoft.com/fwlink/?linkid=2166322', 'https://go.microsoft.com/fwlink/?linkid=2166226'), + '', False, False); + end; +end; + +procedure Dependency_AddNetCore31Desktop; +begin + // https://dotnet.microsoft.com/download/dotnet-core/3.1 + if not Dependency_IsNetCoreInstalled('Microsoft.WindowsDesktop.App 3.1.16') then begin + Dependency_Add('netcore31desktop' + Dependency_ArchSuffix + '.exe', + '/lcid ' + IntToStr(GetUILanguage) + ' /passive /norestart', + '.NET Desktop Runtime 3.1.16' + Dependency_ArchTitle, + Dependency_String('https://go.microsoft.com/fwlink/?linkid=2166323', 'https://go.microsoft.com/fwlink/?linkid=2166227'), + '', False, False); + end; +end; + +procedure Dependency_AddDotNet50; +begin + // https://dotnet.microsoft.com/download/dotnet/5.0 + if not Dependency_IsNetCoreInstalled('Microsoft.NETCore.App 5.0.7') then begin + Dependency_Add('dotnet50' + Dependency_ArchSuffix + '.exe', + '/lcid ' + IntToStr(GetUILanguage) + ' /passive /norestart', + '.NET Runtime 5.0.7' + Dependency_ArchTitle, + Dependency_String('https://go.microsoft.com/fwlink/?linkid=2166321', 'https://go.microsoft.com/fwlink/?linkid=2166225'), + '', False, False); + end; +end; + +procedure Dependency_AddDotNet50Asp; +begin + // https://dotnet.microsoft.com/download/dotnet/5.0 + if not Dependency_IsNetCoreInstalled('Microsoft.AspNetCore.App 5.0.7') then begin + Dependency_Add('dotnet50asp' + Dependency_ArchSuffix + '.exe', + '/lcid ' + IntToStr(GetUILanguage) + ' /passive /norestart', + 'ASP.NET Core Runtime 5.0.7' + Dependency_ArchTitle, + Dependency_String('https://go.microsoft.com/fwlink/?linkid=2166319', 'https://go.microsoft.com/fwlink/?linkid=2166223'), + '', False, False); + end; +end; + +procedure Dependency_AddDotNet50Desktop; +begin + // https://dotnet.microsoft.com/download/dotnet/5.0 + if not Dependency_IsNetCoreInstalled('Microsoft.WindowsDesktop.App 5.0.7') then begin + Dependency_Add('dotnet50desktop' + Dependency_ArchSuffix + '.exe', + '/lcid ' + IntToStr(GetUILanguage) + ' /passive /norestart', + '.NET Desktop Runtime 5.0.7' + Dependency_ArchTitle, + Dependency_String('https://go.microsoft.com/fwlink/?linkid=2166320', 'https://go.microsoft.com/fwlink/?linkid=2166224'), + '', False, False); + end; +end; + +procedure Dependency_AddVC2005; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=26347 + if not IsMsiProductInstalled(Dependency_String('{86C9D5AA-F00C-4921-B3F2-C60AF92E2844}', '{A8D19029-8E5C-4E22-8011-48070F9E796E}'), PackVersionComponents(8, 0, 61000, 0)) then begin + Dependency_Add('vcredist2005' + Dependency_ArchSuffix + '.exe', + '/q', + 'Visual C++ 2005 Service Pack 1 Redistributable' + Dependency_ArchTitle, + Dependency_String('https://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x86.EXE', 'https://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x64.EXE'), + '', False, False); + end; +end; + +procedure Dependency_AddVC2008; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=26368 + if not IsMsiProductInstalled(Dependency_String('{DE2C306F-A067-38EF-B86C-03DE4B0312F9}', '{FDA45DDF-8E17-336F-A3ED-356B7B7C688A}'), PackVersionComponents(9, 0, 30729, 6161)) then begin + Dependency_Add('vcredist2008' + Dependency_ArchSuffix + '.exe', + '/q', + 'Visual C++ 2008 Service Pack 1 Redistributable' + Dependency_ArchTitle, + Dependency_String('https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x86.exe', 'https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x64.exe'), + '', False, False); + end; +end; + +procedure Dependency_AddVC2010; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=26999 + if not IsMsiProductInstalled(Dependency_String('{1F4F1D2A-D9DA-32CF-9909-48485DA06DD5}', '{5B75F761-BAC8-33BC-A381-464DDDD813A3}'), PackVersionComponents(10, 0, 40219, 0)) then begin + Dependency_Add('vcredist2010' + Dependency_ArchSuffix + '.exe', + '/passive /norestart', + 'Visual C++ 2010 Service Pack 1 Redistributable' + Dependency_ArchTitle, + Dependency_String('https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe', 'https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe'), + '', False, False); + end; +end; + +procedure Dependency_AddVC2012; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=30679 + if not IsMsiProductInstalled(Dependency_String('{4121ED58-4BD9-3E7B-A8B5-9F8BAAE045B7}', '{EFA6AFA1-738E-3E00-8101-FD03B86B29D1}'), PackVersionComponents(11, 0, 61030, 0)) then begin + Dependency_Add('vcredist2012' + Dependency_ArchSuffix + '.exe', + '/passive /norestart', + 'Visual C++ 2012 Update 4 Redistributable' + Dependency_ArchTitle, + Dependency_String('https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe', 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe'), + '', False, False); + end; +end; + +procedure Dependency_AddVC2013; +begin + // https://support.microsoft.com/en-US/help/4032938 + if not IsMsiProductInstalled(Dependency_String('{B59F5BF1-67C8-3802-8E59-2CE551A39FC5}', '{20400CF0-DE7C-327E-9AE4-F0F38D9085F8}'), PackVersionComponents(12, 0, 40664, 0)) then begin + Dependency_Add('vcredist2013' + Dependency_ArchSuffix + '.exe', + '/passive /norestart', + 'Visual C++ 2013 Update 5 Redistributable' + Dependency_ArchTitle, + Dependency_String('https://download.visualstudio.microsoft.com/download/pr/10912113/5da66ddebb0ad32ebd4b922fd82e8e25/vcredist_x86.exe', 'https://download.visualstudio.microsoft.com/download/pr/10912041/cee5d6bca2ddbcd039da727bf4acb48a/vcredist_x64.exe'), + '', False, False); + end; +end; + +procedure Dependency_AddVC2015To2019; +begin + // https://support.microsoft.com/en-US/help/2977003/the-latest-supported-visual-c-downloads + if not IsMsiProductInstalled(Dependency_String('{65E5BD06-6392-3027-8C26-853107D3CF1A}', '{36F68A90-239C-34DF-B58C-64B30153CE35}'), PackVersionComponents(14, 29, 30037, 0)) then begin + Dependency_Add('vcredist2019' + Dependency_ArchSuffix + '.exe', + '/passive /norestart', + 'Visual C++ 2015-2019 Redistributable' + Dependency_ArchTitle, + Dependency_String('https://aka.ms/vs/16/release/vc_redist.x86.exe', 'https://aka.ms/vs/16/release/vc_redist.x64.exe'), + '', False, False); + end; +end; + +procedure Dependency_AddDirectX; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=35 + Dependency_Add('dxwebsetup.exe', + '/q', + 'DirectX Runtime', + 'https://download.microsoft.com/download/1/7/1/1718CCC4-6315-4D8E-9543-8E28A4E18C4C/dxwebsetup.exe', + '', True, False); +end; + +procedure Dependency_AddSql2008Express; +var + Version: String; + PackedVersion: Int64; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=30438 + if not RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQLServer\CurrentVersion', 'CurrentVersion', Version) or not StrToVersion(Version, PackedVersion) or (ComparePackedVersion(PackedVersion, PackVersionComponents(10, 50, 4000, 0)) < 0) then begin + Dependency_Add('sql2008express' + Dependency_ArchSuffix + '.exe', + '/QS /IACCEPTSQLSERVERLICENSETERMS /ACTION=INSTALL /FEATURES=SQL /INSTANCENAME=MSSQLSERVER', + 'SQL Server 2008 R2 Service Pack 2 Express', + Dependency_String('https://download.microsoft.com/download/0/4/B/04BE03CD-EAF3-4797-9D8D-2E08E316C998/SQLEXPR32_x86_ENU.exe', 'https://download.microsoft.com/download/0/4/B/04BE03CD-EAF3-4797-9D8D-2E08E316C998/SQLEXPR_x64_ENU.exe'), + '', False, False); + end; +end; + +procedure Dependency_AddSql2012Express; +var + Version: String; + PackedVersion: Int64; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=56042 + if not RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQLServer\CurrentVersion', 'CurrentVersion', Version) or not StrToVersion(Version, PackedVersion) or (ComparePackedVersion(PackedVersion, PackVersionComponents(11, 0, 7001, 0)) < 0) then begin + Dependency_Add('sql2012express' + Dependency_ArchSuffix + '.exe', + '/QS /IACCEPTSQLSERVERLICENSETERMS /ACTION=INSTALL /FEATURES=SQL /INSTANCENAME=MSSQLSERVER', + 'SQL Server 2012 Service Pack 4 Express', + Dependency_String('https://download.microsoft.com/download/B/D/E/BDE8FAD6-33E5-44F6-B714-348F73E602B6/SQLEXPR32_x86_ENU.exe', 'https://download.microsoft.com/download/B/D/E/BDE8FAD6-33E5-44F6-B714-348F73E602B6/SQLEXPR_x64_ENU.exe'), + '', False, False); + end; +end; + +procedure Dependency_AddSql2014Express; +var + Version: String; + PackedVersion: Int64; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=57473 + if not RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQLServer\CurrentVersion', 'CurrentVersion', Version) or not StrToVersion(Version, PackedVersion) or (ComparePackedVersion(PackedVersion, PackVersionComponents(12, 0, 6024, 0)) < 0) then begin + Dependency_Add('sql2014express' + Dependency_ArchSuffix + '.exe', + '/QS /IACCEPTSQLSERVERLICENSETERMS /ACTION=INSTALL /FEATURES=SQL /INSTANCENAME=MSSQLSERVER', + 'SQL Server 2014 Service Pack 3 Express', + Dependency_String('https://download.microsoft.com/download/3/9/F/39F968FA-DEBB-4960-8F9E-0E7BB3035959/SQLEXPR32_x86_ENU.exe', 'https://download.microsoft.com/download/3/9/F/39F968FA-DEBB-4960-8F9E-0E7BB3035959/SQLEXPR_x64_ENU.exe'), + '', False, False); + end; +end; + +procedure Dependency_AddSql2016Express; +var + Version: String; + PackedVersion: Int64; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=56840 + if not RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQLServer\CurrentVersion', 'CurrentVersion', Version) or not StrToVersion(Version, PackedVersion) or (ComparePackedVersion(PackedVersion, PackVersionComponents(13, 0, 5026, 0)) < 0) then begin + Dependency_Add('sql2016express' + Dependency_ArchSuffix + '.exe', + '/QS /IACCEPTSQLSERVERLICENSETERMS /ACTION=INSTALL /FEATURES=SQL /INSTANCENAME=MSSQLSERVER', + 'SQL Server 2016 Service Pack 2 Express', + 'https://download.microsoft.com/download/3/7/6/3767D272-76A1-4F31-8849-260BD37924E4/SQLServer2016-SSEI-Expr.exe', + '', False, False); + end; +end; + +procedure Dependency_AddSql2017Express; +var + Version: String; + PackedVersion: Int64; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=55994 + if not RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQLServer\CurrentVersion', 'CurrentVersion', Version) or not StrToVersion(Version, PackedVersion) or (ComparePackedVersion(PackedVersion, PackVersionComponents(14, 0, 0, 0)) < 0) then begin + Dependency_Add('sql2017express' + Dependency_ArchSuffix + '.exe', + '/QS /IACCEPTSQLSERVERLICENSETERMS /ACTION=INSTALL /FEATURES=SQL /INSTANCENAME=MSSQLSERVER', + 'SQL Server 2017 Express', + 'https://download.microsoft.com/download/5/E/9/5E9B18CC-8FD5-467E-B5BF-BADE39C51F73/SQLServer2017-SSEI-Expr.exe', + '', False, False); + end; +end; + +procedure Dependency_AddSql2019Express; +var + Version: String; + PackedVersion: Int64; +begin + // https://www.microsoft.com/en-US/download/details.aspx?id=101064 + if not RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQLServer\CurrentVersion', 'CurrentVersion', Version) or not StrToVersion(Version, PackedVersion) or (ComparePackedVersion(PackedVersion, PackVersionComponents(15, 0, 0, 0)) < 0) then begin + Dependency_Add('sql2019express' + Dependency_ArchSuffix + '.exe', + '/QS /IACCEPTSQLSERVERLICENSETERMS /ACTION=INSTALL /FEATURES=SQL /INSTANCENAME=MSSQLSERVER', + 'SQL Server 2019 Express', + 'https://download.microsoft.com/download/7/f/8/7f8a9c43-8c8a-4f7c-9f92-83c18d96b681/SQL2019-SSEI-Expr.exe', + '', False, False); + end; +end; + + +[Setup] +; ------------- +; EXAMPLE SETUP +; ------------- +#ifndef Dependency_NoExampleSetup + +; comment out dependency defines to disable installing them +#define UseMsi45 + +;#define UseDotNet11 +#define UseDotNet20 +#define UseDotNet35 +#define UseDotNet40Client +#define UseDotNet40Full +#define UseDotNet45 +#define UseDotNet46 +#define UseDotNet47 +#define UseDotNet48 + +; requires netcorecheck.exe and netcorecheck_x64.exe (see download link below) +#define UseNetCoreCheck +#ifdef UseNetCoreCheck + #define UseNetCore31 + #define UseNetCore31Asp + #define UseNetCore31Desktop + #define UseDotNet50 + #define UseDotNet50Asp + #define UseDotNet50Desktop +#endif + +#define UseVC2005 +#define UseVC2008 +#define UseVC2010 +#define UseVC2012 +#define UseVC2013 +#define UseVC2015To2019 + +; requires dxwebsetup.exe (see download link below) +;#define UseDirectX + +#define UseSql2008Express +#define UseSql2012Express +#define UseSql2014Express +#define UseSql2016Express +#define UseSql2017Express +#define UseSql2019Express + +#define MyAppSetupName 'MyProgram' +#define MyAppVersion '1.0' +#define MyAppPublisher 'Inno Setup' +#define MyAppCopyright 'Copyright © Inno Setup' +#define MyAppURL 'https://jrsoftware.org/isinfo.php' + +AppName={#MyAppSetupName} +AppVersion={#MyAppVersion} +AppVerName={#MyAppSetupName} {#MyAppVersion} +AppCopyright={#MyAppCopyright} +VersionInfoVersion={#MyAppVersion} +VersionInfoCompany={#MyAppPublisher} +AppPublisher={#MyAppPublisher} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +OutputBaseFilename={#MyAppSetupName}-{#MyAppVersion} +DefaultGroupName={#MyAppSetupName} +DefaultDirName={autopf}\{#MyAppSetupName} +UninstallDisplayIcon={app}\MyProgram.exe +SourceDir=src +OutputDir={#SourcePath}\bin +AllowNoIcons=yes + +MinVersion=6.0 +PrivilegesRequired=admin + +// remove next line if you only deploy 32-bit binaries and dependencies +ArchitecturesInstallIn64BitMode=x64 + +[Languages] +Name: en; MessagesFile: "compiler:Default.isl" +Name: nl; MessagesFile: "compiler:Languages\Dutch.isl" +Name: de; MessagesFile: "compiler:Languages\German.isl" + +[Files] +#ifdef UseNetCoreCheck +// download netcorecheck.exe: https://go.microsoft.com/fwlink/?linkid=2135256 +// download netcorecheck_x64.exe: https://go.microsoft.com/fwlink/?linkid=2135504 +Source: "netcorecheck.exe"; Flags: dontcopy noencryption +Source: "netcorecheck_x64.exe"; Flags: dontcopy noencryption +#endif + +#ifdef UseDirectX +Source: "dxwebsetup.exe"; Flags: dontcopy noencryption +#endif + +Source: "MyProg-x64.exe"; DestDir: "{app}"; DestName: "MyProg.exe"; Check: Dependency_IsX64; Flags: ignoreversion +Source: "MyProg.exe"; DestDir: "{app}"; Check: not Dependency_IsX64; Flags: ignoreversion + +[Icons] +Name: "{group}\{#MyAppSetupName}"; Filename: "{app}\MyProg.exe" +Name: "{group}\{cm:UninstallProgram,{#MyAppSetupName}}"; Filename: "{uninstallexe}" +Name: "{commondesktop}\{#MyAppSetupName}"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}" + +[Run] +Filename: "{app}\MyProg.exe"; Description: "{cm:LaunchProgram,{#MyAppSetupName}}"; Flags: nowait postinstall skipifsilent + +[Code] +procedure InitializeWizard; +begin + Dependency_InitializeWizard; +end; + +function PrepareToInstall(var NeedsRestart: Boolean): String; +begin + Result := Dependency_PrepareToInstall(NeedsRestart); +end; + +function NeedRestart: Boolean; +begin + Result := Dependency_NeedRestart; +end; + +function UpdateReadyMemo(const Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String; +begin + Result := Dependency_UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo); +end; + +function InitializeSetup: Boolean; +begin +#ifdef UseMsi45 + Dependency_AddMsi45; +#endif + +#ifdef UseDotNet11 + Dependency_AddDotNet11; +#endif +#ifdef UseDotNet20 + Dependency_AddDotNet20; +#endif +#ifdef UseDotNet35 + Dependency_AddDotNet35; +#endif +#ifdef UseDotNet40Client + Dependency_AddDotNet40Client; +#endif +#ifdef UseDotNet40Full + Dependency_AddDotNet40Full; +#endif +#ifdef UseDotNet45 + Dependency_AddDotNet45; +#endif +#ifdef UseDotNet46 + Dependency_AddDotNet46; +#endif +#ifdef UseDotNet47 + Dependency_AddDotNet47; +#endif +#ifdef UseDotNet48 + Dependency_AddDotNet48; +#endif + +#ifdef UseNetCore31 + Dependency_AddNetCore31; +#endif +#ifdef UseNetCore31Asp + Dependency_AddNetCore31Asp; +#endif +#ifdef UseNetCore31Desktop + Dependency_AddNetCore31Desktop; +#endif +#ifdef UseDotNet50 + Dependency_AddDotNet50; +#endif +#ifdef UseDotNet50Asp + Dependency_AddDotNet50Asp; +#endif +#ifdef UseDotNet50Desktop + Dependency_AddDotNet50Desktop; +#endif + +#ifdef UseVC2005 + Dependency_AddVC2005; +#endif +#ifdef UseVC2008 + Dependency_AddVC2008; +#endif +#ifdef UseVC2010 + Dependency_AddVC2010; +#endif +#ifdef UseVC2012 + Dependency_AddVC2012; +#endif +#ifdef UseVC2013 + //Dependency_ForceX86 := True; // force 32-bit install of next dependencies + Dependency_AddVC2013; + //Dependency_ForceX86 := False; // disable forced 32-bit install again +#endif +#ifdef UseVC2015To2019 + Dependency_AddVC2015To2019; +#endif + +#ifdef UseDirectX + ExtractTemporaryFile('dxwebsetup.exe'); + Dependency_AddDirectX; +#endif + +#ifdef UseSql2008Express + Dependency_AddSql2008Express; +#endif +#ifdef UseSql2012Express + Dependency_AddSql2012Express; +#endif +#ifdef UseSql2014Express + Dependency_AddSql2014Express; +#endif +#ifdef UseSql2016Express + Dependency_AddSql2016Express; +#endif +#ifdef UseSql2017Express + Dependency_AddSql2017Express; +#endif +#ifdef UseSql2019Express + Dependency_AddSql2019Express; +#endif + + Result := True; +end; + +#endif diff --git a/Installer/OnlyMSetup.iss b/Installer/OnlyMSetup.iss index 08be7e8a..9d3d82f5 100644 --- a/Installer/OnlyMSetup.iss +++ b/Installer/OnlyMSetup.iss @@ -1,6 +1,9 @@ ; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! +#define Dependency_NoExampleSetup +#include "CodeDependencies.iss" + #define MyAppName "OnlyM" #define MyAppPublisher "Antony Corbett" #define MyAppURL "https://soundboxsoftware.com" @@ -21,7 +24,7 @@ AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} -DefaultDirName={pf}\OnlyM +DefaultDirName={commonpf}\OnlyM DefaultGroupName={#MyAppName} OutputDir="..\Installer\Output" OutputBaseFilename=OnlyMSetup @@ -35,6 +38,9 @@ RestartApplications=False CloseApplications=False AppMutex=OnlyMMeetingMedia,OnlyMSlideManagerTool +PrivilegesRequired=admin + + [InstallDelete] ; remove legacy shortcuts (wrongly named SlideManagerAppExeName instead of SlideManagerAppName) Type: files; Name: "{group}\{#SlideManagerAppExeName}.lnk" @@ -73,6 +79,9 @@ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{ [Files] Source: "..\OnlyM\bin\Release\net5.0-windows\publish\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs +// https://go.microsoft.com/fwlink/?linkid=2135256 +Source: "netcorecheck.exe"; Flags: dontcopy noencryption + ; web shortcuts... Source: "..\UrlLinkFiles\JW Broadcasting.url"; DestDir: "{commonappdata}\OnlyM\Websites" Source: "..\UrlLinkFiles\JW.org website.url"; DestDir: "{commonappdata}\OnlyM\Websites" @@ -87,3 +96,34 @@ Name: "{commondesktop}\{#SlideManagerAppName}"; Filename: "{app}\{#SlideManagerA [ThirdParty] UseRelativePaths=True +[Code] +procedure InitializeWizard; +begin + Dependency_InitializeWizard; +end; + +function PrepareToInstall(var NeedsRestart: Boolean): String; +begin + Result := Dependency_PrepareToInstall(NeedsRestart); +end; + +function NeedRestart: Boolean; +begin + Result := Dependency_NeedRestart; +end; + +function UpdateReadyMemo(const Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String; +begin + Result := Dependency_UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo); +end; + +function InitializeSetup: Boolean; +begin + // add dependencies (.NET 5 x86 desktop runtime) + Dependency_ForceX86 := true; + Dependency_AddDotNet50Desktop; + + Result := True; +end; + + diff --git a/Installer/Test.runtimeconfig.json b/Installer/Test.runtimeconfig.json new file mode 100644 index 00000000..8159d844 --- /dev/null +++ b/Installer/Test.runtimeconfig.json @@ -0,0 +1 @@ +{ "runtimeOptions": { "framework": { "name": "Microsoft.WindowsDesktop.App", "version": "5.0.7" } } } diff --git a/Installer/netcorecheck.exe b/Installer/netcorecheck.exe new file mode 100644 index 00000000..5f4e825e Binary files /dev/null and b/Installer/netcorecheck.exe differ diff --git a/OnlyM/Properties/PublishProfiles/FolderProfile1.pubxml b/OnlyM/Properties/PublishProfiles/FolderProfile1.pubxml new file mode 100644 index 00000000..d77c5451 --- /dev/null +++ b/OnlyM/Properties/PublishProfiles/FolderProfile1.pubxml @@ -0,0 +1,18 @@ + + + + + Release + x86 + bin\Release\net5.0-windows\publishSelfContained\ + FileSystem + net5.0-windows + win-x86 + true + False + True + False + + \ No newline at end of file diff --git a/SolutionInfo.cs b/SolutionInfo.cs index 06ade7f3..2fbb8f07 100644 --- a/SolutionInfo.cs +++ b/SolutionInfo.cs @@ -8,4 +8,4 @@ [assembly: AssemblyCulture("")] [assembly: NeutralResourcesLanguage("en-GB")] -[assembly: AssemblyVersion("2.0.0.9")] +[assembly: AssemblyVersion("2.0.0.10")]