mirror of
https://github.com/ckaczor/SmartHDD.git
synced 2026-02-16 10:58:35 -05:00
Add installer
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
|||||||
.vs
|
.vs
|
||||||
SmartHDD/bin
|
SmartHDD/bin
|
||||||
SmartHDD/obj
|
SmartHDD/obj
|
||||||
|
Installer/bin
|
||||||
210
Installer/innodependencyinstaller LICENSE.md
Normal file
210
Installer/innodependencyinstaller LICENSE.md
Normal file
@@ -0,0 +1,210 @@
|
|||||||
|
The Code Project Open License (CPOL) 1.02
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
This License governs Your use of the Work. This License is intended to allow
|
||||||
|
developers to use the Source Code and Executable Files provided as part of the
|
||||||
|
Work in any application in any form.
|
||||||
|
|
||||||
|
The main points subject to the terms of the License are:
|
||||||
|
|
||||||
|
* Source Code and Executable Files can be used in commercial applications;
|
||||||
|
* Source Code and Executable Files can be redistributed; and
|
||||||
|
* Source Code can be modified to create derivative works.
|
||||||
|
* No claim of suitability, guarantee, or any warranty whatsoever is provided.
|
||||||
|
The software is provided "as-is".
|
||||||
|
* The Article accompanying the Work may not be distributed or republished
|
||||||
|
without the Author's consent
|
||||||
|
|
||||||
|
This License is entered between You, the individual or other entity reading or
|
||||||
|
otherwise making use of the Work licensed pursuant to this License and the
|
||||||
|
individual or other entity which offers the Work under the terms of this License
|
||||||
|
("Author").
|
||||||
|
|
||||||
|
License
|
||||||
|
|
||||||
|
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CODE PROJECT
|
||||||
|
OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER
|
||||||
|
APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE
|
||||||
|
OR COPYRIGHT LAW IS PROHIBITED.
|
||||||
|
|
||||||
|
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE TO
|
||||||
|
BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS CONTAINED
|
||||||
|
HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. IF YOU
|
||||||
|
DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS LICENSE, YOU CANNOT
|
||||||
|
MAKE ANY USE OF THE WORK.
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
1. "Articles" means, collectively, all articles written by Author which
|
||||||
|
describes how the Source Code and Executable Files for the Work may
|
||||||
|
be used by a user.
|
||||||
|
2. "Author" means the individual or entity that offers the Work under
|
||||||
|
the terms of this License.
|
||||||
|
3. "Derivative Work" means a work based upon the Work or upon the Work
|
||||||
|
and other pre-existing works.
|
||||||
|
4. "Executable Files" refer to the executables, binary files, configu-
|
||||||
|
ration and any required data files included in the Work.
|
||||||
|
5. "Publisher" means the provider of the website, magazine, CD-ROM,
|
||||||
|
DVD or other medium from or by which the Work is obtained by You.
|
||||||
|
6. "Source Code" refers to the collection of source code and configu-
|
||||||
|
ration files used to create the Executable Files.
|
||||||
|
7. "Standard Version" refers to such a Work if it has not been modified,
|
||||||
|
or has been modified in accordance with the consent of the Author,
|
||||||
|
such consent being in the full discretion of the Author.
|
||||||
|
8. "Work" refers to the collection of files distributed by the Publisher,
|
||||||
|
including the Source Code, Executable Files, binaries, data files,
|
||||||
|
documentation, whitepapers and the Articles.
|
||||||
|
9. "You" is you, an individual or entity wishing to use the Work and
|
||||||
|
exercise your rights under this License.
|
||||||
|
|
||||||
|
2. Fair Use/Fair Use Rights. Nothing in this License is intended to reduce,
|
||||||
|
limit, or restrict any rights arising from fair use, fair dealing, first
|
||||||
|
sale or other limitations on the exclusive rights of the copyright owner
|
||||||
|
under copyright law or other applicable laws.
|
||||||
|
|
||||||
|
3. License Grant. Subject to the terms and conditions of this License, the
|
||||||
|
Author hereby grants You a worldwide, royalty-free, non-exclusive, perpe-
|
||||||
|
tual (for the duration of the applicable copyright) license to exercise
|
||||||
|
the rights in the Work as stated below:
|
||||||
|
1. You may use the standard version of the Source Code or Executable
|
||||||
|
Files in Your own applications.
|
||||||
|
2. You may apply bug fixes, portability fixes and other modifications
|
||||||
|
obtained from the Public Domain or from the Author. A Work modified
|
||||||
|
in such a way shall still be considered the standard version and
|
||||||
|
will be subject to this License.
|
||||||
|
3. You may otherwise modify Your copy of this Work (excluding the
|
||||||
|
Articles) in any way to create a Derivative Work, provided that
|
||||||
|
You insert a prominent notice in each changed file stating how,
|
||||||
|
when and where You changed that file.
|
||||||
|
4. You may distribute the standard version of the Executable Files
|
||||||
|
and Source Code or Derivative Work in aggregate with other (pos-
|
||||||
|
sibly commercial) programs as part of a larger (possibly commercial)
|
||||||
|
software distribution.
|
||||||
|
5. The Articles discussing the Work published in any form by the
|
||||||
|
author may not be distributed or republished without the Author's
|
||||||
|
consent. The author retains copyright to any such Articles. You may
|
||||||
|
use the Executable Files and Source Code pursuant to this License
|
||||||
|
but you may not repost or republish or otherwise distribute or make
|
||||||
|
available the Articles, without the prior written consent of the
|
||||||
|
Author.
|
||||||
|
Any subroutines or modules supplied by You and linked into the Source
|
||||||
|
Code or Executable Files this Work shall not be considered part of this
|
||||||
|
Work and will not be subject to the terms of this License.
|
||||||
|
|
||||||
|
4. Patent License. Subject to the terms and conditions of this License,
|
||||||
|
each Author hereby grants to You a perpetual, worldwide, non-exclusive,
|
||||||
|
no-charge, royalty-free, irrevocable (except as stated in this section)
|
||||||
|
patent license to make, have made, use, import, and otherwise transfer
|
||||||
|
the Work.
|
||||||
|
|
||||||
|
5. Restrictions. The license granted in Section 3 above is expressly made
|
||||||
|
subject to and limited by the following restrictions:
|
||||||
|
1. You agree not to remove any of the original copyright, patent,
|
||||||
|
trademark, and attribution notices and associated disclaimers that
|
||||||
|
may appear in the Source Code or Executable Files.
|
||||||
|
2. You agree not to advertise or in any way imply that this Work is a
|
||||||
|
product of Your own.
|
||||||
|
3. The name of the Author may not be used to endorse or promote pro-
|
||||||
|
ducts derived from the Work without the prior written consent of
|
||||||
|
the Author.
|
||||||
|
4. You agree not to sell, lease, or rent any part of the Work. This
|
||||||
|
does not restrict you from including the Work or any part of the
|
||||||
|
Work inside a larger software distribution that itself is being
|
||||||
|
sold. The Work by itself, though, cannot be sold, leased or rented.
|
||||||
|
5. You may distribute the Executable Files and Source Code only under
|
||||||
|
the terms of this License, and You must include a copy of, or the
|
||||||
|
Uniform Resource Identifier for, this License with every copy of
|
||||||
|
the Executable Files or Source Code You distribute and ensure that
|
||||||
|
anyone receiving such Executable Files and Source Code agrees that
|
||||||
|
the terms of this License apply to such Executable Files and/or
|
||||||
|
Source Code. You may not offer or impose any terms on the Work that
|
||||||
|
alter or restrict the terms of this License or the recipients'
|
||||||
|
exercise of the rights granted hereunder. You may not sublicense
|
||||||
|
the Work. You must keep intact all notices that refer to this
|
||||||
|
License and to the disclaimer of warranties. You may not distribute
|
||||||
|
the Executable Files or Source Code with any technological measures
|
||||||
|
that control access or use of the Work in a manner inconsistent with
|
||||||
|
the terms of this License.
|
||||||
|
6. You agree not to use the Work for illegal, immoral or improper
|
||||||
|
purposes, or on pages containing illegal, immoral or improper
|
||||||
|
material. The Work is subject to applicable export laws. You agree
|
||||||
|
to comply with all such laws and regulations that may apply to the
|
||||||
|
Work after Your receipt of the Work.
|
||||||
|
|
||||||
|
6. Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS
|
||||||
|
IS", "WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED
|
||||||
|
WARRANTIES OR CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK
|
||||||
|
IN ITS USE, INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUIT-
|
||||||
|
ABILITY, ETC. AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATU-
|
||||||
|
TORY WARRANTIES OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES
|
||||||
|
OR CONDITIONS OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT
|
||||||
|
THE WORK (OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF
|
||||||
|
VIRUSES. YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE
|
||||||
|
WORK OR DERIVATIVE WORKS.
|
||||||
|
|
||||||
|
7. Indemnity. You agree to defend, indemnify and hold harmless the Author
|
||||||
|
and the Publisher from and against any claims, suits, losses, damages,
|
||||||
|
liabilities, costs, and expenses (including reasonable legal or attorneys'
|
||||||
|
fees) resulting from or relating to any use of the Work by You.
|
||||||
|
|
||||||
|
8. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE
|
||||||
|
LAW, IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON
|
||||||
|
ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR
|
||||||
|
EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR
|
||||||
|
OTHERWISE, EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
9. Termination.
|
||||||
|
1. This License and the rights granted hereunder will terminate auto-
|
||||||
|
matically upon any breach by You of any term of this License. Indi-
|
||||||
|
viduals or entities who have received Derivative Works from You
|
||||||
|
under this License, however, will not have their licenses terminated
|
||||||
|
provided such individuals or entities remain in full compliance
|
||||||
|
with those licenses. Sections 1, 2, 6, 7, 8, 9, 10 and 11 will
|
||||||
|
survive any termination of this License.
|
||||||
|
2. If You bring a copyright, trademark, patent or any other infringe-
|
||||||
|
ment claim against any contributor over infringements You claim are
|
||||||
|
made by the Work, your License from such contributor to the Work
|
||||||
|
ends automatically.
|
||||||
|
3. Subject to the above terms and conditions, this License is perpe-
|
||||||
|
tual (for the duration of the applicable copyright in the Work).
|
||||||
|
Notwithstanding the above, the Author reserves the right to release
|
||||||
|
the Work under different license terms or to stop distributing the
|
||||||
|
Work at any time; provided, however that any such election will not
|
||||||
|
serve to withdraw this License (or any other license that has been,
|
||||||
|
or is required to be, granted under the terms of this License), and
|
||||||
|
this License will continue in full force and effect unless termi-
|
||||||
|
nated as stated above.
|
||||||
|
|
||||||
|
10. Publisher. The parties hereby confirm that the Publisher shall not,
|
||||||
|
under any circumstances, be responsible for and shall not have any lia-
|
||||||
|
bility in respect of the subject matter of this License. The Publisher
|
||||||
|
makes no warranty whatsoever in connection with the Work and shall not
|
||||||
|
be liable to You or any party on any legal theory for any damages what-
|
||||||
|
soever, including without limitation any general, special, incidental or
|
||||||
|
consequential damages arising in connection to this license. The Pub-
|
||||||
|
lisher reserves the right to cease making the Work available to You at
|
||||||
|
any time without notice
|
||||||
|
|
||||||
|
11. Miscellaneous
|
||||||
|
1. This License shall be governed by the laws of the location of the
|
||||||
|
head office of the Author or if the Author is an individual, the
|
||||||
|
laws of location of the principal place of residence of the Author.
|
||||||
|
2. If any provision of this License is invalid or unenforceable under
|
||||||
|
applicable law, it shall not affect the validity or enforceability
|
||||||
|
of the remainder of the terms of this License, and without further
|
||||||
|
action by the parties to this License, such provision shall be
|
||||||
|
reformed to the minimum extent necessary to make such provision
|
||||||
|
valid and enforceable.
|
||||||
|
3. No term or provision of this License shall be deemed waived and no
|
||||||
|
breach consented to unless such waiver or consent shall be in
|
||||||
|
writing and signed by the party to be charged with such waiver or
|
||||||
|
consent.
|
||||||
|
4. This License constitutes the entire agreement between the parties
|
||||||
|
with respect to the Work licensed herein. There are no understan-
|
||||||
|
dings, agreements or representations with respect to the Work not
|
||||||
|
specified herein. The Author shall not be bound by any additional
|
||||||
|
provisions that may appear in any communication from You. This
|
||||||
|
License may not be modified without the mutual written agreement
|
||||||
|
of the Author and You.
|
||||||
3
Installer/innodependencyinstaller README.md
Normal file
3
Installer/innodependencyinstaller README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
This installer uses 3rd party components from https://github.com/stfx/innodependencyinstaller to automatically download and install .NET frameworks.
|
||||||
|
|
||||||
|
See **'innodependencyinstaller LICENSE.md'** for the license of innodependencyinstaller.
|
||||||
313
Installer/scripts/code.pas
Normal file
313
Installer/scripts/code.pas
Normal file
@@ -0,0 +1,313 @@
|
|||||||
|
{
|
||||||
|
--- TYPES AND VARIABLES ---
|
||||||
|
}
|
||||||
|
type
|
||||||
|
TProduct = record
|
||||||
|
File: String;
|
||||||
|
Title: String;
|
||||||
|
Parameters: String;
|
||||||
|
ForceSuccess : boolean;
|
||||||
|
InstallClean : boolean;
|
||||||
|
MustRebootAfter : boolean;
|
||||||
|
end;
|
||||||
|
|
||||||
|
InstallResult = (InstallSuccessful, InstallRebootRequired, InstallError);
|
||||||
|
|
||||||
|
var
|
||||||
|
installMemo, downloadMemo, downloadMessage: string;
|
||||||
|
products: array of TProduct;
|
||||||
|
delayedReboot, isForcedX86: boolean;
|
||||||
|
DependencyPage: TOutputProgressWizardPage;
|
||||||
|
|
||||||
|
procedure AddProduct(filename, parameters, title, size, url: string; forceSuccess, installClean, mustRebootAfter : boolean);
|
||||||
|
{
|
||||||
|
Adds a product to the list of products to download.
|
||||||
|
Parameters:
|
||||||
|
filename: the file name under which to save the file
|
||||||
|
parameters: the parameters with which to run the file
|
||||||
|
title: the product title
|
||||||
|
size: the file size
|
||||||
|
url: the URL to download from
|
||||||
|
forceSuccess: whether to continue in case of setup failure
|
||||||
|
installClean: whether the product needs a reboot before installing
|
||||||
|
mustRebootAfter: whether the product needs a reboot after installing
|
||||||
|
}
|
||||||
|
var
|
||||||
|
path: string;
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
installMemo := installMemo + '%1' + title + #13;
|
||||||
|
|
||||||
|
path := ExpandConstant('{src}{\}') + CustomMessage('DependenciesDir') + '\' + filename;
|
||||||
|
if not FileExists(path) then begin
|
||||||
|
path := ExpandConstant('{tmp}{\}') + filename;
|
||||||
|
|
||||||
|
if not FileExists(path) then begin
|
||||||
|
isxdl_AddFile(url, path);
|
||||||
|
|
||||||
|
downloadMemo := downloadMemo + '%1' + title + #13;
|
||||||
|
downloadMessage := downloadMessage + ' ' + title + ' (' + size + ')' + #13;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
i := GetArrayLength(products);
|
||||||
|
SetArrayLength(products, i + 1);
|
||||||
|
products[i].File := path;
|
||||||
|
products[i].Title := title;
|
||||||
|
products[i].Parameters := parameters;
|
||||||
|
products[i].ForceSuccess := forceSuccess;
|
||||||
|
products[i].InstallClean := installClean;
|
||||||
|
products[i].MustRebootAfter := mustRebootAfter;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function SmartExec(product : TProduct; var resultcode : Integer): boolean;
|
||||||
|
{
|
||||||
|
Executes a product and returns the exit code.
|
||||||
|
Parameters:
|
||||||
|
product: the product to install
|
||||||
|
resultcode: the exit code
|
||||||
|
}
|
||||||
|
begin
|
||||||
|
if (LowerCase(Copy(product.File, Length(product.File) - 2, 3)) = 'exe') then begin
|
||||||
|
Result := Exec(product.File, product.Parameters, '', SW_SHOWNORMAL, ewWaitUntilTerminated, resultcode);
|
||||||
|
end else begin
|
||||||
|
Result := ShellExec('', product.File, product.Parameters, '', SW_SHOWNORMAL, ewWaitUntilTerminated, resultcode);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function PendingReboot: boolean;
|
||||||
|
{
|
||||||
|
Checks whether the machine has a pending reboot.
|
||||||
|
}
|
||||||
|
var names: String;
|
||||||
|
begin
|
||||||
|
if (RegQueryMultiStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager', 'PendingFileRenameOperations', names)) then begin
|
||||||
|
Result := true;
|
||||||
|
end else if ((RegQueryMultiStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager', 'SetupExecute', names)) and (names <> '')) then begin
|
||||||
|
Result := true;
|
||||||
|
end else begin
|
||||||
|
Result := false;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function InstallProducts: InstallResult;
|
||||||
|
{
|
||||||
|
Installs the downloaded products
|
||||||
|
}
|
||||||
|
var
|
||||||
|
resultCode, i, productCount, finishCount: Integer;
|
||||||
|
begin
|
||||||
|
Result := InstallSuccessful;
|
||||||
|
productCount := GetArrayLength(products);
|
||||||
|
|
||||||
|
if productCount > 0 then begin
|
||||||
|
DependencyPage := CreateOutputProgressPage(CustomMessage('depinstall_title'), CustomMessage('depinstall_description'));
|
||||||
|
DependencyPage.Show;
|
||||||
|
|
||||||
|
for i := 0 to productCount - 1 do begin
|
||||||
|
if (products[i].InstallClean and (delayedReboot or PendingReboot())) then begin
|
||||||
|
Result := InstallRebootRequired;
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
|
||||||
|
DependencyPage.SetText(FmtMessage(CustomMessage('depinstall_status'), [products[i].Title]), '');
|
||||||
|
DependencyPage.SetProgress(i, productCount);
|
||||||
|
|
||||||
|
if SmartExec(products[i], resultCode) then begin
|
||||||
|
//setup executed; resultCode contains the exit code
|
||||||
|
if (products[i].MustRebootAfter) then begin
|
||||||
|
//delay reboot after install if we installed the last dependency anyways
|
||||||
|
if (i = productCount - 1) then begin
|
||||||
|
delayedReboot := true;
|
||||||
|
end else begin
|
||||||
|
Result := InstallRebootRequired;
|
||||||
|
end;
|
||||||
|
break;
|
||||||
|
end else if (resultCode = 0) or (products[i].ForceSuccess) then begin
|
||||||
|
finishCount := finishCount + 1;
|
||||||
|
end else if (resultCode = 3010) then begin
|
||||||
|
//Windows Installer resultCode 3010: ERROR_SUCCESS_REBOOT_REQUIRED
|
||||||
|
delayedReboot := true;
|
||||||
|
finishCount := finishCount + 1;
|
||||||
|
end else begin
|
||||||
|
Result := InstallError;
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
end else begin
|
||||||
|
Result := InstallError;
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
//only leave not installed products for error message
|
||||||
|
for i := 0 to productCount - finishCount - 1 do begin
|
||||||
|
products[i] := products[i+finishCount];
|
||||||
|
end;
|
||||||
|
SetArrayLength(products, productCount - finishCount);
|
||||||
|
|
||||||
|
DependencyPage.Hide;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{
|
||||||
|
--------------------
|
||||||
|
INNO EVENT FUNCTIONS
|
||||||
|
--------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
function PrepareToInstall(var NeedsRestart: boolean): String;
|
||||||
|
{
|
||||||
|
Before the "preparing to install" page.
|
||||||
|
See: http://www.jrsoftware.org/ishelp/index.php?topic=scriptevents
|
||||||
|
}
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
s: string;
|
||||||
|
begin
|
||||||
|
delayedReboot := false;
|
||||||
|
|
||||||
|
case InstallProducts() of
|
||||||
|
InstallError: begin
|
||||||
|
s := CustomMessage('depinstall_error');
|
||||||
|
|
||||||
|
for i := 0 to GetArrayLength(products) - 1 do begin
|
||||||
|
s := s + #13 + ' ' + products[i].Title;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Result := s;
|
||||||
|
end;
|
||||||
|
InstallRebootRequired: begin
|
||||||
|
Result := products[0].Title;
|
||||||
|
NeedsRestart := true;
|
||||||
|
|
||||||
|
//write into the registry that the installer needs to be executed again after restart
|
||||||
|
RegWriteStringValue(HKEY_CURRENT_USER, 'SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce', 'InstallBootstrap', ExpandConstant('{srcexe}'));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function NeedRestart : boolean;
|
||||||
|
{
|
||||||
|
Checks whether a restart is needed at the end of install
|
||||||
|
See: http://www.jrsoftware.org/ishelp/index.php?topic=scriptevents
|
||||||
|
}
|
||||||
|
begin
|
||||||
|
Result := delayedReboot;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
|
||||||
|
{
|
||||||
|
Just before the "ready" page.
|
||||||
|
See: http://www.jrsoftware.org/ishelp/index.php?topic=scriptevents
|
||||||
|
}
|
||||||
|
var
|
||||||
|
s: string;
|
||||||
|
begin
|
||||||
|
if downloadMemo <> '' then
|
||||||
|
s := s + CustomMessage('depdownload_memo_title') + ':' + NewLine + FmtMessage(downloadMemo, [Space]) + NewLine;
|
||||||
|
if installMemo <> '' then
|
||||||
|
s := s + CustomMessage('depinstall_memo_title') + ':' + NewLine + FmtMessage(installMemo, [Space]) + NewLine;
|
||||||
|
|
||||||
|
s := s + MemoDirInfo + NewLine + NewLine + MemoGroupInfo
|
||||||
|
|
||||||
|
if MemoTasksInfo <> '' then
|
||||||
|
s := s + NewLine + NewLine + MemoTasksInfo;
|
||||||
|
|
||||||
|
Result := s
|
||||||
|
end;
|
||||||
|
|
||||||
|
function NextButtonClick(CurPageID: Integer): boolean;
|
||||||
|
{
|
||||||
|
At each "next" button click
|
||||||
|
See: http://www.jrsoftware.org/ishelp/index.php?topic=scriptevents
|
||||||
|
}
|
||||||
|
begin
|
||||||
|
Result := true;
|
||||||
|
|
||||||
|
if CurPageID = wpReady then begin
|
||||||
|
if downloadMemo <> '' then begin
|
||||||
|
//change isxdl language only if it is not english because isxdl default language is already english
|
||||||
|
if (ActiveLanguage() <> 'en') then begin
|
||||||
|
ExtractTemporaryFile(CustomMessage('isxdl_langfile'));
|
||||||
|
isxdl_SetOption('language', ExpandConstant('{tmp}{\}') + CustomMessage('isxdl_langfile'));
|
||||||
|
end;
|
||||||
|
//isxdl_SetOption('title', FmtMessage(SetupMessage(msgSetupWindowTitle), [CustomMessage('appname')]));
|
||||||
|
|
||||||
|
if SuppressibleMsgBox(FmtMessage(CustomMessage('depdownload_msg'), [downloadMessage]), mbConfirmation, MB_YESNO, IDYES) = IDNO then
|
||||||
|
Result := false
|
||||||
|
else if isxdl_DownloadFiles(StrToInt(ExpandConstant('{wizardhwnd}'))) = 0 then
|
||||||
|
Result := false;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{
|
||||||
|
-----------------------------
|
||||||
|
ARCHITECTURE HELPER FUNCTIONS
|
||||||
|
-----------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
function IsX86: boolean;
|
||||||
|
{
|
||||||
|
Gets whether the computer is x86 (32 bits).
|
||||||
|
}
|
||||||
|
begin
|
||||||
|
Result := isForcedX86 or (ProcessorArchitecture = paX86) or (ProcessorArchitecture = paUnknown);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function IsX64: boolean;
|
||||||
|
{
|
||||||
|
Gets whether the computer is x64 (64 bits).
|
||||||
|
}
|
||||||
|
begin
|
||||||
|
Result := (not isForcedX86) and Is64BitInstallMode and (ProcessorArchitecture = paX64);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function IsIA64: boolean;
|
||||||
|
{
|
||||||
|
Gets whether the computer is IA64 (Itanium 64 bits).
|
||||||
|
}
|
||||||
|
begin
|
||||||
|
Result := (not isForcedX86) and Is64BitInstallMode and (ProcessorArchitecture = paIA64);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function GetString(x86, x64, ia64: String): String;
|
||||||
|
{
|
||||||
|
Gets a string depending on the computer architecture.
|
||||||
|
Parameters:
|
||||||
|
x86: the string if the computer is x86
|
||||||
|
x64: the string if the computer is x64
|
||||||
|
ia64: the string if the computer is IA64
|
||||||
|
}
|
||||||
|
begin
|
||||||
|
if IsX64() and (x64 <> '') then begin
|
||||||
|
Result := x64;
|
||||||
|
end else if IsIA64() and (ia64 <> '') then begin
|
||||||
|
Result := ia64;
|
||||||
|
end else begin
|
||||||
|
Result := x86;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function GetArchitectureString(): String;
|
||||||
|
{
|
||||||
|
Gets the "standard" architecture suffix string.
|
||||||
|
Returns either _x64, _ia64 or nothing.
|
||||||
|
}
|
||||||
|
begin
|
||||||
|
if IsX64() then begin
|
||||||
|
Result := '_x64';
|
||||||
|
end else if IsIA64() then begin
|
||||||
|
Result := '_ia64';
|
||||||
|
end else begin
|
||||||
|
Result := '';
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure SetForceX86(value: boolean);
|
||||||
|
{
|
||||||
|
Forces the setup to use X86 products
|
||||||
|
}
|
||||||
|
begin
|
||||||
|
isForcedX86 := value;
|
||||||
|
end;
|
||||||
49
Installer/scripts/isxdl/english.ini
Normal file
49
Installer/scripts/isxdl/english.ini
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
[strings]
|
||||||
|
; General
|
||||||
|
100=File download
|
||||||
|
101=Do you want to cancel the download?
|
||||||
|
102=%1 (%2 of %3)
|
||||||
|
103=%1 KB
|
||||||
|
104=%1 KB of %2 KB (%3%)
|
||||||
|
|
||||||
|
; Status information
|
||||||
|
110=Getting file information...
|
||||||
|
111=Redirecting to %1
|
||||||
|
112=Sending request...
|
||||||
|
113=Resolving %1
|
||||||
|
114=Connected to %1
|
||||||
|
115=Receiving...
|
||||||
|
116=Connecting to %1
|
||||||
|
|
||||||
|
; Error messages
|
||||||
|
120=Error connecting to the internet.\n\n%1
|
||||||
|
121=Error opening %1.\n\nThe server returned status code %2.
|
||||||
|
122=Error reading URL.\n\n%1
|
||||||
|
123=Error writing file %1.\n\n%2
|
||||||
|
124=Error opening file %1.\n\n%2
|
||||||
|
125='%1' is an invalid URL.
|
||||||
|
126=Error opening %1.\n\n%2
|
||||||
|
127=Error sending request.\n\n%1
|
||||||
|
128=Unsupported protocol. Only HTTP and FTP protocols are supported.
|
||||||
|
129=Failed to connect to %1.\n\n%2
|
||||||
|
130=Failed to query status code.\n\n%1
|
||||||
|
131=Error requesting file.\n\n%1
|
||||||
|
|
||||||
|
; Other
|
||||||
|
144=About...
|
||||||
|
146=Download
|
||||||
|
147=Setup is now downloading additional files to your computer.
|
||||||
|
|
||||||
|
; labels
|
||||||
|
160=File:
|
||||||
|
161=Speed:
|
||||||
|
162=Status:
|
||||||
|
163=Elapsed Time:
|
||||||
|
164=Remaining Time:
|
||||||
|
165=Current File:
|
||||||
|
166=Overall Progress:
|
||||||
|
167=Cancel
|
||||||
|
168=OK
|
||||||
|
169=User Name and Password
|
||||||
|
170=User Name:
|
||||||
|
171=Password:
|
||||||
BIN
Installer/scripts/isxdl/isxdl.dll
Normal file
BIN
Installer/scripts/isxdl/isxdl.dll
Normal file
Binary file not shown.
14
Installer/scripts/isxdl/isxdl.iss
Normal file
14
Installer/scripts/isxdl/isxdl.iss
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
[Files]
|
||||||
|
Source: "scripts\isxdl\isxdl.dll"; Flags: dontcopy
|
||||||
|
|
||||||
|
[Code]
|
||||||
|
procedure isxdl_AddFile(URL, Filename: PAnsiChar);
|
||||||
|
external 'isxdl_AddFile@files:isxdl.dll stdcall';
|
||||||
|
|
||||||
|
function isxdl_DownloadFiles(hWnd: Integer): Integer;
|
||||||
|
external 'isxdl_DownloadFiles@files:isxdl.dll stdcall';
|
||||||
|
|
||||||
|
function isxdl_SetOption(Option, Value: PAnsiChar): Integer;
|
||||||
|
external 'isxdl_SetOption@files:isxdl.dll stdcall';
|
||||||
|
|
||||||
|
[Setup]
|
||||||
27
Installer/scripts/products.iss
Normal file
27
Installer/scripts/products.iss
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#include "isxdl\isxdl.iss"
|
||||||
|
|
||||||
|
[CustomMessages]
|
||||||
|
DependenciesDir=MyProgramDependencies
|
||||||
|
|
||||||
|
en.depdownload_msg=The following applications are required before setup can continue:%n%n%1%nDownload and install now?
|
||||||
|
|
||||||
|
en.depdownload_memo_title=Download dependencies
|
||||||
|
|
||||||
|
en.depinstall_memo_title=Install dependencies
|
||||||
|
|
||||||
|
en.depinstall_title=Installing dependencies
|
||||||
|
|
||||||
|
en.depinstall_description=Please wait while Setup installs dependencies on your computer.
|
||||||
|
|
||||||
|
en.depinstall_status=Installing %1...
|
||||||
|
|
||||||
|
en.depinstall_missing=%1 must be installed before setup can continue. Please install %1 and run Setup again.
|
||||||
|
|
||||||
|
en.depinstall_error=An error occured while installing the dependencies. Please restart the computer and run the setup again or install the following dependencies manually:%n
|
||||||
|
|
||||||
|
en.isxdl_langfile=
|
||||||
|
|
||||||
|
[Code]
|
||||||
|
#include "code.pas"
|
||||||
|
|
||||||
|
[Setup]
|
||||||
28
Installer/scripts/products/dotnetfx46.iss
Normal file
28
Installer/scripts/products/dotnetfx46.iss
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
; requires Windows 10, Windows 7 Service Pack 1, Windows 8, Windows 8.1, Windows Server 2008 R2 SP1, Windows Server 2008 Service Pack 2, Windows Server 2012, Windows Server 2012 R2, Windows Vista Service Pack 2
|
||||||
|
; WARNING: express setup (downloads and installs the components depending on your OS) if you want to deploy it on cd or network download the full bootsrapper on website below
|
||||||
|
; https://www.microsoft.com/en-US/download/details.aspx?id=49982
|
||||||
|
|
||||||
|
[CustomMessages]
|
||||||
|
dotnetfx46_title=.NET Framework 4.6.1
|
||||||
|
|
||||||
|
dotnetfx46_size=1 MB - 65 MB
|
||||||
|
|
||||||
|
;http://www.microsoft.com/globaldev/reference/lcid-all.mspx
|
||||||
|
en.dotnetfx46_lcid=
|
||||||
|
|
||||||
|
[Code]
|
||||||
|
const
|
||||||
|
dotnetfx461_url = 'http://download.microsoft.com/download/3/5/9/35980F81-60F4-4DE3-88FC-8F962B97253B/NDP461-KB3102438-Web.exe';
|
||||||
|
|
||||||
|
procedure dotnetfx46(minVersion: integer);
|
||||||
|
begin
|
||||||
|
if (not netfxinstalled(NetFx4x, '') or (netfxspversion(NetFx4x, '') < minVersion)) then
|
||||||
|
AddProduct('dotnetfx46.exe',
|
||||||
|
CustomMessage('dotnetfx46_lcid') + ' /passive /norestart',
|
||||||
|
CustomMessage('dotnetfx46_title'),
|
||||||
|
CustomMessage('dotnetfx46_size'),
|
||||||
|
dotnetfx461_url,
|
||||||
|
false, false, false);
|
||||||
|
end;
|
||||||
|
|
||||||
|
[Setup]
|
||||||
94
Installer/scripts/products/dotnetfxversion.iss
Normal file
94
Installer/scripts/products/dotnetfxversion.iss
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
[Code]
|
||||||
|
type
|
||||||
|
NetFXType = (NetFx10, NetFx11, NetFx20, NetFx30, NetFx35, NetFx40Client, NetFx40Full, NetFx4x);
|
||||||
|
|
||||||
|
const
|
||||||
|
netfx11plus_reg = 'Software\Microsoft\NET Framework Setup\NDP\';
|
||||||
|
|
||||||
|
function netfxinstalled(version: NetFXType; lcid: string): boolean;
|
||||||
|
var
|
||||||
|
regVersion: cardinal;
|
||||||
|
regVersionString: string;
|
||||||
|
begin
|
||||||
|
if (lcid <> '') then
|
||||||
|
lcid := '\' + lcid;
|
||||||
|
|
||||||
|
if (version = NetFx10) then begin
|
||||||
|
RegQueryStringValue(HKLM, 'Software\Microsoft\.NETFramework\Policy\v1.0\3705', 'Install', regVersionString);
|
||||||
|
Result := regVersionString <> '';
|
||||||
|
end else begin
|
||||||
|
case version of
|
||||||
|
NetFx11:
|
||||||
|
RegQueryDWordValue(HKLM, netfx11plus_reg + 'v1.1.4322' + lcid, 'Install', regVersion);
|
||||||
|
NetFx20:
|
||||||
|
RegQueryDWordValue(HKLM, netfx11plus_reg + 'v2.0.50727' + lcid, 'Install', regVersion);
|
||||||
|
NetFx30:
|
||||||
|
RegQueryDWordValue(HKLM, netfx11plus_reg + 'v3.0\Setup' + lcid, 'InstallSuccess', regVersion);
|
||||||
|
NetFx35:
|
||||||
|
RegQueryDWordValue(HKLM, netfx11plus_reg + 'v3.5' + lcid, 'Install', regVersion);
|
||||||
|
NetFx40Client:
|
||||||
|
RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Client' + lcid, 'Install', regVersion);
|
||||||
|
NetFx40Full:
|
||||||
|
RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Full' + lcid, 'Install', regVersion);
|
||||||
|
NetFx4x:
|
||||||
|
begin
|
||||||
|
RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Full' + lcid, 'Release', regVersion);
|
||||||
|
Result := (regVersion >= 378389); // 4.5.0+
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Result := (regVersion <> 0);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function netfxspversion(version: NetFXType; lcid: string): integer;
|
||||||
|
var
|
||||||
|
regVersion: cardinal;
|
||||||
|
begin
|
||||||
|
if (lcid <> '') then
|
||||||
|
lcid := '\' + lcid;
|
||||||
|
|
||||||
|
case version of
|
||||||
|
NetFx10:
|
||||||
|
//not supported
|
||||||
|
regVersion := -1;
|
||||||
|
NetFx11:
|
||||||
|
if (not RegQueryDWordValue(HKLM, netfx11plus_reg + 'v1.1.4322' + lcid, 'SP', regVersion)) then
|
||||||
|
regVersion := -1;
|
||||||
|
NetFx20:
|
||||||
|
if (not RegQueryDWordValue(HKLM, netfx11plus_reg + 'v2.0.50727' + lcid, 'SP', regVersion)) then
|
||||||
|
regVersion := -1;
|
||||||
|
NetFx30:
|
||||||
|
if (not RegQueryDWordValue(HKLM, netfx11plus_reg + 'v3.0' + lcid, 'SP', regVersion)) then
|
||||||
|
regVersion := -1;
|
||||||
|
NetFx35:
|
||||||
|
if (not RegQueryDWordValue(HKLM, netfx11plus_reg + 'v3.5' + lcid, 'SP', regVersion)) then
|
||||||
|
regVersion := -1;
|
||||||
|
NetFx40Client:
|
||||||
|
if (not RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Client' + lcid, 'Servicing', regVersion)) then
|
||||||
|
regVersion := -1;
|
||||||
|
NetFx40Full:
|
||||||
|
if (not RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Full' + lcid, 'Servicing', regVersion)) then
|
||||||
|
regVersion := -1;
|
||||||
|
NetFx4x:
|
||||||
|
if (RegQueryDWordValue(HKLM, netfx11plus_reg + 'v4\Full' + lcid, 'Release', regVersion)) then begin
|
||||||
|
if (regVersion >= 394747) then
|
||||||
|
regVersion := 62 // 4.6.2+
|
||||||
|
else if (regVersion >= 394254) then
|
||||||
|
regVersion := 61 // 4.6.1+
|
||||||
|
else if (regVersion >= 393295) then
|
||||||
|
regVersion := 60 // 4.6+
|
||||||
|
else if (regVersion >= 379893) then
|
||||||
|
regVersion := 52 // 4.5.2+
|
||||||
|
else if (regVersion >= 378675) then
|
||||||
|
regVersion := 51 // 4.5.1+
|
||||||
|
else if (regVersion >= 378389) then
|
||||||
|
regVersion := 50 // 4.5.0+
|
||||||
|
else
|
||||||
|
regVersion := -1;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Result := regVersion;
|
||||||
|
end;
|
||||||
|
|
||||||
|
[Setup]
|
||||||
25
Installer/scripts/products/fileversion.iss
Normal file
25
Installer/scripts/products/fileversion.iss
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
[Code]
|
||||||
|
function GetFullVersion(VersionMS, VersionLS: cardinal): string;
|
||||||
|
var
|
||||||
|
version: string;
|
||||||
|
begin
|
||||||
|
version := IntToStr(word(VersionMS shr 16));
|
||||||
|
version := version + '.' + IntToStr(word(VersionMS and not $ffff0000));
|
||||||
|
|
||||||
|
version := version + '.' + IntToStr(word(VersionLS shr 16));
|
||||||
|
version := version + '.' + IntToStr(word(VersionLS and not $ffff0000));
|
||||||
|
|
||||||
|
Result := version;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function fileversion(file: string): string;
|
||||||
|
var
|
||||||
|
versionMS, versionLS: cardinal;
|
||||||
|
begin
|
||||||
|
if GetVersionNumbers(file, versionMS, versionLS) then
|
||||||
|
Result := GetFullVersion(versionMS, versionLS)
|
||||||
|
else
|
||||||
|
Result := '0';
|
||||||
|
end;
|
||||||
|
|
||||||
|
[Setup]
|
||||||
62
Installer/scripts/products/stringversion.iss
Normal file
62
Installer/scripts/products/stringversion.iss
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
[Code]
|
||||||
|
function stringtoversion(var temp: String): Integer;
|
||||||
|
var
|
||||||
|
part: String;
|
||||||
|
pos1: Integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
if (Length(temp) = 0) then begin
|
||||||
|
Result := -1;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
pos1 := Pos('.', temp);
|
||||||
|
if (pos1 = 0) then begin
|
||||||
|
Result := StrToInt(temp);
|
||||||
|
temp := '';
|
||||||
|
end else begin
|
||||||
|
part := Copy(temp, 1, pos1 - 1);
|
||||||
|
temp := Copy(temp, pos1 + 1, Length(temp));
|
||||||
|
Result := StrToInt(part);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function compareinnerversion(var x, y: String): Integer;
|
||||||
|
var
|
||||||
|
num1, num2: Integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
num1 := stringtoversion(x);
|
||||||
|
num2 := stringtoversion(y);
|
||||||
|
if (num1 = -1) and (num2 = -1) then begin
|
||||||
|
Result := 0;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (num1 < 0) then begin
|
||||||
|
num1 := 0;
|
||||||
|
end;
|
||||||
|
if (num2 < 0) then begin
|
||||||
|
num2 := 0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (num1 < num2) then begin
|
||||||
|
Result := -1;
|
||||||
|
end else if (num1 > num2) then begin
|
||||||
|
Result := 1;
|
||||||
|
end else begin
|
||||||
|
Result := compareinnerversion(x, y);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function compareversion(versionA, versionB: String): Integer;
|
||||||
|
var
|
||||||
|
temp1, temp2: String;
|
||||||
|
|
||||||
|
begin
|
||||||
|
temp1 := versionA;
|
||||||
|
temp2 := versionB;
|
||||||
|
Result := compareinnerversion(temp1, temp2);
|
||||||
|
end;
|
||||||
|
|
||||||
|
[Setup]
|
||||||
49
Installer/scripts/products/winversion.iss
Normal file
49
Installer/scripts/products/winversion.iss
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
[Code]
|
||||||
|
var
|
||||||
|
WindowsVersion: TWindowsVersion;
|
||||||
|
|
||||||
|
procedure initwinversion();
|
||||||
|
begin
|
||||||
|
GetWindowsVersionEx(WindowsVersion);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function exactwinversion(MajorVersion, MinorVersion: integer): boolean;
|
||||||
|
begin
|
||||||
|
Result := (WindowsVersion.Major = MajorVersion) and (WindowsVersion.Minor = MinorVersion);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function minwinversion(MajorVersion, MinorVersion: integer): boolean;
|
||||||
|
begin
|
||||||
|
Result := (WindowsVersion.Major > MajorVersion) or ((WindowsVersion.Major = MajorVersion) and (WindowsVersion.Minor >= MinorVersion));
|
||||||
|
end;
|
||||||
|
|
||||||
|
function maxwinversion(MajorVersion, MinorVersion: integer): boolean;
|
||||||
|
begin
|
||||||
|
Result := (WindowsVersion.Major < MajorVersion) or ((WindowsVersion.Major = MajorVersion) and (WindowsVersion.Minor <= MinorVersion));
|
||||||
|
end;
|
||||||
|
|
||||||
|
function exactwinspversion(MajorVersion, MinorVersion, SpVersion: integer): boolean;
|
||||||
|
begin
|
||||||
|
if exactwinversion(MajorVersion, MinorVersion) then
|
||||||
|
Result := WindowsVersion.ServicePackMajor = SpVersion
|
||||||
|
else
|
||||||
|
Result := true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function minwinspversion(MajorVersion, MinorVersion, SpVersion: integer): boolean;
|
||||||
|
begin
|
||||||
|
if exactwinversion(MajorVersion, MinorVersion) then
|
||||||
|
Result := WindowsVersion.ServicePackMajor >= SpVersion
|
||||||
|
else
|
||||||
|
Result := true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function maxwinspversion(MajorVersion, MinorVersion, SpVersion: integer): boolean;
|
||||||
|
begin
|
||||||
|
if exactwinversion(MajorVersion, MinorVersion) then
|
||||||
|
Result := WindowsVersion.ServicePackMajor <= SpVersion
|
||||||
|
else
|
||||||
|
Result := true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
[Setup]
|
||||||
82
Installer/setup.iss
Normal file
82
Installer/setup.iss
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
#define use_dotnetfx46
|
||||||
|
|
||||||
|
#define MyAppName "SmartHDD"
|
||||||
|
#define MyAppVersion "1.0.0.0"
|
||||||
|
#define MyAppPublisher "DoogeJ"
|
||||||
|
#define MyAppURL "https://github.com/DoogeJ/SmartHDD"
|
||||||
|
#define MyAppExeName "SmartHDD.exe"
|
||||||
|
|
||||||
|
[Setup]
|
||||||
|
; NOTE: The value of AppId uniquely identifies this application.
|
||||||
|
AppId={{8F0F9A45-E913-479D-97DE-0E8017B7B687}
|
||||||
|
AppName={#MyAppName}
|
||||||
|
AppVersion={#MyAppVersion}
|
||||||
|
AppPublisher={#MyAppPublisher}
|
||||||
|
AppPublisherURL={#MyAppURL}
|
||||||
|
AppSupportURL={#MyAppURL}
|
||||||
|
AppUpdatesURL={#MyAppURL}
|
||||||
|
DefaultDirName={pf}\{#MyAppName}
|
||||||
|
DefaultGroupName={#MyAppName}
|
||||||
|
DisableProgramGroupPage=yes
|
||||||
|
OutputDir=bin
|
||||||
|
LicenseFile=..\LICENSE
|
||||||
|
OutputBaseFilename=Install_{#MyAppName}_{#MyAppVersion}
|
||||||
|
SetupIconFile=..\Visualpharm-Hardware-Hard-disk.ico
|
||||||
|
Compression=lzma
|
||||||
|
SolidCompression=yes
|
||||||
|
|
||||||
|
; we will need administrator privileges to copy to program files and / or install prerequirements
|
||||||
|
PrivilegesRequired=admin
|
||||||
|
|
||||||
|
;Downloading and installing dependencies will only work if the memo/ready page is enabled (default behaviour)
|
||||||
|
DisableReadyPage=no
|
||||||
|
DisableReadyMemo=no
|
||||||
|
|
||||||
|
[Languages]
|
||||||
|
Name: "en"; MessagesFile: "compiler:Default.isl"
|
||||||
|
|
||||||
|
[Tasks]
|
||||||
|
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"
|
||||||
|
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; OnlyBelowVersion: 0,6.1
|
||||||
|
|
||||||
|
[Files]
|
||||||
|
Source: "..\SmartHDD\bin\Release\SmartHDD.exe"; DestDir: "{app}"; Flags: ignoreversion
|
||||||
|
|
||||||
|
[Icons]
|
||||||
|
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
|
||||||
|
Name: "{group}\{cm:ProgramOnTheWeb,{#MyAppName}}"; Filename: "{#MyAppURL}"
|
||||||
|
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
|
||||||
|
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon
|
||||||
|
|
||||||
|
[Run]
|
||||||
|
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent runascurrentuser
|
||||||
|
|
||||||
|
[CustomMessages]
|
||||||
|
win_sp_title=Windows %1 Service Pack %2
|
||||||
|
|
||||||
|
|
||||||
|
; shared code for installing the products
|
||||||
|
#include "scripts\products.iss"
|
||||||
|
; helper functions
|
||||||
|
#include "scripts\products\stringversion.iss"
|
||||||
|
#include "scripts\products\winversion.iss"
|
||||||
|
#include "scripts\products\fileversion.iss"
|
||||||
|
#include "scripts\products\dotnetfxversion.iss"
|
||||||
|
|
||||||
|
#ifdef use_dotnetfx46
|
||||||
|
#include "scripts\products\dotnetfx46.iss"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
[Code]
|
||||||
|
function InitializeSetup(): boolean;
|
||||||
|
begin
|
||||||
|
// initialize windows version
|
||||||
|
initwinversion();
|
||||||
|
|
||||||
|
#ifdef use_dotnetfx46
|
||||||
|
dotnetfx46(50); // min allowed version is 4.5.0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Result := true;
|
||||||
|
end;
|
||||||
15
README.md
15
README.md
@@ -31,3 +31,18 @@ It will most likely build fine on different configurations, but might require so
|
|||||||
## Updating the version number
|
## Updating the version number
|
||||||
The version number is stored in two locations:
|
The version number is stored in two locations:
|
||||||
* In the projects assembly info file: **'SmartHDD\Properties\AssemblyInfo.cs'**
|
* In the projects assembly info file: **'SmartHDD\Properties\AssemblyInfo.cs'**
|
||||||
|
* In the installer setup.iss file (only used for the installer): **'Installer\setup.iss'**
|
||||||
|
|
||||||
|
## Building the installer
|
||||||
|
> Note: *This installer uses 3rd party components from [innodependencyinstaller](https://github.com/stfx/innodependencyinstaller) to automatically download and install the correct .NET framework if required. See* ***'Installer\innodependencyinstaller LICENSE.md'*** *for the license of innodependencyinstaller.*
|
||||||
|
|
||||||
|
SmartHDD uses the [Inno Setup Compiler](http://www.jrsoftware.org/isinfo.php) to generate an executable installer.
|
||||||
|
The installer project files are located in the **'Installer'**-folder.
|
||||||
|
|
||||||
|
The scripts are based on [Inno Setup 5.5.9](http://www.jrsoftware.org/isinfo.php) but will probably work with any recent version.
|
||||||
|
|
||||||
|
To build the installer:
|
||||||
|
* Make sure the project is compiled and there is a working executable named **'SmartHDD.exe'** in the **'SmartHDD\bin\Release'**-folder
|
||||||
|
* Open **'Installer\setup.iss'** in the [Inno Setup Compiler](http://www.jrsoftware.org/isinfo.php)
|
||||||
|
* Hit *Build* -> *Compile* (Ctrl+F9)
|
||||||
|
* Done, the installer should be in the **'Installer\bin'**-folder
|
||||||
Reference in New Issue
Block a user