What is the correct syntax for signing Inno Setup files? - inno-setup

I am trying to sign my Inno Setup file. I get an exit error 0x1 ?? Here is the line I am using to configure the sign tool in Inno:
"c:\Digital certificate\signtool.exe" sign/a/t http://timestamp.digicert.com / f "c:\Digital cerificate\mycertificate.pfx"/p "mypassword"/d "C:\Flash projects\flash projects 2022\Reset\inno\reset setup file\ResetSetup.exe" $f
Is the syntax OK? I am not sure about the use of quotations when specifying file names, also the $f at the end of the command line? Do I need it?
Any links / examples to how to configure the signtool would be appreciated.

In Inno Setup I configure the Sign Tools:
SignTool="C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\signtool.exe" sign $p
You would have to qualify the path to the signtool executable on your PC.
Then, in my script I have some definitions:
; SignTool parameters
#define SignedDesc "$qAppName$q"
#define SignedPfx "$qd:\My Certificate\2021\My Certificate.pfx$q"
#define SignedTimeStamp "$qhttp://timestamp.digicert.com$q"
;define SignedTimeStamp "$qhttp://timestamp.comodoca.com/authenticode$q"
;#define SignedTimeStamp "$qhttp://timestamp.globalsign.com/scripts/timestamp.dll$q"
;#define SignedTimeStamp "$qhttp://tsa.starfieldtech.com$q"
;#define SignedTimeStamp "$qhttp://timestamp.sectigo.com$q"
; The last server needs 15 seconds delay.
#define SignedPw "$qabc1234$q"
Adjust the values as required for your application etc..
In the [Setup] section (read more):
SignedUninstaller=yes
SignTool=SignTool /d {#SignedDesc} /du $q{#AppURL}$q /f {#SignedPfx} /p {#SignedPw} /t {#SignedTimeStamp} /v $f
SignToolRunMinimized=yes
SignToolMinimumTimeBetween=5000
In the [Files] section make sure you use either sign or signonce. Eg:
Source: "AppRestarter.exe"; DestDir: "{app}"; Flags: IgnoreVersion signonce

Related

What is the point of the #emit directive in Inno Setup?

Here are examples from the #emit directive documentation:
[Files]
#emit 'Source: "file1.ext"; DestDir: {' + MyDestDir + '}'
Source: "file2.ext"; DestDir: {#MyDestDir}
#emit GenerateVisualCppFilesEntries ; user defined function
In the first line I don't understand the DestDir part. Looks like the # symbol is missing there.
I understand the second line. But why do we need to use the #emit directive like in line 1 anyway?
Inno Setup preprocessor directives can be invoked using two syntaxes.
A basic syntax:
#directive params
And an inline syntax:
{#directive params}
On top of that, the #emit directive is the default inline directive, assumed, when no explicit directive name is specified.
So these three are equivalent:
#emit MyDestDir
{#emit MyDestDir}
{#MyDestDir}
Though the first does not make sense with a path variable, as it would result in invalid script syntax – but it can be used with a variable that contains a valid script syntax:
#define FileSectionEntry 'Source: ' + MySource + '; DestDir: ' + MyDestDir
#emit FileSectionEntry
While the other two inline examples can make sense, but only with other code on the same line, like in the code from your question:
Source: "file2.ext"; DestDir: {#MyDestDir}
Additionally an #emit with a (string) constant is basically pointless, as you can achieve the same without preprocessor.
These three are equivalent:
Source: "file2.ext"; DestDir: "{app}"
#emit 'Source: "file2.ext"; DestDir: "{app}"'
{#'Source: "file2.ext"; DestDir: "{app}"'}
So getting back to the code in your script, these are (almost) equivalent:
#emit 'Source: "file1.ext"; DestDir: {' + MyDestDir + '}'
Source: "file1.ext"; DestDir: {#MyDestDir}
The only problem is that I believe the curly brackets in the first line should not be there. The line should be:
#emit 'Source: "file1.ext"; DestDir: ' + MyDestDir
I have submitted a fix for this. It's basically another copy of the typo from your previous question: Why is there an additional pair of curly braces on the Inno Setup Preprocessor:#emit page?

Using path/value specified on Inno Setup compiler command-line in Inno Setup script

I want to pass a path (via command line arg /D to the script compiler) to my executable to let my script determine the application version number using GetFileVersion, but my syntax isn't correct. How do I pass an argument to GetFileVersion?
The error is: Illegal character in input file: '#' (0x23)
#define srcpath SOURCEPATH
#define ApplicationVersion GetFileVersion(#srcpath)//error here!!!!!!
[Setup]
AppVersion={#ApplicationVersion}
[Files]
Source: "MyDllTesting.dll"; Flags: dontcopy
Source: "{srcpath}MyApplication1.exe"; DestDir: "{app}\MyApplication1"
First, SOURCEPATH is a Inno Setup preprocessor predefined variable, so you need to use another name for your command-line "variable". I'll be using SOURCE_PATH.
Second, the correct syntax is:
#define ApplicationVersion GetFileVersion(SOURCE_PATH)
(i.e. no hash)
Why no hash, is covered in my answer to
Why preprocessor behaves differently in #include directive then in [Files] section Inno Setup script
Though the reason is basically the same, why you use no hash before SOURCEPATH here:
#define srcpath SOURCEPATH
On the contrary you are missing the hash in the [Files] section entry. The correct syntax is:
[Files]
Source: "{#srcpath}MyApplication1.exe"; DestDir: "{app}\MyApplication1"
And there's no need to define srcpath variable. SOURCE_PATH is variable too. So you can use it directly in any expression:
#define ApplicationVersion GetFileVersion(SOURCE_PATH)
[Files]
Source: "{#SOURCE_PATH}MyApplication1.exe"; DestDir: "{app}\MyApplication1"
From the docs on "Inno Setup Preprocessor: Command Line Compiler Execution" I could define a command line parameter called "MyCustomParam" by using /D option like this:
.\ISCC.exe /DMyCustomParam=MyParamValue "MySetupScript.iss"
and then I wrote my setup script like the following, which gets the value which was defined for the parameter on the command line:
[Setup]
AppName={#MyCustomParam}

Precedence of !define and /D - How can I set an overridable default value?

I'm building an installer for a system that is generally installed by my coworkers, but several things can vary from one target machine to the next, including the locations of the files-to-be-installed on the compiling machine. I thought I could set a "gflag" in the source (with !define) and override it in the call to makensis.exe (with /D), but I can't even get my installer to recognize that a /D flag was passed.
More relevant documentation is behind the /h flag:
PS C:\> &"C:\Program Files (x86)\NSIS\makensis.exe" /h
Usage:
makensis [ option | script.nsi | - ] [...]
Options:
#...
/Ddefine[=value] defines the symbol "define" for the script [to value]
#...
I'm using this NSIS code:
!ifndef test
!define test Foo
!endif
Section
DetailPrint "${test}"
SectionEnd
I compile the installer in PowerShell:
&"C:\Program Files (x86)\NSIS\makensis.exe" "C:\path\to\test.nsi" /Dtest=Bar
Among the output, I see this:
Command line defined: "test=Bar"
The installer is successfully created, but it prints Foo while it should print Bar. If I comment !define test Foo, I get a warning when compiling:
1 warning:
unknown variable/constant "{test}" detected, ignoring (C:\Mach4\Installer\test.nsi:6)
And then ${test} is printed, indicating that the gflag has no value. Why does it not have a value of Bar?
The command line is parsed in order. In your case that means the script is parsed before /Dtest=Bar is parsed. Try this instead:
"C:\Program Files (x86)\NSIS\makensis.exe" /Dtest=Bar "C:\path\to\test.nsi"

Inno Setup: How to expand preprocessor variable in #error directive message

I have an Inno Setup script which looks for a file as a preprocessor step:
#define a_path GetEnv("INSTALLER_FILES")
#define install_file FindFirst(a_path + "\pattern*.*")
When the install_file is not found, I would like to emit an error:
#if install_file == 0
#error No installer found at {#a_path}
#endif
But the ISPP only writes the literal source line on compilation:
script.iss: [ISPP] No installer found at {#a_path}
Is it possible to expand a preprocessor variable in the #error directive?
The argument of the #error directive cannot contain variables.
But you can use the #pragma error directive instead:
#pragma error "No installer found at " + a_path

Inno setup - relative path to ReadIni

How can I set relative path to ini file in ReadIni?
This works:
#define MyAppVersion ReadIni("C:\Users\Popov\Documents\Release\Install.ini", "Release", "VersionNumber")
But I want this:
#define MyAppVersion ReadIni("Install.ini", "Release", "VersionNumber")
Where Install.ini is in the inno script folder.
Use the SourcePath predefined variable, like this:
SourcePath str. Points to the directory where the current script is located, or the My Documents directory if the script has not yet been saved.
#define MyAppVersion ReadIni(SourcePath + "\Install.ini", "Release", "VersionNumber")
[Setup]
AppName=My Program
AppVersion={#MyAppVersion}

Resources