Как отобразить неблокирующее предупреждение для операционной системы в Wix? - PullRequest
10 голосов
/ 28 ноября 2009

Я уже блокирую установку нашего программного обеспечения в операционных системах, где известно, что оно не работает следующим образом:

<Condition Message="This software needs Windows XP or newer.">
   <![CDATA[VersionNT >= 501]]>
</Condition>

Теперь я также хотел бы отобразить неблокирующее предупреждение , если пользователь пытается установить программное обеспечение в операционной системе (VersionNT + Service Pack), которая явно не поддерживается, даже если она может работать.

Например, мы только явно поддерживаем последний пакет обновления для каждой операционной системы.

Как я могу отобразить такое предупреждение?

1 Ответ

16 голосов
/ 29 ноября 2009

Я решил эту проблему в 3 частях:

  1. определение свойства OSWarningText который устанавливается только при предупреждении нужно дать
  2. создание пользовательского экрана предупреждения
  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. Создание пользовательского экрана предупреждения.

Это похоже на пример для добавления флажка для ярлыка на рабочем столе . Скопируйте одно из существующих диалоговых определений из источников wix , например, InstallDirDlg.wxs и переименуйте его в WarningDlg.wxs.

Установите идентификатор диалога в 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. Вставка пользовательского экрана предупреждения в пользовательском интерфейсе

Теперь нам нужно убедиться, что экран предупреждения отображается между диалоговым окном приветствия и диалоговым окном лицензионного соглашения, но только в том случае, если на самом деле есть предупреждение. Это особый случай более общей последовательности ветвления мастера проблема.

Снова скопируйте предопределенную последовательность пользовательского интерфейса из источников wix, например, WixUI_InstallDir.wxs и переименуйте идентификатор пользовательского интерфейса в Id="MyWixUI". Назовите это в вашем основном файле wxs как <UIRef Id="MyWixUI" />. Теперь найдите и отредактируйте обработчики событий для кнопки WelcomeDlg next.

Вы можете установить свойства в ответ на нажатие кнопки и дополнительное условие, и вы можете показать следующий диалог на основе свойства. Мы будем использовать это для обработки следующей кнопки WelcomeDlg следующим образом:

  1. сбросить свойство WelcomeDlg_Next "сбросить"
  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>

Затем сделайте эквивалент для кнопки «назад» лицензионного соглашения: она должна вернуться к экрану приветствия, если нет предупреждения, или к экрану предупреждения.

...