2011-07-22 57 views
4

执行多个发射条件我已经成功地得到维克斯启动退出我的应用程序,但不知道如何使用WixShellExecTarget财产安排两个自定义操作。如何在安装程序退出

一个CA是启动一个应用程序,另一个是基于来自另一个CA的URL的网页。如果选中了相应的复选框,则会启动它们。

<!-- 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" /> 

你能给我得到这个工作的任何帮助,将不胜感激。

干杯, 杰米

[编辑]我试过下面的建议,我不明白这一点设置第二个采取行动的适当值。它不会去www.google.com,我建议:

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

回答

7

相当简单,你需要两个单独的行动,以“套” WixShellExecTarget - 他们只会在不同的时间运行。

首先,您将设置将要运行的操作。

<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" /> 

现在要安排这些行动实际运行,在这个例子中,我搭售一切行动的完成按钮的最终安装对话框。当我们发布到Control元素时,WiX会自动将Publish/@Order设置为比上一个事件大1。

此外,所有这些操作都只能在安装过​​程中执行,因为在移除和修复过程中会显示相同的对话框。

如果执行是可选的,您可能还需要基于复选框的状态对这些条件进行调整。

<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> 
+0

谢谢,对不起,它需要很长时间已经离开,所以没有机会测试这一点。 – Jamie

+3

非常酷的解决方案,因为WixShellExecTarget的其他重复属性,可以在一个MSI中使用两个WixShellExec自定义操作。谢谢! –

+1

我试图使用这个,但它似乎从来没有在任何版本的工作。我收到以下错误: 错误找到重复的符号'ControlEvent:ExitDialog/Finish/DoAction/DoExec/NOT Installed'。这通常意味着Id是重复的。检查以确保给定类型(文件,组件,功能)的所有标识符都是唯一的。 –