如何在Wix中显示操作系统的非阻塞警告?

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属性,该属性仅在需要发出警告时设置
  2. 创作自定义警告屏幕
  3. 如有必要,在UI序列中插入自定义警告屏幕

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下一个按钮,如下所示:

  1. 将WelcomeDlg_Next属性重置为"unset"
  2. 将WelcomeDlg_Next属性设置为"WarningDlg",但仅当设置了OSWarningText时
  3. 将WelcomeDlg_Next属性设置为"LicenseAgreementDlg",但仅当未设置OSWarningText时.
  4. 如果属性设置正确,则显示WelcomeDlg_Next给出的对话框.

执行此操作的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)

然后执行许可协议"后退"按钮的等效项:如果没有警告,它应返回欢迎屏幕,否则返回到警告屏幕.