我已经阻止在操作系统上安装我们的软件,在这些操作系统中,我们的软件不会像这样工作:
<Condition Message="This software needs Windows XP or newer.">
<![CDATA[VersionNT >= 501]]>
</Condition>
现在,如果用户尝试在未明确支持的操作系统(VersionNT + Service Pack)上安装软件,我还要显示非阻止警告,即使它< em>可能工作。
例如,我们只显式支持每个操作系统的最新Service Pack。
如何显示此类警告?
答案 0 :(得分:16)
我用3个部分解决了这个问题:
<强> 1。定义OSWarningText属性
首先,声明属性并默认为其设置“unset”值:
<Property Id="OSWarningText" Value="{}"/>
要构造属性的实际值,请为每个可能的警告设置中间属性。确保每个警告的条件不重叠:
<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>
假设条件不重叠,我们可以安全地在单个属性中压缩警告,如下所示:
<SetProperty Id="OSWarningText" After="SetOSWarningText2"
Value="[OSWarningText1][OSWarningText2]" />
<强> 2。创作自定义警告屏幕。
这类似于example for adding a checkbox for the desktop shortcut。复制wix sources中的一个现有对话框定义,例如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>
想法是创造这样的东西:
第3。在UI序列中插入自定义警告屏幕
现在我们需要确保在欢迎对话框和许可协议对话框之间显示警告屏幕,但前提是实际上有警告要显示。这是更一般的branching wizard sequences问题的一个特例。
再次,从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>
然后执行许可协议“后退”按钮的等效项:如果没有警告,它应返回欢迎屏幕,否则返回到警告屏幕。