我正在尝试添加一个带有复选框的自定义对话框,该复选框将在 WiX Toolset v3.11 安装完成后有条件地运行 EXE 文件
我已经尝试了以下(和其他方法),但不断遇到语法错误,并且无法拼凑出如何正确执行此操作。
<Product Id="*" Name="MyCompany Test Installer" Version="1.0.0" Manufacturer="MyCompany" UpgradeCode="{356FCAF3-500B-4EE4-A205-E1AB1915EE55}" Language="1033">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Platform="x64" />
<MediaTemplate EmbedCab="yes" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="MyCompany">
<Component Id="ProductComponent" Guid="{7BE266C9-156D-4DDC-A5BA-09F7567BBBA3}">
<File Id="MyExe" Source="ToolPalettesFolderSync.exe" KeyPath="yes" />
</Component>
</Directory>
</Directory>
</Directory>
<Feature Id="MainFeature" Title="MyComapny Test Installer" Level="1">
<ComponentRef Id="ProductComponent" />
<ComponentRef Id="ToolPalleteFolderSyncShortcut" />
<ComponentGroupRef Id="INSTALLFOLDER_files" />
</Feature>
<Property Id="RUN_EXE" Value="0" />
<UI>
<UIRef Id="WixUI_Minimal" />
<Dialog Id="MyCheckboxDialog" Width="370" Height="270" Title="My Custom Dialog">
<Control Id="Checkbox" Type="CheckBox" X="20" Y="20" Width="330" Height="17" Property="RUN_EXE" Text="Run MyExecutable after installation?" CheckBoxValue="1" />
<Control Id="Next" Type="PushButton" X="240" Y="243" Width="56" Height="17" Default="yes" Text="Next">
<Publish Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
</Control>
<Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="Back">
<Publish Event="NewDialog" Value="WelcomeDlg">1</Publish>
</Control>
</Dialog>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="MyCheckboxDialog">1</Publish>
<Publish Dialog="MyCheckboxDialog" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
<Publish Dialog="MyCheckboxDialog" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
</UI>
<InstallExecuteSequence>
<Custom Action="RunMyExe" After="InstallFinalize">RUN_EXE="1"</Custom>
</InstallExecuteSequence>
<CustomAction Id="RunMyExe" FileKey="MyExe" ExeCommand="" Return="asyncNoWait"/>
</Product>
我建议看一下我的开源项目 IsWiX。它具有使这一切变得更容易的模板。例如,您只需取消注释一行,然后您就会得到一个连接到向导循环中的附加内部对话框。你可以看一下源代码作为例子:
https://github.com/iswix-llc/iswix/blob/main/Application/IsWiX2022AddIn/VotiveMSISolutionTemplate/SetupProjectTemplate/UI.wxs https://github.com/iswix-llc/iswix/blob/main/Application/IsWiX2022AddIn/VotiveMSISolutionTemplate/SetupProjectTemplate/UI-CustomDialog.wxs
您通常会正确处理它,但我怀疑发布元素的顺序值是错误的。这些取决于您使用的内置对话框集。最好的办法是在 ORCA 中打开它并查看原始表数据,看看该值应该是多少才能达到预期的效果。
https://learn.microsoft.com/en-us/windows/win32/msi/controlevent-table
需要注意的例外是每个控件最多可以发布一个 NewDialog 或一个 SpawnDialog 事件。如果您需要创作多个 这个表中的NewDialog和SpawnDialog控制事件,还包括 Condition 字段中的条件语句确保最多有一个 事件已发布。如果有多个NewDialog和SpawnDialog控件 为同一控件选择事件,仅选择带有 当控件发布时,排序列中的最大值被发布 已激活。
另外,我注意到你的 EXE 被安排在 InstallFinalize 之后。这可能是不正确的。应在 InstallFinalize 之前安排它。该属性还应具有空“”而不是 0 的默认值,并且应标记为安全。
按照您现在的方式,它在安装程序事务之外运行,因此不会提升运行速度。