New dialog in WiX, clicking Back skips the dialog - wix

I'm newbie in WiX and trying to customize dialog queue by adding the new one. The new dialog's name is ServerChoice and the flow is:
SetupTypeDlg <-> Full or Typical <-> ServerChoice <-> VerifyReadyDlg
or
SetupTypeDlg <-> Custom <-> CustomizeDlg <-> ServerChoice <-> VerifyReadyDlg
The only problem is in the first case at VerifyReadyDlg. 'Back' takes me to SetupTypeDlg and skips ServerChoice although in the second flow it works as required.
Source:
<UI>
<DialogRef Id="ServerChoice" />
<Publish Dialog="SetupTypeDlg" Control="TypicalButton" Event="NewDialog" Value="ServerChoice">1</Publish>
<Publish Dialog="SetupTypeDlg" Control="CompleteButton" Event="NewDialog" Value="ServerChoice">1</Publish>
<Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="ServerChoice">1</Publish>
<Publish Dialog="ServerChoice" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="ServerChoice">1</Publish>
<Publish Dialog="ServerChoice" Control="Back" Event="NewDialog" Value="CustomizeDlg" Order="1">WixUI_InstallMode = "InstallCustom"</Publish>
<Publish Dialog="ServerChoice" Control="Back" Event="NewDialog" Value="SetupTypeDlg" Order="2">WixUI_InstallMode = "InstallTypical" OR WixUI_InstallMode = "InstallComplete"</Publish>
<Publish Dialog="ServerChoice" Control="Back" Event="NewDialog" Value="CustomizeDlg" Order="3">WixUI_InstallMode = "Change"</Publish>
<Publish Dialog="ServerChoice" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="4">WixUI_InstallMode = "Repair" OR WixUI_InstallMode = "Remove"</Publish>
</UI>
Some help for a newbie? :)

What type of UI are you referencing (Mondo?). This information is not present in your piece of code. I think daddyman's comment is right, you probably have multiple events for that Back button, since Mondo itself hooks its own 'handlers' on this button-click event.
I have created a custom UI dialog flow recently and my approach was not referencing WiXUI_Mondo at all. Instead of it, I created my own new UI based on Mondo source code (you have to check WiX sources). At the end I have this code (irrelevant code parts have been removed) and it works fine.
<Fragment>
<!-- this is based on the WixUI_Mondo dialog set -->
<UI Id="WixUI_MyNewUI">
<TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
<TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
<TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
<Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
<Property Id="WixUI_Mode" Value="Mondo" />
<DialogRef Id="ErrorDlg" />
<DialogRef Id="FatalError" />
<DialogRef Id="FilesInUse" />
<DialogRef Id="MsiRMFilesInUse" />
<DialogRef Id="PrepareDlg" />
<DialogRef Id="ProgressDlg" />
<DialogRef Id="ResumeDlg" />
<DialogRef Id="UserExit" />
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="CustomizeDlg">1</Publish>
<!-- we do not use the SetupTypeDlg which allows user to choose either Typical, Complete or Custom installation; this ensures InstallCustom schema is run -->
<Publish Dialog="WelcomeDlg" Control="Next" Property="WixUI_InstallMode" Value="InstallCustom" Order="2">1</Publish>
<Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">WixUI_InstallMode = "InstallCustom"</Publish>
<Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="MyDlg1">1</Publish>
<Publish Dialog="MyDlg1" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="1">MY_CONDITION_PROPERTY = 0</Publish>
<Publish Dialog="MyDlg1" Control="Next" Event="NewDialog" Value="MyDlg2" Order="2">MY_CONDITION_PROPERTY = 1</Publish>
<Publish Dialog="MyDlg2" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="1" />
<Publish Dialog="MyDlg2" Control="Back" Event="NewDialog" Value="MyDlg1">1</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MyDlg1" Order="1">WixUI_InstallMode = "InstallCustom" and MY_CONDITION_PROPERTY = 0</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MyDlg2" Order="2">WixUI_InstallMode = "InstallCustom" and MY_CONDITION_PROPERTY = 1</Publish>
</UI>
<UIRef Id="WixUI_Common" />
<UIRef Id="WixUI_ErrorProgressText" />
</Fragment>

I think from your fragment that you are trying to do it in a just UI section and I don't believe that is possible. Take a look here http://neilsleightholm.blogspot.com/2008/08/customised-uis-for-wix.html I think it should help.

Related

Wix Custom Dialog Error : ICE03: Not a valid foreign key Visual Studio 2019

I want to customize the sequence wix installer by having a custom dialog where I can process an input from a user before proceeding into the installation
I use the
<UI Id="WixUI_Minimal">
<TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
<TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
<TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
<Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
<Property Id="WixUI_Mode" Value="Minimal" />
<!--Define all needed dialogs-->
<DialogRef Id="ErrorDlg" />
<DialogRef Id="FatalError" />
<DialogRef Id="FilesInUse" />
<DialogRef Id="MsiRMFilesInUse" />
<DialogRef Id="PrepareDlg" />
<DialogRef Id="ProgressDlg" />
<DialogRef Id="ResumeDlg" />
<DialogRef Id="UserExit" />
<DialogRef Id="WelcomeDlg" />
<DialogRef Id="UserRegDialog" />
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="UserRegDialog">1</Publish>
<Publish Dialog="UserRegDialog" Control="" Event="NewDialog" Value="PrepareDlg">1</Publish>
<Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">2</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg" Order="2">2</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg" Order="2">2</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg" Order="2">2</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">2</Publish>
<Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">2</Publish>
<Property Id="ARPNOMODIFY" Value="1" />
</UI>
My customization is in the part :
where UserRegDialog is my custom dialog
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="UserRegDialog">1</Publish>
<Publish Dialog="UserRegDialog" Control="" Event="NewDialog" Value="PrepareDlg">1</Publish>
but when I build the setup, i'm encountering an issue saying:
ICE03: Not a valid foreign key; Table: ControlEvent, Column: Control_, Key(s): UserRegDialog.Next.NewDialog.PrepareDlg.
ICE & ICE3: ICE03 in general explained with an example here.
Referential Integrity: You have left out the Control field for UserRegDialog empty. Why did you do this? This will indeed likely cause ICE03 as this constitutes a broken foreign key into the ControlEvent table (as you will see it has foreign keys into the Dialog and Control tables).
Dialog Sequence: Here is an example on customizing WiX dialog sequence. Have a look to see if it clarifies things. Here is a sample on custom WiX dialogs.

How to fix my msi VerifyReadyDlg install button

My msi "install" button in the VerifyReadyDlg returns WelcomeDlg.
Wix toolset 3.11
I made a msi installer which contains several customized UI windows based on WixUI_FeatureTree for customizing WelcomeDlg (including reading registry and showing its status in next dialog).
CustomizedWelcomeDlg
CheckLicenseKeyAndWebsiteDlg
CustomizedLicenseAgreementDlg
VerifyReadyDlg
When I push "install" button on VerifyReadyDlg(not customized), not starting ExecuteSequence but WelcomeDlg (not customized) appears.
How to fix this? Or should I customize VerifyReadyDlg, too?
Perhaps Orca can be used for such "broken" msi UI sequence problem, would you teach me how to troubleshoot seeking its cause?
UI sequence is below.
1
<!--<Publish Dialog="CustomizedWelcomeDlg" Control="Next" Event="NewDialog" Value="CheckLicenseKeyAndWebsiteDlg">
NOT Installed
</Publish>
<Publish Dialog="CustomizedWelcomeDlg" Control="Next" Event="NewDialog" Value="CheckLicenseKeyAndWebsiteDlg">
Installed AND PATCH
</Publish>-->
<Publish Dialog="CheckLicenseKeyAndWebsiteDlg" Control="Next" Event="NewDialog" Value="SetPhysicalPathDlg">
EVALUATIONFLG = 0
</Publish>
<Publish Dialog="CheckLicenseKeyAndWebsiteDlg" Control="Next" Event="NewDialog" Value="CustomizedLicenseAgreementDlg">
EVALUATIONFLG = 1
</Publish>
<Publish Dialog="CustomizedLicenseAgreementDlg" Control="Next" Event="NewDialog" Value="SetPhysicalPathDlg">
CUSTOMIZEDLICENSEACCEPTED = 1
</Publish>
<Publish Dialog="SetPhysicalPathDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">
1
</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="SetPhysicalPathDlg" Order="2">
1
</Publish>
<Publish Dialog="SetPhysicalPathDlg" Control="Back" Event="NewDialog" Value="CheckLicenseKeyAndWebsiteDlg" Order="2">
1
</Publish>
<Publish Dialog="CustomizedLicenseAgreementDlg" Control="Back" Event="NewDialog" Value="CheckLicenseKeyAndWebsiteDlg">
1
</Publish>
<Publish Dialog="CheckLicenseKeyAndWebsiteDlg" Control="Back" Event="NewDialog" Value="CustomizedWelcomeDlg" />
<Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="CheckLicenseKeyAndWebsiteDlg" Order="2">NOT Installed</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="CustomizedWelcomeDlg" Order="3">Installed AND PATCH</Publish>
<UIRef Id="WixUI_FeatureTree" />
<DialogRef Id="CheckLicenseKeyAndWebsiteDlg" />
<DialogRef Id="SetPhysicalPathDlg" />
Below is /l*vx switch log excerpt.
Action 0:58:03: VerifyReadyDlg。Dialog created
MSI (c) (44:B4) [00:58:03:744]: Note: 1: 2727 2:
Action ending. 0:58:04: CustomizedWelcomeDlg。 return value 1。
MSI (c) (44:7C) [00:58:04:137]: Skipping action: MaintenanceWelcomeDlg (condition is false)
MSI (c) (44:7C) [00:58:04:137]: Skipping action: ResumeDlg (condition is false)
MSI (c) (44:7C) [00:58:04:137]: Doing action: WelcomeDlg
After I read Denis Peshkov's Notes: Replacing a standard WelcomeDlg with a custom one.http://www.peshkov.biz/2015/03/replacing-standard-welcomedlg-with.html I added the InstallUISequence section below. Then pushing "install" button works properly to execute sequence. But I still have not understood enough why this turning off the original Welcome Dlg fixed the problem. May I ask you to explain why does it fix?
<InstallUISequence>
<Show Dialog="WelcomeDlg" Before="ProgressDlg" Overridable="no">0</Show>
<Show Dialog="CustomizedWelcomeDlg" Before="ProgressDlg" >NOT Installed OR PATCH</Show>
</InstallUISequence>

How to prevent installation exit dialog from showing when the user has uninstalled? [WiX]

I have made a custom exit dialog for my installer. The problem is that it is shown when the user uninstalls the program, when I would like the default uninstall exit dialog to be shown instead.
My installer code is viewable at Github. I think the relevant code is:
<Publish Dialog="KerkerkruipExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
<Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">Installed AND PATCH</Publish>
<InstallUISequence>
<Show Dialog="WelcomeDlg" Before="KerkerkruipWelcomeEulaDlg">Installed AND PATCH</Show>
<Show Dialog="KerkerkruipWelcomeEulaDlg" Before="ProgressDlg">NOT Installed</Show>
<Show Dialog="KerkerkruipExitDialog" OnExit="success" Overridable="yes" />
</InstallUISequence>
<AdminUISequence>
<Show Dialog="KerkerkruipExitDialog" OnExit="success" Overridable="yes" />
</AdminUISequence>
You can have only one exit dialog for success. MSI doesn't let you have different success exit dialogs for different operations like install or uninstall. From the MSI SDK:
Each termination flag (negative value) can be used with no more than one action. Multiple actions can have termination flags, but they must be different flags.

How to perform validation on Wix UI Edit control

How can i do validation on a wix Edit control and make the Next button be available only if user entered some string (cannot be empty)
<Property Id="BASEKITPATH" Value=" " />
<Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)">
<Condition Action="disable"><![CDATA[BASEKITPATH = " "]]></Condition>
<Condition Action="enable"><![CDATA[BASEKITPATH <> " "]]></Condition>
</Control>
With the above code, the Next button is becoming ReadOnly when the installer starts, but when i change the text the Next button nothing changes and the Next stays ReadOnly
What seems to be the problem
It's a known limitation of the underlying Windows Installer. It has scenarios like this where the ControlConditions won't work because they don't validate propreties that have changed while the UI is shown.
The typical work around is to use mutually exclusive ControlEvents. One to call SpawnDialog to display a validation error message and one to go to the next applicable dialog.
If somebody looks for example he can find it in the source code of Wix.
Open "WixUI_InstallDir.wxs" and check "InstallDirDlg" Dialog.
Sample from code:
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg">1</Publish>
<Publish Dialog="InstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
<Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="WixUIValidatePath" Order="2">NOT WIXUI_DONTVALIDATEPATH</Publish>
<Publish Dialog="InstallDirDlg" Control="Next" Event="SpawnDialog" Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
<Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="4">WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"</Publish>
<Publish Dialog="InstallDirDlg" Control="ChangeFolder" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
<Publish Dialog="InstallDirDlg" Control="ChangeFolder" Event="SpawnDialog" Value="BrowseDlg" Order="2">1</Publish>
Check the "SpawnDialog" event.

How to build a minimal WiX installer UI without a license page?

I would like to use the WixUI_Minimal installer, but I don't want the license page. How can I do this?
I would simply use one of the already created WiX UI and override the sequence (make it higher so that it will override the previous setting):
<Product>
...
<UI>
<UIRef Id="WixUI_InstallDir" />
<!-- Skip license dialog -->
<Publish Dialog="WelcomeDlg"
Control="Next"
Event="NewDialog"
Value="InstallDirDlg"
Order="2">1</Publish>
<Publish Dialog="InstallDirDlg"
Control="Back"
Event="NewDialog"
Value="WelcomeDlg"
Order="2">1</Publish>
</UI>
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
...
</Product>
The key is to make a custom UI and hook up different pages. See the page on WixWiki
You want to grab the WixUI minimal code, and modify it a bit. Instead of the WelcomeEulaDlg welcome dialog, you want to use the WelcomeDlg. Adjust the references, and wire up the Next button on the WelcomeDlg to the next dialog in the stack, which would be the PrepareDlg.
Full Code:
<UI Id="WixUI_Minimal">
<TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
<TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
<TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
<Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
<Property Id="WixUI_Mode" Value="Minimal" />
<DialogRef Id="ErrorDlg" />
<DialogRef Id="FatalError" />
<DialogRef Id="FilesInUse" />
<DialogRef Id="MsiRMFilesInUse" />
<DialogRef Id="PrepareDlg" />
<DialogRef Id="ProgressDlg" />
<DialogRef Id="ResumeDlg" />
<DialogRef Id="UserExit" />
<!-- This is the welcome dialog you specified-->
<DialogRef Id="WelcomeDlg" />
<!-- Hook the new welcome dialog to the next one in the stack-->
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="PrepareDlg">1</Publish>
<Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
<Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
<Property Id="ARPNOMODIFY" Value="1" />
</UI>
<UIRef Id="WixUI_Common" />
The low-tech way to get around this is simply to set the property LicenseAccepted to 1 and put some useful readme type information into the license box. This means the user doesn't have to click the box and you don't have to worry about creating an additional dialog :)
Example:
<Property Id="LicenseAccepted" Value="1"/>
See the answer to a related question, WiX script with only Welcome and Completed screens, for the simplest minimal UI:
WelcomeDlg
Installation progress
Exit Dialog
#Ran Davidovitz 's answer is very good
but be carefully:
<Publish Dialog="InstallDirDlg"
Control="Back"
Event="NewDialog"
Value="WelcomeDlg"
Order="2">1</Publish>
it must have Order="2",or it can't work.