Inno Setup remove specific reg key after uninstall - inno-setup

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.

Related

Unpack SFX file using Inno Setup

I'm trying to run Inno Setup to automatically extract my SFX file without having to run extract manually. Is there any way? I leave my script below.
Is there also a way to make Inno Setup extract the SFX in the Myprogramfolder created by the installer?
I have compressed the SFX file using Winrar.
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "Program2019"
#define MyAppVersion "1.0"
#define MyAppPublisher "Myappname."
#define MyAppURL "/"
[Setup]
WizardImageFile=C:\Users\Administrator\Desktop\Cover.bmp
; NOTE: The value of AppId uniquely identifies this application.
AppID={{31D336CF-0483-4A76-00000000000000000}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\Myprogram2019
DefaultGroupName={#MyAppName}
LicenseFile=C:\Users\Administrator\Desktop\Program2019\readme.txt
OutputDir=C:\Users\Administrator\Desktop\Program2019\Myprografolder
OutputBaseFilename=setup
SetupIconFile=C:\Users\Administrator\Desktop\Program2019\Myprogram\icon.ico
Compression=none
SolidCompression=true
InternalCompressLevel=Fast
[Languages]
Name: "english"; MessagesFile: "compiler:Languages\English.isl"
Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl"
[Files]
Source: "C:\Program Files (x86)\Myprogramfolder\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Users\Administrator\Desktop\Program2019\Unpack\Evilpack.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall
Source: "C:\Users\Administrator\Desktop\Program2019\languages\spanish\*"; DestDir: "{app}\game"; Languages: spanish; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Run]
Filename: "{tmp}\Evilpack.exe"; Parameters: "{tmp}\ZipFile.ZIP -d C:\TargetDir"
[Icons]
Name: "{group}\{cm:ProgramOnTheWeb,{#MyAppName}}"; Filename: "{#MyAppURL}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\Myprogram2019"; Filename: "{app}\mypro.exe"; IconFilename: {app}\icon.ico; \
AfterInstall: SetElevationBit('{commondesktop}\Myprogram.lnk')
[Code]
{ RedesignWizardFormBegin } // Don't remove this line!
// Don't modify this section. It is generated automatically.
procedure RedesignWizardForm;
begin
{ ReservationBegin }
// This part is for you. Add your specialized code here.
{ ReservationEnd }
end;
[Messages]
BeveledLabel=Myapp
Is very easy unpack in silent way SFX, setup to silent from the menu option ADVANCED, then SFX options in winrar.
That is all!!
Finally
[Files]
Source: "C:\pathtofile\yoursfx.exe"; DestDir: "C:\Program Files\";Flags: ignoreversion
[Run]
Filename: "C:\Program Files\yoursfx.exe"; StatusMsg: "Your MSG"; Flags: runascurrentuser
[Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssDone then
begin;
DeleteFile(ExpandConstant('C:\Program Files\yoursfx.exe'));
begin
// user clicked Yes
end;
end;
end;

Ready to Install wizard page looks empty

These are the wizard pages of my Inno Setup installer:
Window 1:
Window 2:
Window 3:
Window 4:
Window 5:
My issue is with wizard page 4. It seems odd having this page look like that.
Is this standard behaviour?
Should something be displayed to the user?
Suppress this page?
This is my script:
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
[ISPP]
; Please, don't edit this section manually if you don't know what are you doing.
#define Skin "Metallics.cjstyles"
#define ThisYear GetDateTimeString('yyyy', '', '');
#define VR "VisitsRota"
#define SourceDir "..\Release"
#define DataDir "{userappdata}\" + VR
#define CommonDataDir "{commonappdata}\" + VR
#define AppURL "http://www.publictalksoftware.co.uk"
#define AppPublisher "Andrew Truckle"
#define AppVerText() \
ParseVersion(SourceDir + '\VisitsRota.exe', \
Local[0], Local[1], Local[2], Local[3]), \
Str(Local[0]) + "." + Str(Local[1]) + "." + Str(Local[2])
; SignTool parameters
#define SignedDesc "$q" + VR + "$q"
#define SignedPfx "$qd:\My Certificate\2018\My Certificate.pfx$q"
#define SignedTimeStamp "$qhttp://timestamp.verisign.com/scripts/timestamp.dll$q"
#define SignedPw "$q~~~~~~$q"
#define LANG_ENG "0"
#define LANG_ESP "1"
#define LANG_ITA "2"
#define LANG_PTB "3"
#define LANG_SVE "4"
#define LANG_FRA "5"
#define LANG_FIN "6"
#define LANG_PLK "7"
#define LANG_DAN "8"
#define LANG_NLD "9"
#define LANG_UKR "10"
#define LANG_DEU "11"
#define LANG_AFK "12"
#define LANG_RUS "13"
#define LANG_CSY "14"
#define LANG_SQI "15"
#define LANG_TRK "16"
#define LANG_ELL "17"
#define LANG_HUN "18"
[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={{ECBAEED1-C909-4CF6-B94D-9AF095ACF2E1}
AppName={#VR}
AppPublisher={#AppPublisher}
AppPublisherURL={#AppURL}
AppSupportURL={#AppURL}
AppUpdatesURL={#AppURL}
AppVersion={#AppVerText}
VersionInfoVersion={#AppVerText}
VersionInfoCompany={#AppPublisher}
VersionInfoDescription={#VR}
VersionInfoTextVersion={#AppVerText}
VersionInfoCopyright={#AppPublisher} © 2008 - {#ThisYear}
DefaultDirName={pf}\{#VR}
DefaultGroupName={#VR}
OutputBaseFilename=VisitsRotaSetup
Compression=lzma
SolidCompression=yes
AppMutex={{1D942130-98DF-4F52-8F6E-A68E3D4FC57E}
WizardImageFile=Images\vr???x???.bmp
WizardSmallImageFile=Images\vricon*.bmp
MinVersion=0,5.0
AppCopyright={#AppPublisher} © 2003 - {#ThisYear}
SignTool=SignTool /d {#SignedDesc} /du $q{#AppURL}$q /f {#SignedPfx} /p {#SignedPw} /t {#SignedTimeStamp} /v $f
SignedUninstaller=yes
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; MinVersion: 4,4
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; MinVersion: 4,4; Flags: unchecked
[Languages]
Name: "English"; MessagesFile: "compiler:Default.isl"; LicenseFile: ".\License\LicenseENG.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "Spanish"; MessagesFile: "compiler:Languages\Spanish.isl"; LicenseFile: ".\License\LicenseESP.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "Italian"; MessagesFile: "compiler:Languages\Italian.isl"; LicenseFile: ".\License\LicenseITA.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "PortugueseBrazil"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl"; LicenseFile: ".\License\LicensePTB.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "Swedish"; MessagesFile: "compiler:Languages\Swedish.isl"; LicenseFile: ".\License\LicenseSVE.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "French"; MessagesFile: "compiler:Languages\French.isl"; LicenseFile: ".\License\LicenseFRA.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "Finnish"; MessagesFile: "compiler:Languages\Finnish.isl"; LicenseFile: ".\License\LicenseFIN.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "Polish"; MessagesFile: "compiler:Languages\Polish.isl"; LicenseFile: ".\License\LicensePLK.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "Danish"; MessagesFile: "compiler:Languages\Danish.isl"; LicenseFile: ".\License\LicenseDAN.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "Dutch"; MessagesFile: "compiler:Languages\Dutch.isl"; LicenseFile: ".\License\LicenseNLD.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "Ukrainian"; MessagesFile: "compiler:Languages\Ukrainian.isl"; LicenseFile: ".\License\LicenseUKR.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "German"; MessagesFile: "compiler:Languages\German.isl"; LicenseFile: ".\License\LicenseDEU.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "Afrikaans"; MessagesFile: "compiler:Languages\Afrikaans.isl"; LicenseFile: ".\License\LicenseAFK.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "Russian"; MessagesFile: "compiler:Languages\Russian.isl"; LicenseFile: ".\License\LicenseRUS.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "Czech"; MessagesFile: "compiler:Languages\Czech.isl"; LicenseFile: ".\License\LicenseCSY.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "Albanian"; MessagesFile: "compiler:Languages\Albanian.isl"; LicenseFile: ".\License\LicenseSQI.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "Turkish"; MessagesFile: "compiler:Languages\Turkish.isl"; LicenseFile: ".\License\LicenseTRK.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "Greek"; MessagesFile: "compiler:Languages\Greek.isl"; LicenseFile: ".\License\LicenseENG.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
Name: "Hungarian"; MessagesFile: "compiler:Languages\Hungarian.isl"; LicenseFile: ".\License\LicenseHUN.rtf"; InfoBeforeFile: "RevisionHistory.rtf"
[Files]
Source: "..\Release\VisitsRota.exe"; DestDir: "{app}"; Flags: ignoreversion sign
Source: "..\x64\Release\VisitsRota.exe"; DestDir: "{app}"; DestName: "VisitsRota_x64.exe"; Flags: ignoreversion sign
Source: "..\HelpNDoc\CHM\VisitsRota.chm"; DestDir: {app}; Flags: ignoreversion
Source: "..\Release\VisitsRotaESP.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaITA.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaPTB.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaSVE.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaFRA.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaFIN.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaPLK.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaDAN.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaNLD.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaUKR.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaDEU.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaAFK.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaRUS.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaCSY.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaSQI.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaTRK.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaELL.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "..\Release\VisitsRotaHUN.dll"; DestDir: "{app}"; Flags: overwritereadonly ignoreversion
Source: "Styles\ElderlyInfirm-Schedule-v1.css"; DestDir: "{#CommonDataDir}"; Flags: overwritereadonly ignoreversion uninsremovereadonly touch; Attribs: readonly
Source: "Styles\ElderlyInfirm-Schedule-v1.xsl"; DestDir: "{#CommonDataDir}"; Flags: overwritereadonly ignoreversion uninsremovereadonly touch; Attribs: readonly
Source: "Styles\Shepherd-Schedule-v1.css"; DestDir: "{#CommonDataDir}"; Flags: overwritereadonly ignoreversion uninsremovereadonly touch; Attribs: readonly
Source: "Styles\Shepherd-Schedule-v1.xsl"; DestDir: "{#CommonDataDir}"; Flags: overwritereadonly ignoreversion uninsremovereadonly touch; Attribs: readonly
; Add the ISSkin DLL used for skinning Inno Setup installations.
Source: ISSkinU.dll; DestDir: {app}; Flags: dontcopy
; Add the Visual Style resource contains resources used for skinning,
; you can also use Microsoft Visual Styles (*.msstyles) resources.
Source: Skins\{#Skin}; DestDir: {tmp}; Flags: dontcopy
[Icons]
Name: {group}\{#VR}; Filename: {app}\VisitsRota.exe
Name: {group}\{#VR} (64 bit); Filename: {app}\VisitsRota_x64.exe;
Name: "{userdesktop}\{#VR}"; Filename: {app}\VisitsRota.exe; Tasks: desktopicon;
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#VR}"; Filename: {app}\VisitsRota.exe; MinVersion: 4,4; Tasks: quicklaunchicon;
; Name: {group}\VisitsRota Help; Filename: {app}\VisitsRota.chm; WorkingDir: {app}; IconFilename: {win}\hh.exe; IconIndex: 0
; Name: {group}\VisitsRota Help (Suomi); Filename: {app}\VisitsRotaFIN.chm; WorkingDir: {app}; IconFilename: {win}\hh.exe; IconIndex: 0
[Run]
Filename: "{app}\VisitsRota.exe"; Description: {cm:LaunchProgram,VisitsRota}; Flags: nowait postinstall skipifsilent runasoriginaluser
Filename: "{app}\VisitsRota_x64.exe"; Flags: nowait postinstall runasoriginaluser unchecked skipifsilent; Description: "{cm:LaunchProgram,VisitsRota (64 bit)}"; Check: IsWin64
[Registry]
Root: "HKLM"; Subkey: "Software\TruckleSoft\VisitsRota"; ValueType: string; ValueName: "AppPath"; ValueData: "{app}\VisitsRota.exe"
Root: "HKLM64"; Subkey: "Software\TruckleSoft\VisitsRota"; ValueType: string; ValueName: "AppPath"; ValueData: "{app}\VisitsRota_x64.exe"; Check: IsWin64
; Language value is based on the language that the user has installed with
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_ENG}; Languages: English; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_ESP}; Languages: Spanish; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_ITA}; Languages: Italian; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_PTB}; Languages: PortugueseBrazil; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_SVE}; Languages: Swedish; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_FRA}; Languages: French; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_FIN}; Languages: Finnish; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_PLK}; Languages: Polish; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_DAN}; Languages: Danish; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_NLD}; Languages: Dutch; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_UKR}; Languages: Ukrainian; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_DEU}; Languages: German; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_AFK}; Languages: Afrikaans; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_RUS}; Languages: Russian; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_CSY}; Languages: Czech; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_SQI}; Languages: Albanian; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_TRK}; Languages: Turkish; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_ELL}; Languages: Greek; Flags: uninsdeletevalue
Root: HKLM; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_HUN}; Languages: Hungarian; Flags: uninsdeletevalue
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_ENG}; Languages: English; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_ESP}; Languages: Spanish; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_ITA}; Languages: Italian; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_PTB}; Languages: PortugueseBrazil; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_SVE}; Languages: Swedish; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_FRA}; Languages: French; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_FIN}; Languages: Finnish; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_PLK}; Languages: Polish; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_DAN}; Languages: Danish; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_NLD}; Languages: Dutch; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_UKR}; Languages: Ukrainian; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_DEU}; Languages: German; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_AFK}; Languages: Afrikaans; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_RUS}; Languages: Russian; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_CSY}; Languages: Czech; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_SQI}; Languages: Albanian; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_TRK}; Languages: Turkish; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_ELL}; Languages: Greek; Flags: uninsdeletevalue; Check: IsWin64
Root: HKLM64; Subkey: Software\TruckleSoft\VisitsRota; ValueType: dword; ValueName: Language; ValueData: {#LANG_HUN}; Languages: Hungarian; Flags: uninsdeletevalue; Check: IsWin64
[Dirs]
Name: "{#DataDir}"; Flags: uninsalwaysuninstall
[InstallDelete]
Type: files; Name: "{app}\VisitsRotaENU.dll"
[Code]
program Setup;
// global variables
var
bIsUpgrading: Boolean;
// Importing LoadSkin API from ISSkinU.DLL
procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin#files:isskinU.dll stdcall';
// Importing UnloadSkin API from ISSkinU.DLL
procedure UnloadSkin();
external 'UnloadSkin#files:isskinU.dll stdcall';
// Importing ShowWindow Windows API from User32.DLL
function ShowWindow(hWnd: Integer; uType: Integer): Integer;
external 'ShowWindow#user32.dll stdcall';
// Returns the path where the program was last installed
function GetPathInstalled( AppID: String ): String;
var
sPrevPath: String;
begin
sPrevPath := '';
if not RegQueryStringValue( HKLM,
'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+AppID+'_is1',
'Inno Setup: App Path', sPrevpath) then
RegQueryStringValue( HKCU, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+AppID+'_is1' ,
'Inno Setup: App Path', sPrevpath);
Result := sPrevPath;
end;
// Returns True if we are performing an upgrade
function IsUpgrading(): Boolean;
var
sPrevPath: String;
begin
sPrevPath := GetPathInstalled('{~~~~~}');
if (Length(sPrevPath) > 0) and (FileExists(sPrevPath + '\VisitsRota.exe' )) then
Result := True
else
Result := False;
end;
function MakeVersion(Major, Minor, Build: Cardinal): Cardinal;
begin
Result := (Major shl 24) + (Minor shl 16) + Build;
end;
// Called just before setup is about to start
function InitializeSetup(): Boolean;
var
WindowsVersion: Cardinal;
begin
Result := True;
ExtractTemporaryFile('{#Skin}');
LoadSkin(ExpandConstant('{tmp}\{#Skin}'), '');
// Are we performing an upgrade?
bIsUpgrading := IsUpgrading();
// Check Windows Version
WindowsVersion := GetWindowsVersion;
Log(Format('Windows Version: %x', [WindowsVersion]));
// Windows must be Win 7 SP1 (6.1.7601), Win 8.1 (6.3.9200) or higher, eg: Win 10 (10.0.10240)
// See: http://www.jrsoftware.org/ishelp/index.php?topic=winvernotes
// Microsoft .Net Framework 4.6.2 will only work with these operating systems.
if (WindowsVersion < MakeVersion(6, 1, 7601)) or
((WindowsVersion >= MakeVersion(6, 2, 0)) and (WindowsVersion < MakeVersion(6, 3, 0))) then
begin
MsgBox(SetupMessage(msgWindowsVersionNotSupported), mbError, MB_OK);
Result := False;
end;
end;
type
TRunEntry = record
Caption: string;
Checked: Boolean;
Object: TObject;
end;
procedure RebuildRunList;
var
RunEntries: array of TRunEntry;
I: Integer;
begin
// Save run list ...
SetArrayLength(RunEntries, WizardForm.RunList.Items.Count);
for I := 0 to WizardForm.RunList.Items.Count - 1 do
begin
RunEntries[I].Caption := WizardForm.RunList.ItemCaption[I];
RunEntries[I].Checked := WizardForm.RunList.Checked[I];
RunEntries[I].Object := WizardForm.RunList.ItemObject[I];
end;
// ... clear it ...
WizardForm.RunList.Items.Clear;
// ... and re-create
for I := 0 to GetArrayLength(RunEntries) - 1 do
begin
// the first three entries are radio buttons
if (I = 0) or (I = 1) or (I = 2) then
begin
WizardForm.RunList.AddRadioButton(
RunEntries[I].Caption, '', 0, RunEntries[I].Checked, True, RunEntries[I].Object);
end
else
begin
WizardForm.RunList.AddCheckBox(
RunEntries[I].Caption, '', 0, RunEntries[I].Checked, True, True, True,
RunEntries[I].Object);
end;
end;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpFinished then
begin
// Only now is the RunList populated.
// Two entries are on 64-bit systems only.
if IsWin64 then RebuildRunList;
end;
end;
procedure DeinitializeSetup();
begin
// Hide Window before unloading skin so user does not get
// a glimpse of an unskinned window before it is closed.
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin();
end;
Update
If I uninstall the program and try to install, then wizard 4 looks better:
I get it - doh! When I am "upgrading" and I don't tick the tasks, then there is nothing to show on the "Ready to Install" page. If I check one of the options then something will be displayed. At least I know what was happening now.
Yes, when there's nothing to show on the changes list, the list is hidden.
You can force displaying something, for example by:
AlwaysShowDirOnReadyPage or AlwaysShowGroupOnReadyPage directives.
[Setup]
AlwaysShowDirOnReadyPage=yes
AlwaysShowGroupOnReadyPage=yes
Using UpdateReadyMemo event function:
[Code]
procedure AppendReadyMemo(var Memo: string; NewLine: string; S: string);
begin
if S <> '' then
begin
if Memo <> '' then Memo := Memo + NewLine + NewLine;
Memo := Memo + S;
end;
end;
function UpdateReadyMemo(
Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo,
MemoGroupInfo, MemoTasksInfo: String): String;
begin
{ This is what Inno Setup would do without UpdateReadyMemo }
AppendReadyMemo(Result, NewLine, MemoUserInfoInfo);
AppendReadyMemo(Result, NewLine, MemoDirInfo);
AppendReadyMemo(Result, NewLine, MemoTypeInfo);
AppendReadyMemo(Result, NewLine, MemoComponentsInfo);
AppendReadyMemo(Result, NewLine, MemoGroupInfo);
AppendReadyMemo(Result, NewLine, MemoTasksInfo);
if Result = '' then
begin
Result := 'Keeping settings from previous installations';
end;
end;

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.

Invalid prototype when using a Check function

I'm new to InnoSetup as I am experimenting with various installers.
I created my first script using Inno Script Studio and the built in wizards. So far so good. Now I want to get it to detect if .Net 4.5 is installed and if it isn't then install it. So, I looked all over the web and on here and I came across this solution, however when I copy and paste the code into my script I get the following error when compiling.
Compiling [Code] section
Compiler Error!
Line 54: Column 10: Invalid prototype for 'IsDotNetDetected'
and Line 54 in my script is this
function IsDotNetDetected(version: string; service: cardinal): boolean;
anyone know what the error means and why I am getting it?
Here's my full script:
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "AVO Log"
#define MyAppVersion "0.1.0.1"
#define MyAppPublisher "NA"
#define MyAppExeName "AVO Log.exe"
[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={{9476587F-A670-4E17-B8EA-A6FABB345968}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
[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]
Source: "G:\Common\Gareths Apps\dotNetFx45_Full_x86_x64.exe"; DestDir: {tmp}; Flags: deleteafterinstall;
Source: "C:\Visual Studio 2010\Projects\AVO Log\AVO Log\bin\Release\AVO Log.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Visual Studio 2010\Projects\AVO Log\AVO Log\bin\Release\GalaSoft.MvvmLight.Extras.WPF45.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Visual Studio 2010\Projects\AVO Log\AVO Log\bin\Release\GalaSoft.MvvmLight.WPF45.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Visual Studio 2010\Projects\AVO Log\AVO Log\bin\Release\GalaSoft.MvvmLight.WPF45.xml"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Visual Studio 2010\Projects\AVO Log\AVO Log\bin\Release\Microsoft.Expression.Interactions.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Visual Studio 2010\Projects\AVO Log\AVO Log\bin\Release\Microsoft.Practices.ServiceLocation.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Visual Studio 2010\Projects\AVO Log\AVO Log\bin\Release\System.Windows.Interactivity.dll"; DestDir: "{app}"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon
[Run]
Filename: "{tmp}\dotNetFx45_Full_x86_x64.exe"; Check: IsDotNetDetected('v4.5',0)
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
[Code]
function IsDotNetDetected(version: string; service: cardinal): boolean;
// Indicates whether the specified version and service pack of the .NET Framework is installed.
//
// version -- Specify one of these strings for the required .NET Framework version:
// 'v1.1.4322' .NET Framework 1.1
// 'v2.0.50727' .NET Framework 2.0
// 'v3.0' .NET Framework 3.0
// 'v3.5' .NET Framework 3.5
// 'v4\Client' .NET Framework 4.0 Client Profile
// 'v4\Full' .NET Framework 4.0 Full Installation
// 'v4.5' .NET Framework 4.5
//
// service -- Specify any non-negative integer for the required service pack level:
// 0 No service packs required
// 1, 2, etc. Service pack 1, 2, etc. required
var
key: string;
install, release, serviceCount: cardinal;
check45, success: boolean;
begin
// .NET 4.5 installs as update to .NET 4.0 Full
if version = 'v4.5' then begin
version := 'v4\Full';
check45 := true;
end else
check45 := false;
// installation key group for all .NET versions
key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + version;
// .NET 3.0 uses value InstallSuccess in subkey Setup
if Pos('v3.0', version) = 1 then begin
success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install);
end else begin
success := RegQueryDWordValue(HKLM, key, 'Install', install);
end;
// .NET 4.0/4.5 uses value Servicing instead of SP
if Pos('v4', version) = 1 then begin
success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount);
end else begin
success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount);
end;
// .NET 4.5 uses additional value Release
if check45 then begin
success := success and RegQueryDWordValue(HKLM, key, 'Release', release);
success := success and (release >= 378389);
end;
result := success and (install = 1) and (serviceCount >= service);
end;
My psychic powers tell me that you're trying to use this function as a check: parameter. As functions used with check: parameters must have a specific prototype, the compiler is failing.
Try using this stub function:
function CheckIsDotNetDetected(): boolean;
begin
result := IsDotNetDetected('v4\Client', 0);
end;
Example of check for .Net 4 for 32bit systems
function NET4032(): Boolean;
var
InstallCheck : Cardinal;
begin
RegQueryDWordValue(HKLM32, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full',
'Install', InstallCheck);
if InstallCheck = $1 then
Result := false
else
Result := true;
end;

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,.

Resources