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

StackOverflow https://stackoverflow.com/questions/1810910

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

Я решил эту проблему в 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 next следующим образом:

  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>

Затем выполните аналогичную для Лицензионного соглашения кнопку "Назад".:он должен вернуться к экрану приветствия, если предупреждения нет, или же к экрану предупреждения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top