wix ExitDialog Conditions - wix

I have a Custom Action that launches an app from the ExitDialog Dialog, if the user ticks the check box that is. At any rate, my app has three features and the option to launch this app should only appear if one of the features has been installed.
I have the following code:
<Publish Dialog="ExitDialog" Control="Finish" Event="DoAction" Value="RCTPI" >
<![CDATA[LAUNCHUPONEXIT AND &WindowsService=3 AND NOT INSTALLED]]>
</Publish>
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Launch Config Tool" > </Property>
I would have expected that the &WindowsService=3 meant that only if the WindowsService feature was selected to be installed, would the condition be met. However it appears regardless of what features are selected to be installed.
Any ideas?
TIA
YM

I suppose that by the moment ExitDialog is displayed, the referenced feature is already installed. Hence, you should probably use install state syntax instead of install action, i.e. !WindowsService=3. Never tried it myself though...

I've actually ended up doing an old fashioned custom action, I've spent enough time as it is on this.
<Custom Action="RCTPI" Before="InstallFinalize"><![CDATA[&WindowsService=3 and NOT INSTALLED]]></Custom>

Related

How to modify a feature installation in Wix with custom property

Wix newbie - but I expect that is apparent.
I am using a modified version of the WixUI FeatureTree extension for an application that basically just copies files to specific directories. The installation wants to copy or remove based on a checkbox selection.
I have a feature for each installation package. I'm creating properties for each option and using them as a condition for each feature, changing the feature level to 1 or 0.
<!--Features for REVIT v2020-->
<Feature Id="Product2020" Title="Performance Seating v2020" Level="1">
<Condition Level="1">
<![CDATA[REVIT2020SELECTED = "Selected"]]>
</Condition>
<Condition Level="0">
<![CDATA[REVIT2020SELECTED <> "Selected"]]>
</Condition>
<!--Reference to Components.wxs component list hard coded-->
<ComponentGroupRef Id="2020Components" />
</Feature>
In the UI, I set the state of the property at the checkbox.
<Control Id="cbRevit2020"
Type="CheckBox"
Property="REVIT2020SELECTED"
X="50"
Y="110"
Height="10"
Width="150"
CheckBoxValue="Selected"
Text="Revit 2020"/>
The installation runs as expected on first run - features are installed based on the checkbox selection. Uninstall also works fine. Modify, however, does nothing regardless of checkbox state. I haven't changed anything in the FeatureTree.wxs custom file other than referencing my custom CustomizeDlg file.
I found reference to the issue (I think) here - https://robmensching.com/blog/posts/2010/5/2/the-wix-toolsets-remember-property-pattern/ However, it's over 10 years old and seems overly complex for what I need to do.
Does someone have a better approach?
BTW - yes, I know this is solvable simply by using the FeatureTree element. This is purely a personal preference, as I'm not a fan of that user interface in this application.
Thank you for any assistance.
Issue solved after quite a bit of searching and am posting in case it helps anyone else.
This article describes my desire and offers a good description of what is going on. https://www.joyofsetup.com/2007/05/30/feature-conditions-and-ui/
I removed the condition from the feature and moved it into the dialog as a publish event under the Next button control.
<Control Id="Next" Type="PushButton" X="248" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)">
<Subscribe Event="SelectionNoItems" Attribute="Enabled" />
<Publish Event="AddLocal" Value="ALL">1</Publish>
<Publish Event="Remove" Value="PRODUCT2020">NOT REVIT2020SELECTED</Publish>
<Publish Event="Remove" Value="PRODUCT2021">NOT REVIT2021SELECTED</Publish>
<Publish Event="Remove" Value="PRODUCT2022">NOT REVIT2022SELECTED</Publish>
<Publish Event="Remove" Value="PRODUCTFAMILIES">NOT FAMILIESSELECTED</Publish>
I preset selections in the dialog based on install condition.
<SetProperty Id="REVIT2020SELECTED"
After="MigrateFeatureStates"
Value="Selected">
<![CDATA[REVIT2020INSTALLED AND (NOT Installed OR NOT !PRODUCT2020=2)]]>
</SetProperty>

How to display a list of features, in the WiX based installer, that are going to be installed?

I want to display a list of features that are going to be installed in the windows installer. This list will appear just before the user is about to install the product. I would like to know if there is a standard way to do this using WiX?
I tried to create a separate UI dialog just before the Verify Ready dialog which has a text control. The intention here is to display a text if a feature is being installed and hide that text if it is not being installed.
<Control Id="FeatureText" Type="Text" Text="SomeText">
<Condition Action="show">
<![CDATA[(&feature="3")]]>
</Condition>
<Condition Action="hide">
<![CDATA[(&feature="2")]]>
</Condition>
</Control>
the problem with this code is that the Action specified in the condition is not being performed.
After trying out a number of things I found that:
i- There is no need for quotes around the numbers and
ii- The controls can be set to hidden by default.
The following code is now working for me
<Control Id="FeatureText" Type="Text" Text="SomeText" Hidden="yes">
<Condition Action="show">
<![CDATA[(&feature=3)]]>
</Condition>
</Control>
but what I still don't know is, if this is the best/right way to do what I intend to do...

UPGRADINGPRODUCTCODE condition not working in wixui_install.wxs in library

UPGRADINGPRODUCTCODE condition not working in wixui_install.wxs in library
I want to change the value of next button to respective dlg if first time install and for major upgrade.
This is not working in wix library.
Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="PortNoDlg" >LicenseAccepted = "1" AND NOT UPGRADINGPRODUCTCODE
Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" >LicenseAccepted = "1" AND UPGRADINGPRODUCTCODE
UPGRADINGPRODUCTCODE is set only for the hidden uninstallation of a package found via the Upgrade table and FindRelatedProducts/RemoveExistingProducts. This does not show any UI, so conditioning control events off of this property will not be helpful.
By contrast UPGRADINGPRODUCTCODE is not set for the newer installation. If you want to condition your control events on whether a previous version will be uninstalled, you must reference the properties specified in the ActionProperty of each record in the Upgrade table.

Including modified FilesInUse dialog in WIX project

I have a modified FilesInUse dialog. Just including it in project and changing reference in UI does not help - I get "ICE20: Standard Dialog: 'FilesInUse' not found in Dialog table" error when building installation project.
Browsing the Net I've found one advice - to supress ICE validation for ICE20. Well, building the project with such settings works fine, and the msi also works fine, but I'm not sure that's a good solution to the problem.
Another advice was to modify FilesInUse and remove WixUIExtension from references, but as far as I know this way I'll end up with copying all the needed dialog files to my project. This I'd like to avoid.
So, what can be done to include my custom FilesInUse in WIX project correctly?
You could use a custom FilesInUse Dialog in the following manner:
<Fragment>
<UI>
<Dialog Id="FilesInUse" Width="370" Height="270" Title="Your product name">
<Control Id="Retry" Type="PushButton" X="304" Y ="243" Width="56" Height="17" Text="Retry" Default="yes" Cancel="yes">
<Publish Event="EndDialog" Value="Retry">1</Publish>
</Control>
<Control Id="Ignore" Type="PushButton" X="235" Y ="243" Width="56" Height="17" Text="Ignore">
<Publish Event="EndDialog" Value="Ignore">1</Publish>
</Control>
<Control Id="Exit" Type="PushButton" X="235" Y ="243" Width="56" Height="17" Text="Exit">
<Publish Event="EndDialog" Value="Exit">1</Publish>
</Control>
<Control Id ="InUseFiles" Type="ListBox" Width="300" Height="150" X="30" Y ="60" Property="FileInUseProcess" Sorted="yes" TabSkip="yes" />
</Dialog>
</UI>
</Fragment>
You just have to reference this Dialog into your Custom InstallDialog with the tag
<DialogRef Id="FilesInUse" />
All the tags mentioned are part of the ICE20 Dialog Requierements
Hope this helps. Have a nice day.
OK, I just spent some time trying to figure out how to solve this problem.
Though there are some good references in suggested thread, I think the FilesInUse dialog is a bit more specific to customize, so I decided to write a more concrete solution to the problem.
See, the problem is that MSI uses the FilesInUse dialog automatically, so if you try to change it somehow, you get errors such as FilesInUse not existing in Dialog table or duplicate FilesInUse dialog in table if you are referencing your custom dialog from other files.
The solution I found working was not to use DialogRef to Wix's FilesInUse dialog at all, but to make my custom dialog in main UI file (Where I would normally put DialogRef to FilesInUse) and name it FilesInUse.
Hope this helps other people having the same problem.
One more wrinkle is that the custom FilesInUse dialog will not be displayed when clicking Uninstall in Programs and Features since the uninstall is run with UILevel 3, so only the built-in FilesInUse will be displayed.
To work around that include this in your product.wxs:
<Property Id="ARPNOREMOVE" Value="1" />
Then when users press the Change (or Modify) button in Programs and Features, the Maintenance dialog will have a Remove button they can use to uninstall, and that will show custom dialogs. Products like Visual Studio only have a Change/Modify button.
One more thing is that Apps and Features (Windows 10) will disable the Modify button if the Uninstall key doesn't have a ModifyPath setting. It should be set to
MsiExec.exe /I{<yourproductcode>}
Your bootstrapper will need to do this. Not sure if the MSI can set it.
If building on the command line: light.exe -sice:ICE20...
If working in Visual Studio: Right click your setup project, select "Properties", Select "Tool settings" on left side of screen, Add "ICE20" to the "Suppress Specific ICE validation:" edit box.
See the related question and answers here: WiX replace dialog
User Yan Sklyarenko answered on Mar 25 '11:
Couple of articles to help you:
WiX
Tutorial
Neil Sleightholm's
article
You should find all the info you need for your case there.
User Bob Arnson answered on Mar 25 '11:
See "Changing the UI sequence of a built-in dialog set" in the topic
"Customizing Built-in WixUI Dialog Sets" in WiX.chm.

What does EndDialog do?

I have a WIX installer and I am trying to work out what this line is actually doing (attached to the next button on my WIX dialog).
<Publish Event="EndDialog" Value="Return" >1</Publish>
It seems to me that this line means we are handing control back to the installer after showing our custom dialogs. But how does it then know which dialog to display next. It should in my case be showing the dialog indicating installation progress, but it jumps to the wrong dialog.
If I change it to this (ProgressDlg is the dialog showing installation progress in the WixUI_Minimal UI set which is the one I actually want to jump to),
<Publish Event="NewDialog" Value="ProgressDlg" >1</Publish>
It throws an error when I try to install
OK, I seem to have stumbled across something that now works, but I don't really understand why. Comments would be appreciated.
I have this dialog sequence,
WelcomeEulaDlg (part of WixUI_Minimal)
CustomInstall
StartAutomaticallyUI
IC3DatabaseSelection
GSDatabaseSelectionUI
ProgressDlg (part of WixUI_Minimal)
So basically I have created 4 dialogs that come between the EULA and installation progress dialog.
I had those dialogs inside an InstallUISequence block so that using orca would show those dialogs within the InstallUISequence table.
This seemed to be my issue. As soon as I removed the dialogs from the block and only had the first dialog in the block (which is CustomInstall) it worked fine.
Now it looks like this, whereas before that table had all the other dialogs
<InstallUISequence>
<Show Dialog="CustomInstall" After="WelcomeEulaDlg" >NOT Installed</Show>
</InstallUISequence>
The way I link those dialogs together and made them all included was just by linking the next and back buttons together. They didn't need to be in the InstallUISequence.
I got this idea from using the WixAware demo and creating a project in there.