Default components for silent installation with Inno Setup - inno-setup

I'm developing an installation file in Inno setup.
It has 3 different optional components to install when user selects 'custom'.
It works fine, but when /SILENT parameter is passed, no component is installed. I suppose because no component is checked.
...here is the code fragment related:
[Types]
Name: custom; Description: {cm:instCustom}; Flags: iscustom
Name: full; Description: {cm:instFull}
[Components]
Name: Programador; Description: {cm:cmpProgramador}; Types: full
Name: Usuario; Description: {cm:cmpUsuario}; Types: full
Name: Reporte; Description: {cm:cmpReporte}; Types: full
[Icons]
Name: {group}\{cm:cmpProgramador}; Filename: {app}\Programador\{#MyAppExeNameA}; Components: Programador
Name: {group}\{cm:cmpUsuario}; Filename: {app}\Usuario\{#MyAppExeNameB}; Components: Usuario
Name: {group}\{cm:cmpReporte}; Filename: {app}\Reporte\{#MyAppExeNameC}; Components: Reporte
Name: {group}\Desinstalar MIVES; Filename: {uninstallexe}
[Registry]
Root: HKCU; Subkey: Software\UPC; Flags: uninsdeletekey
Root: HKCU; Subkey: Software\UPC\MIVES
Root: HKLM; Subkey: Software\UPC; Flags: uninsdeletekey
Root: HKLM; Subkey: Software\UPC\MIVES
Root: HKLM; Subkey: Software\UPC\MIVES\Settings; ValueType: string; ValueName: InstallPath; ValueData: {app}
; file association depens of the components selected
Root: HKCR; Subkey: .mip; ValueType: string; ValueData: mip_auto_file; Flags: uninsdeletekey; Components: Programador
Root: HKCR; Subkey: mip_auto_file; Flags: uninsdeletekey; Components: Programador
Root: HKCR; Subkey: mip_auto_file\shell\open\command; ValueType: expandsz; ValueData: {app}\Programador\{#MyAppExeNameA} %1; Components: Programador
Root: HKCR; Subkey: .miu; ValueType: string; ValueData: miu_auto_file; Flags: uninsdeletekey; Components: Usuario
Root: HKCR; Subkey: miu_auto_file; Flags: uninsdeletekey; Components: Usuario
Root: HKCR; Subkey: miu_auto_file\shell\open\command; ValueType: expandsz; ValueData: {app}\Usuario\{#MyAppExeNameB} %1; Components: Usuario
Root: HKCR; Subkey: .mir; ValueType: string; ValueData: mir_auto_file; Flags: uninsdeletekey; Components: Reporte
Root: HKCR; Subkey: mir_auto_file; Flags: uninsdeletekey; Components: Reporte
Root: HKCR; Subkey: mir_auto_file\shell\open\command; ValueType: expandsz; ValueData: {app}\Reporte\{#MyAppExeNameC} %1; Components: Reporte
[Files]
Source: {#MyAppExeNameA}; DestDir: {app}\Programador; Flags: promptifolder; Components: Programador
Source: {#MyAppExeNameB}; DestDir: {app}\Usuario; Flags: promptifolder; Components: Usuario
Source: {#MyAppExeNameC}; DestDir: {app}\Reporte; Flags: promptifolder; Components: Reporte
I need that one of the three components (component 'Usuario') was installed by default when the /silent or /verysilent parameter is passed.
I think I have to use Check: WizardSilent, but I don't know where. In fact, I tried adding the WizardSilent in Components section, but nothing happens:
[Components]
Name: Programador; Description: {cm:cmpProgramador}; Types: full
Name: Usuario; Description: {cm:cmpUsuario}; Types: full; Check: WizardSilent
Neither in the Files section:
[Files]
Source: {#MyAppExeNameB}; DestDir: {app}\Usuario; Flags: promptifolder; Components: Usuario; Check: WizardSilent
Here is what I need:
MIVES_211.exe /SP- /verysilent >>> installs "Usuario" component by default (silent mode, and no /components parameter)
MIVES_211.exe /SP- /silent /components=Reporte >>> installs only "Reporte" component (silent mode, and components parameter)
MIVES_211.exe /SP- /silent /components=Usuario,Reporte >>> installs "Usuario" and "Reporte" components (silent mode, and components parameter)
EDITED:
I think I've found one solution, but I don't know if it is a good solution. Just added one new type including the WizardSilent check:
[Types]
Name: silent; Description: {cm:instCustom}; Check: WizardSilent
Name: custom; Description: {cm:instCustom}; Flags: iscustom
Name: full; Description: {cm:instFull}
And use it in the components section, component "Usuario" (the component I want to install by default in a silent installation):
[Components]
Name: Programador; Description: {cm:cmpProgramador}; Types: full
Name: Usuario; Description: {cm:cmpUsuario}; Types: full silent
Name: Reporte; Description: {cm:cmpReporte}; Types: full
Now, it works really as I want. But I don't like to have two types with the same description, unless only one is showed in the setup wizard.
Is it a good idea?
Thanks!

I believe your setup is conceptually wrong.
The silent installation should install whatever the typical/default/common installation is. Now it looks like the default installation is the "Full" installation, but you want the silent installation to behave differently. That does not seem right.
So you should have a default "Typical" installation type, with the "Usuario" component. Just like you have the "Silent" type now. But the "Typical" type will make sense even in an interactive installation.
[Types]
Name: typical; Description: "Typical"
Name: full; Description: "Full"
Name: custom; Description: "Custom"; Flags: iscustom
[Components]
Name: Programador; Description: "Programador"; Types: full
Name: Usuario; Description: "Usuario"; Types: full typical
Name: Reporte; Description: "Reporte"; Types: full
And anyway, the /SILENT should always be accompanied with /LOADINF or at least /COMPONENTS or /TYPE.
Your solution with "silent" type, while a hack, will work somewhat, because the Check: WizardSilent will hide this type in the interactive installation.
Btw, note that with mere /SILENT, when upgrading, the installer will use components selected in the previous (possibly interactive) installation.

Related

Inno Setup remove specific reg key after uninstall

I try to remove a registry key after uninstalling it in Windows, but I couldn't get it working somehow. I tried everything which was listed here: Inno Setup: Removing a problematic registry key left by another program
I checked different docs of Inno Setup:
https://jrsoftware.org/ishelp/index.php?topic=uninstalldeletesection
https://jrsoftware.org/ishelp/index.php?topic=isxfunc_regdeletekeyincludingsubkeys
https://jrsoftware.org/ishelp/index.php?topic=registrysection
https://jrsoftware.org/ishelp/index.php?topic=isxfunc_regdeletevalue
I ended up with this:
; Basic setup for a JavaFX application
#define AppName "Practicumopdracht OOP2"
#define AppVersion "1.0.0"
#define AppPublisher "Remzi Cavdar"
#define AppURL "https://twitter.com/remzicavdar"
#define AppExeName "practicumopdracht.jar"
#define AppExeDir "C:\Users\Remzi\Projects\student-1\out\artifacts\practicumopdracht_jar"
#define AppIcon "app.ico"
#define ProjectDir "C:\Users\Remzi\Projects\JavaFX-Setup"
[Setup]
; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{DD7E7C3F-F4AC-4D76-8626-95019C15E111}
AppName={#AppName}
AppVersion={#AppVersion}
VersionInfoVersion=1.0.0.0
VersionInfoCopyright={#AppPublisher} - ict#remzi.info
AppVerName={#AppName}
AppPublisher={#AppPublisher}
AppPublisherURL={#AppURL}
AppSupportURL={#AppURL}
AppUpdatesURL={#AppURL}
DefaultDirName={localappdata}\Remzi Cavdar\{#AppName}
DisableProgramGroupPage=yes
PrivilegesRequired=lowest
OutputBaseFilename=Setup-practicumopdracht
Compression=lzma
SolidCompression=yes
WizardStyle=modern
UninstallDisplayName={#AppName}
UninstallDisplayIcon={app}\{#AppIcon}
MinVersion=10.0.10240
[Languages]
Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "{#AppExeDir}\{#AppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#ProjectDir}\{#AppIcon}"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#ProjectDir}\Input\OpenJDK19U-jre_x64_windows_hotspot_19_36.msi"; DestDir: "{tmp}"; AfterInstall: RunJavaInstaller
[Icons]
Name: "{autoprograms}\{#AppName}"; Filename: "{app}\{#AppExeName}"; IconFilename: "{app}\{#AppIcon}"
Name: "{autodesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}"; IconFilename: "{app}\{#AppIcon}"; Tasks: desktopicon
[Registry]
Root: HKCU; Subkey: "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store"; ValueType: binary; ValueName: "{app}\unins000.exe"; Flags: dontcreatekey uninsdeletevalue
[Run]
Filename: "{app}\{#AppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(AppName, '&', '&&')}}"; Flags: shellexec postinstall skipifsilent
[UninstallDelete]
Type: filesandordirs; Name: "{localappdata}\Remzi Cavdar"
[Code]
procedure RunJavaInstaller;
var
ErrorCode: Integer;
begin
if not ShellExec('', 'msiexec.exe', ExpandConstant('/i "{tmp}\OpenJDK19U-jre_x64_windows_hotspot_19_36.msi" ADDLOCAL=FeatureMain,FeatureEnvironment,FeatureJarFileRunWith,FeatureJavaHome,FeatureOracleJavaSoft /qb'), '', SW_SHOWNORMAL, ewWaitUntilTerminated, ErrorCode)
then
MsgBox('Java JRE installer failed to run!' + #13#10 + ' ' + SysErrorMessage(ErrorCode), mbError, MB_OK);
end;
This is what I'm trying to remove after uninstall:
I found a solution to my registry question. I needed to check for both 32-bit and 64-bit.
[Registry]
Root: HKCU; Subkey: "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store"; ValueType: binary; ValueName: "{app}\unins000.exe"; Flags: dontcreatekey uninsdeletevalue
Root: HKCU64; Subkey: "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store"; ValueType: binary; ValueName: "{app}\unins000.exe"; Flags: dontcreatekey uninsdeletevalue; Check: IsWin64
I found the answer here: Writing 32/64-bit specific registry key in Inno Setup and https://jrsoftware.org/ishelp/index.php?topic=registrysection also mention this with HKLM64 example, but I read things to fast to notice it.

Using the Tasks parameter with Registry key entries in Inno Setup script

I have discussed this task before about file associations. But something just came to my mind.
Here are the task deinifions:
[Tasks]
Name: "register32"; Description: "Meeting Schedule Assistant (32 bit)"; GroupDescription: "{cm:FileAssociations}"; Flags: unchecked exclusive; Check: IsWin64
Name: "register64"; Description: "Meeting Schedule Assistant (64 bit)"; GroupDescription: "{cm:FileAssociations}"; Flags: exclusive; Check: IsWin64
Here are the registry keys:
[Registry]
; ==================================================
; Register File Types
Root: "HKCR"; Subkey: ".mwb"; ValueType: string; ValueData: "MeetSchedAssist.MWB"; Flags: uninsdeletevalue
Root: "HKCR"; Subkey: ".srr"; ValueType: string; ValueData: "MeetSchedAssist.SRR"; Flags: uninsdeletevalue
Root: "HKCR"; Subkey: "MeetSchedAssist.MWB"; ValueType: string; ValueData: "Meeting Workbook Schedule"; Flags: uninsdeletekey
Root: "HKCR"; Subkey: "MeetSchedAssist.SRR"; ValueType: string; ValueData: "Assignments Report"; Flags: uninsdeletekey
Root: "HKCR"; Subkey: "MeetSchedAssist.MWB\Shell\Open\Command"; ValueType: string; ValueData: """{app}\{code:GetExecutableToRegister}"" ""%1"""; Flags: uninsdeletekey
Root: "HKCR"; Subkey: "MeetSchedAssist.SRR\Shell\Open\Command"; ValueType: string; ValueData: """{app}\{code:GetExecutableToRegister}"" ""%1"""; Flags: uninsdeletekey
; ==================================================
Shouldn't the above registry keys have a Tasks parameter? Like this:
Root: "HKCR"; \
Subkey: ".mwb"; \
ValueType: string; \
ValueData: "MeetSchedAssist.MWB"; \
Flags: uninsdeletevalue; \
Tasks: register32 register64
I am just not sure because one one of those tasks need to be ticked by the user, not both.
No, you should not put Tasks: register32 register64 there.
You want those Registry entries be processed always, don't you?
On 32-bit system the entries would not be processed, as neither of the tasks exist (due to Check: IsWin64).
Your tasks exist only to select the executable (GetExecutableToRegister), not to select whether and what keys to create.

Creating shortcut in user Start menu from elevated Inno Setup installer

During its lifetime, MyApp creates extra shortcuts to Userappdata,
MyAppGroupName\MyAppShortcut#2
MyAppGroupName\MyAppShortcut#3
...
yet as Inno Setup requires elevation because of registry Association edits the original {Group} item is inserted in a different (commonstartmenu) directory:
MyAppGroupName\MyAppShortcutAtInstallation
Very happy with the {Group} flavour in the install so
DisableProgramGroupPage=yes
is not an option at this stage. Else creating paths in Dirs like
{Userappdata}\MyAppGroupName
doesn't appear to function in the current script:
...
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
ChangesAssociations = yes
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
[Files]
; (Note: Scroll to the right to see the full lines!)
Source: "Test.exe"; DestDir: "{app}"; Flags: ignoreversion
[Icons]
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
[Registry]
Root: HKCU; Subkey: "Software\Auth/MyApp"; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\Auth\MyApp"; ValueType: string; ValueName: "Name"; ValueData: "{app}";
;Association
Root: HKCR; Subkey: ".XXX";ValueData: "{#MyAppName}";Flags: uninsdeletevalue; ValueType: string; ValueName: ""
Root: HKCR; Subkey: "{#MyAppName}";ValueData: "Program {#MyAppName}"; Flags: uninsdeletekey; ValueType: string; ValueName: ""
Root: HKCR; Subkey: "{#MyAppName}\DefaultIcon";ValueData: "{app}\{#MyAppExeName},0";ValueType: string; ValueName: ""
Root: HKCR; Subkey: "{#MyAppName}\shell\open\command";ValueData: """{app}\{#MyAppExeName}"" ""%1""";ValueType: string;ValueName: ""
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: en; MessagesFile: "compiler:Default.isl"
Name: deu; MessagesFile: "compiler:Languages\German.isl"
Name: es; MessagesFile: "compiler:Languages\Spanish.isl"
[Dirs]
Name: "{userstartmenu}\{userstartmenu}\{#MyAppName}"
[UninstallDelete]
Type: files; Name: "{#MyAppName}.chw"
Is there any known method of pointing {Group} to {Userappdata} in an elevated scenario? Or any other helpers e.g. here?
If I understand your question correctly you are looking for a combination of {userprograms} and {groupname}:
[Icons]
Name: "{userprograms}\{groupname}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Though note that:
Your approach is flawed in general. An installer should not both require elevation and modify environment of a specific user. The elevation can change user context (e.g. if Administrator account is distinct to the regular user account). So you do not know, if the "user" is the right user.
Using groups in Start menu is against Windows guidelines for Windows 8 and newer.

How to determine the Office version programmatically using the Inno Setup?

I have two types of Office add-ins – one for Office 2013 and another for other versions (2003-2010).
I use Inno Setup for distribution package.
Is it possible to determine the Office version that installed on target machine and than to run the right installation file?
I tried to write the code that detects the Word version and installs appropriate files but I failed to compile it. Since this is the first time that I write such a code, I would like to ask you to take a look on my code.
[Files]
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg2013.exe"; DestDir: "{app}"; Check: "Install2013"; MinVersion: 0.0,5.0;
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg2010.exe"; DestDir: "{app}"; Check: "Install2010"; MinVersion: 0.0,5.0;
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg2013x86.dll"; DestDir: "{app}"; Check: "Install2013"; MinVersion: 0.0,5.0; Flags: regserver noregerror ignoreversion 32bit
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg2013x64.dll"; DestDir: "{app}"; Check: "Install2013 and Is64BitInstallMode"; MinVersion: 0.0,5.0; Flags: regserver noregerror ignoreversion 64bit
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg2010x84.dll"; DestDir: "{app}"; Check: "Install2010"; MinVersion: 0.0,5.0; Flags: regserver noregerror ignoreversion 32bit
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg2010x64.dll"; DestDir: "{app}"; Check: "Install2010 and Is64BitInstallMode"; MinVersion: 0.0,5.0; Flags: regserver noregerror ignoreversion 64bit
Root: HKCU; Subkey: "Software\My Program\AppforWord"; ValueName: "AppBarStyle"; ValueType: String; ValueData: "1"; Components: "AppforWord"; Check: "Install2010"; MinVersion: 0.0,5.0; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\My Program\AppforExcel"; ValueName: "Enable"; ValueType: String; ValueData: "2"; Components: "AppforWord"; Check: "Install2010"; MinVersion: 0.0,5.0; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\My Program\AppforWord"; ValueName: "AppBarStyle"; ValueType: String; ValueData: "1"; Components: "AppforWord"; Check: "Install2013"; MinVersion: 0.0,5.0; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\My Program\AppforExcel"; ValueName: "Enable"; ValueType: String; ValueData: "2"; Components: "AppforWord"; Check: "Install2013"; MinVersion: 0.0,5.0; Flags: uninsdeletevalue
[Icons]
Name: "{commondesktop}\MyProg 2013"; Filename: "{app}\MyProg2013.exe"; Comment: "The settings for My Program 2013"; Check: "Install2013"; MinVersion: 0.0,5.0;
Name: "{commondesktop}\MyProg 2010"; Filename: "{app}\MyProg2010.exe"; Comment: "The settings of My Program"; Check: "Install2010"; MinVersion: 0.0,5.0;
[Code]
{ Get office version }
function IsInstall2013(): boolean;
var
success: boolean;
OfficeVer: cardinal;
begin
success :=
RegQueryDWordValue(
HKEY_CLASSES_ROOT, 'Word.Application\CurVer', Word.Application.15' );
Result := success and (OfficeVer = Word.Application.15);
end;
{ RETURNS OPPOSITE OF IsInstall2013 FUNCTION }
function Install2013(): Boolean;
begin
Result := (IsInstall2013 = false);
end;
{ RETURNS OPPOSITE OF not Office2013 FUNCTION }
function Install2010(): Boolean;
begin
Result := (IsInstall2010 = true);
end;
Since I also would like to create an Inno Setup installation routine which detects the version of Office someone is using. I have tried various iterations of the above code and can't seem to get things to work.
My objective is simple... install files A,B,C if someone is using Office 2010. If someone is using Office 2013, install files D,E,F,.

File associations with Inno-Setup registry

I have the following in SwatchDogPRC.ISS:
(snip)
[Files]
Source: "C:\Program Files\palmOne\Instapp.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files\palmOne\Instaide.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files\palmOne\palmCmn.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files\palmOne\UserData.dll"; DestDir: "{app}"; Flags: ignoreversion
[REGISTRY]
Root: HKCR; Subkey: ".prc"; ValueType: string; ValueName: ""; ValueData: "SwatchDogPRC"; Flags: uninsdeletevalue
Root: HKCR; Subkey: "SwatchDogPRC"; ValueType: string; ValueName: ""; ValueData: "SwatchDog Prog"; Flags: uninsdeletekey
Root: HKCR; Subkey: "SwatchDogPRC\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\Instapp.EXE,0"
Root: HKCR; Subkey: "SwatchDogPRC\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\Instapp.EXE"" ""%1"""
I'm trying to associate .prc files with Instapp.exe.
My registry entries are being read because the icon changes in File Explorer, and the program type changes as well.
But the program that is run when I double click on the .prc file hasn't changed.
Make sure you have the ChangesAssociations=Yes in the [Setup] section.

Resources