Wim*_*nen 10 windows-installer wix
我已经阻止在操作系统上安装我们的软件,在这些操作系统中,我们不知道这样工作:
<Condition Message="This software needs Windows XP or newer.">
<![CDATA[VersionNT >= 501]]>
</Condition>
Run Code Online (Sandbox Code Playgroud)
现在,如果用户尝试在未明确支持的操作系统(VersionNT + Service Pack)上安装软件,我还希望显示非阻塞警告,即使它可能有效.
例如,我们只显式支持每个操作系统的最新Service Pack.
我该如何显示这样的警告?
Wim*_*nen 16
我分三部分解决了这个问题:
1.定义OSWarningText属性
首先,声明属性并默认为其设置"unset"值:
<Property Id="OSWarningText" Value="{}"/>
Run Code Online (Sandbox Code Playgroud)
要构造属性的实际值,请为每个可能的警告设置中间属性.确保每个警告的条件不重叠:
<SetProperty Id="OSWarningText1" After="AppSearch"
Value="Detected XP SP [ServicePackLevel]. SP3 or higher is recommended.">
<![CDATA[(VersionNT = 501) AND NOT (ServicePackLevel >= 3)]]>
</SetProperty>
<SetProperty Id="OSWarningText2" After="SetOSWarningText1"
Value="Detected Vista SP [ServicePackLevel]. SP2 or higher is recommended.">
<![CDATA[(VersionNT = 600) AND NOT (ServicePackLevel >= 2)]]>
</SetProperty>
Run Code Online (Sandbox Code Playgroud)
假设条件不重叠,我们可以安全地在单个属性中压缩警告,如下所示:
<SetProperty Id="OSWarningText" After="SetOSWarningText2"
Value="[OSWarningText1][OSWarningText2]" />
Run Code Online (Sandbox Code Playgroud)
2.创建自定义警告屏幕.
这类似于为桌面快捷方式添加复选框的示例.复制wix源中的一个现有对话框定义,例如InstallDirDlg.wxs将其重命名为WarningDlg.wxs.
将对话框ID设置为Id="WarningDlg.删除不必要的控件,并用警告图像和我们之前定义的OSWarningText替换它们:
<Control Id="OSWarning" Type="Text" X="100" Y="80" Width="250" Height="60"
NoPrefix="yes" Text="[OSWarningText]" />
<Control Id="WarningIcon" Type="Icon" X="20" Y="60" Width="64" Height="64"
Text="Warning.ico" >
<Binary Id="Warning.ico" SourceFile="..\icons\warning.ico"/>
</Control>
Run Code Online (Sandbox Code Playgroud)
想法是创建这样的东西:

3.在UI序列中插入自定义警告屏幕
现在,我们需要确保在欢迎对话框和许可协议对话框之间显示警告屏幕,但前提是确实存在要显示的警告.这是更一般的分支向导序列问题的特例.
再次,从wix源复制预定义的UI序列,例如WixUI_InstallDir.wxs,将UI ID重命名为Id="MyWixUI".在主wxs文件中引用它作为<UIRef Id="MyWixUI" />.现在查找并编辑WelcomeDlg下一个按钮的事件处理程序.
您可以设置属性以响应按下按钮和额外条件,并且可以根据属性显示下一个对话框.我们将利用它来处理WelcomeDlg下一个按钮,如下所示:
执行此操作的Wix代码如下所示:
<Publish Dialog="WelcomeDlg" Control="Next"
Property="WelcomeDlg_Next" Value="{}"
Order="1">1</Publish>
<Publish Dialog="WelcomeDlg" Control="Next"
Property="WelcomeDlg_Next" Value="WarningDlg"
Order="2">OSWarningText</Publish>
<Publish Dialog="WelcomeDlg" Control="Next"
Property="WelcomeDlg_Next" Value="LicenseAgreementDlg"
Order="3">NOT OSWarningText</Publish>
<Publish Dialog="WelcomeDlg" Control="Next"
Event="NewDialog" Value="[WelcomeDlg_Next]"
Order="4">WelcomeDlg_Next</Publish>
Run Code Online (Sandbox Code Playgroud)
然后执行许可协议"后退"按钮的等效项:如果没有警告,它应返回欢迎屏幕,否则返回到警告屏幕.