4

I've managed to get WIX to launch my application on exit, but not sure how to schedule two custom actions using the WixShellExecTarget property.

One CA is to launch an app and the other is a web page based on a url from another CA. These are both launched if the appropriate checkboxes are checked.

<!-- Custom action for executing app -->
    <Property Id="WixShellExecTarget" Value="[#Application.exe]" />
    <CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />

    <!-- Custom action for executing Webbrowser -->

    <Property Id="???" Value="[CONFIGWIZARDURL]" />
    <CustomAction Id="LaunchConfigWizard" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />

Any help you could give me to get this working would be greatly appreciated.

Cheers, Jamie

[Edit] I've tried the suggestion below and I don't get it setting the appropriate value for the second action. It doesn't go to www.google.com as I suggest:

<Publish Dialog="MyExitDialog" Control="Finish" Event="DoAction" Value="SetExec1"><![CDATA[NOT Installed]]></Publish>
        <Publish Dialog="MyExitDialog" Control="Finish" Event="DoAction" Value="DoExec"><![CDATA[LAUNCHCAPTURE = "1" AND NOT Installed]]></Publish>

        <Publish Dialog="MyExitDialog" Control="Finish" Event="DoAction" Value="SetExec2"><![CDATA[NOT Installed]]></Publish>
        <Publish Dialog="MyExitDialog" Control="Finish" Event="DoAction" Value="DoExec"><![CDATA[LAUNCHCONFIGWIZARD = "1" AND NOT Installed]]></Publish>



Property(S): LAUNCHCONFIGWIZARD = 1
MSI (s) (5C:DC) [14:41:02:119]: PROPERTY CHANGE: Adding CONFIGWIZARDURL property. Its value is 'http://www.google.com'.

MSI (c) (DC:60) [14:41:16:166]: PROPERTY CHANGE: Adding WixShellExecTarget property. Its value is 'C:\...Application\MyApplication.exe'.
Action ended 14:41:16: SetExec1. Return value 1.
MSI (c) (DC:60) [14:41:16:181]: Doing action: DoExec
Action 14:41:16: DoExec. 
Action start 14:41:16: DoExec.

MSI (c) (DC:60) [14:41:16:181]: Creating MSIHANDLE (3) of type 790542 for thread 11104
MSI (c) (DC:E0) [14:41:16:181]: Invoking remote custom action. DLL: C:\Temp\MSIA7A.tmp, Entrypoint: WixShellExec
MSI (c) (DC!8C) [14:41:16:244]: Creating MSIHANDLE (4) of type 790541 for thread 10636
MSI (c) (DC!8C) [14:41:16:244]: Creating MSIHANDLE (5) of type 790531 for thread 10636
MSI (c) (DC!8C) [14:41:16:244]: Closing MSIHANDLE (5) of type 790531 for thread 10636
MSI (c) (DC!8C) [14:41:16:447]: Closing MSIHANDLE (4) of type 790541 for thread 10636
MSI (c) (DC:E0) [14:41:16:447]: Closing MSIHANDLE (3) of type 790542 for thread 11104
Action ended 14:41:16: DoExec. Return value 1.
MSI (c) (DC:60) [14:41:16:447]: Doing action: SetExec2
Action 14:41:16: SetExec2. 
Action start 14:41:16: SetExec2.
MSI (c) (DC:60) [14:41:16:447]: PROPERTY CHANGE: Deleting WixShellExecTarget property. Its current value is 'C:\...Application\MyApplication.exe'.
Action ended 14:41:16: SetExec2. Return value 1.
Action ended 14:41:16: MyExitDialog. Return value 1.
Yan Sklyarenko
  • 31,557
  • 24
  • 104
  • 139
Jamie
  • 876
  • 1
  • 10
  • 28

1 Answers1

8

Fairly straightforward, you'll need two separate actions to "set" WixShellExecTarget - they'll just run at different times.

First, you'll setup the actions that are going to be run.

<CustomAction Id="SetExec1" Property="WixShellExecTarget" Value="[#Application.exe]" />
<CustomAction Id="SetExec2" Property="WixShellExecTarget" Value="[CONFIGWIZARDURL]" />
<CustomAction Id="DoExec" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" Return="ignore" />

Now you want to schedule those actions to actually run, in this example I'm tying all of the actions to the Finish button on the final installation dialog. As we're publishing to a Control element, WiX will automatically set Publish/@Order to one greater than the previous event.

In addition, all these actions are conditioned to only execute during installation as this same dialog is displayed during removal and repair.

You'll likely also want to condition these based on the status of your checkboxes if execution is optional.

<UI>
    <!-- Publish set/do for first action -->
    <Publish Dialog="ExitDialog" Control="Finish" Event="DoAction" Value="SetExec1">
        <![CDATA[NOT Installed]]>
    </Publish>
    <Publish Dialog="ExitDialog" Control="Finish" Event="DoAction" Value="DoExec">
        <![CDATA[NOT Installed]]>
    </Publish>

    <!-- Publish set/do for second action -->
    <Publish Dialog="ExitDialog" Control="Finish" Event="DoAction" Value="SetExec2">
        <![CDATA[NOT Installed]]>
    </Publish>
    <Publish Dialog="ExitDialog" Control="Finish" Event="DoAction" Value="DoExec">
        <![CDATA[NOT Installed]]>
    </Publish>
</UI>
saschabeaumont
  • 22,080
  • 4
  • 63
  • 85
  • Thanks, Sorry it's taking so long have been away so not had a chance to test this out. – Jamie Aug 12 '11 at 13:51
  • 3
    Very cool solution to the problem that no two WixShellExec custom actions can be used in one MSI because of the otherwise duplicate property WixShellExecTarget. Thanks! – Helge Klein Dec 21 '11 at 18:59
  • 1
    I tried to use this but it seems that it does not work in never versions. I get the following error: Error 3 Duplicate symbol 'ControlEvent:ExitDialog/Finish/DoAction/DoExec/NOT Installed' found. This typically means that an Id is duplicated. Check to make sure all your identifiers of a given type (File, Component, Feature) are unique. – Mitja Bezenšek Nov 27 '14 at 15:14
  • I've just tried this (WiX 3.10.3) and it doesn't work reliably without the Order being specified explicitly. If you look at the MSI with Orca (or similar), you'll see that the order is specified as 1 for all four actions. – Ant Oct 19 '16 at 14:11