Shared Shortcuts/Icons - inno-setup

I have several inno setups with shared files. With the 'Sharedfile' flag a can make sure that the they only get uninstalled if they're no longer used.
However this is not working for shortcuts or icons as they are called in inno pointing to those files. shortcuts are always getting removed even if the target file is not getting uninstalled.
So is there something i'm missing? a flag for shortcuts?
or do you have some starting point on how to prevent this in code?
Thanks a lot

Thanks alot TLama this seems to be working:
I prevent my shard icons from being uninstalled with the 'uninsneveruninstall' flag.
Then in pascal, check if the file still exists if not manually delete the shortcut or folder:
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
if (not(FileExists(ExpandConstant('{app}\executable1.exe')))) then DelTree(ExpandConstant('{group}\myfolder'), True, True, True);
if (not(FileExists(ExpandConstant('{app}\executable2.exe')))) then DeleteFile(ExpandConstant('{group}\myShortcut.lnk');
end;
end;
Personally i think that inno setup should do this by default, checking if the installed shortcuts target is reference counted and use this value for the shortcut.
But anyhow thank you all very much and have a nice day.

Related

Change default option for restart (if it is needed)

In Inno Setup based installer, is there a way to change the default selection for the restart option shown on the Finish page if restart is needed ? Please note that I am not asking about how to make the installer never ask for a reboot.
Currently, the restart option shows up with "Yes, restart the computer now" as the default selection and some users of the installer have raised a concern that if they are in a haste, they end up clicking on "Finish" button, thus causing the restart to happen.
I see a similar question here.
Similarly, the restart message box shown on uninstalling comes up with default set to "Yes" button. Is there a way to change that too?
Just select the NoRadio instead of the default YesRadio:
procedure InitializeWizard();
begin
WizardForm.NoRadio.Checked := True;
end;
You cannot change, what button is focused by default on the restart prompt in uninstaller.

Inno Setup: Ask for reboot after uninstall

I would like to ask the user to reboot the system, after the application has been uninstalled.
By using AlwaysRestart=yes the user gets only asked after the installation, but the prompt doesn't appear afterwards.
I am using Inno Setup to solve this.
Thank you.
Use UninstallNeedRestart event function:
function UninstallNeedRestart(): Boolean;
begin
Result := True;
end;
It makes uninstaller ask for reboot at the end.
Note that you cannot combine this with the AlwaysRestart directive.

Change Inno Setup messages from Pascal code

I need to change ConfirmUninstall, UninstalledMost (just in case), and UninstalledAll specifically from script to set a condition. Something like this:
if FileExists(ExpandConstant('{app}\Slash.exe')) then
SetupMessage(msgConfirmUninstall) := FmtMessage(SetupMessage(msgConfirmUninstall), ['Dagon Slasher'])
else if FileExists(ExpandConstant('{app}\Frank.exe')) then
SetupMessage(msgConfirmUninstall) := FmtMessage(SetupMessage(msgConfirmUninstall), ['Dagon Frankenstein'])
else
SetupMessage(msgConfirmUninstall) := FmtMessage(SetupMessage(msgConfirmUninstall), ['Dagon Video Tools']);
But this doesn't work. These messages are used in MsgBoxes, so I can't think of any other way. Running in silent mode is not really suitable for me, since setup will run uninstall if the programs (or one of them) has already been installed, so I don't want the user to accidentally uninstall the program by running the setup.
You cannot change these easily, see:
Replace or customize modal uninstallation windows in Inno Setup
Regarding the silent uninstall solution: I do not understand your problem with "setup will run uninstall if the programs (or one of them) has already been installed".
I assume you run the uninstaller only after the user confirms (s)he wants to install the new version, so you actually want to run the uninstaller silently, right?
And anyway, there's nothing that prevents you from running the uninstaller non-silently from your installer, even if the entry in "Add/Remove programs" refers to "silent" installation.
You can use generic messages that covers all setup types:
[Messages]
ConfirmUninstall=Are you sure you want to completely remove this game?
As your uninstall messages depend on a type of the installed application, you can modify the installer to:
Create custom "type" page (like a menu) as the very first one.
Once the user selects the "type", restart the installer with a custom switch (e.g. /APPTYPE=slasher) and exit.
Once the installer is (re-)run with the /APPTYPE, you know from the beginning, what component/type you are installing and hence you can set the AppName accordingly (using a scripted constant).
Of course, you skip the custom "type" page.
This is actually not difficult to implement. The only drawback is that the setup window is "recreated" after the user selects the "type".
I've sketched this solution already in my answer to Inno Setup Change AppName based on component(s) selected.

Why does Inno Setup ignore DefaultDirName

Running Inno Setup 5.5.6. I corrected an error in my DefaultDirName value, but no matter what I do, the program continues to try to install in the old, erroneous location. Even when I set it to a value matching one of the examples:
DefaultDirName={pf}\My Program
the program continues to choose the old, incorrect path.
How do I get Inno to use the corrected DefaultDirName?
Even though the previous install went to the wrong destination directory, the install did complete. According to the documentation for DefaultDirName:
If UsePreviousAppDir is yes (the default) and Setup finds a previous
version of the same application is already installed, it will
substitute the default directory name with the directory selected
previously.
So my previous installation was overriding the new DefaultDirName. Once I uninstalled the program and re-ran the installer, it began using my corrected DefaultDirName.
Set the AppendDefaultDirName directive to no, e.g.:
[Setup]
...
AppendDefaultDirName=no
As the reference says (emphasized by me):
By default, when a folder in the dialog displayed by the Browse...
button on the Select Destination Location wizard page is clicked,
Setup automatically appends the last component of DefaultDirName onto
the new path.
For example, if DefaultDirName is {pf}\My Program and "Z:\" is clicked, the new path will become "Z:\My Program".
Setting this directive to no disables the aforementioned behavior. In
addition, it causes a Make New Folder button to appear on the dialog.

Prompting to install DirectX in an Inno installer

I am creating and installer for a game using Inno setup and I want to prompt the user and ask them if they want to install DirectX9 (I already have the full installation directx files in a subfolder) and then to install it for them if they say yes or no... I am not sure how to do this and have limited programming knowledge. Please help!
Use this code to show message box with question and Yes/No buttons:
// Ask the user a Yes/No question
if MsgBox('Are you sure?', mbConfirmation, MB_YESNO) = IDYES then
begin
// User clicked Yes
// Install the DirectX now... (see below)
end;
And this code to execute (launch) DXSETUP.exe
var
ResultCode: Integer;
// Launch DXSETUP and wait for it to terminate
Exec('DXSETUP.exe', '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
I think you need to pack your DirectX files into your installer and extract it to {tmp} directory - or you may run it from CD/DVD (as in example).
See this question for advanced DXSETUP: How to install DirectX redistributable from Inno-setup?
If you need to detect DX version check this: http://www.vincenzo.net/isxkb/index.php?title=DirectX_-_How_to_detect_DirectX_version
You can use a [Tasks] entry to display a checkbox on one of the wizard pages prompting them whether to install/upgrade DX or not (and you can choose whether you want this to be ticked or unticked by default).
For the actual installation, the simplest option is to use a [Run] entry with Tasks: parameter linked to the [Tasks] entry you created; but bear in mind that this will install after your game and you won't be able to catch any errors it might raise. (This is usually not a problem for this sort of thing though.)
The other option is to use the PrepareToInstall event function in [Code]; for this you will need to use ExtractTemporaryFile and Exec. This will install it before your game, and lets you check the exit code to handle errors and reboot requests if need be. See the example script included with Inno for more details, but this is probably more complex than you need for a DX install.
You will also need to decide whether you want to bundle the web-installer or the full-installer for DX. The former is smaller but will require Internet access at install time; the latter will make your installer larger but will not require Internet access. If you are installing from a DVD then the latter is the best option (and you could run it directly from {src} instead of bundling it in [Files] in that case).

Resources