Wix, настраиваемый диалог, когда существует предыдущая версия - программирование

Wix, настраиваемый диалог, когда существует предыдущая версия

Я делаю установку для своего приложения с помощью набора инструментов WiX. Я хочу показать пользовательский диалог, если предыдущая версия найдена.

Теперь я не знаю, как проверить, есть ли предыдущая версия и показать это диалоговое окно только в этом случае? Вот мой код

CustomDialogUI.wxs:

 <?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Fragment>
    <UI>
  <Dialog Id="OldVersionDlg" Width="260" Height="85" Title="[ProductName] Setup" NoMinimize="yes">
    <Control Id="No" Type="PushButton" X="132" Y="57" Width="56" Height="17"
      Default="yes" Cancel="yes" Text="No">
      <Publish Event="EndDialog" Value="Exit">1</Publish>
    </Control>
    <Control Id="Yes" Type="PushButton" X="72" Y="57" Width="56" Height="17" Text="Yes">
      <Publish Event="EndDialog" Value="Return">1</Publish>
    </Control>
    <Control Id="Text" Type="Text" X="5" Y="15" Width="250" Height="30">
      <Text>A previous version of [ProductName] is currently installed. By continuing the installation this version will be uninstalled. Do you want to continue?</Text>
    </Control>

  <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="&amp;Back">
    <Publish Event="NewDialog" Value="LicenseAgreementDlg">1</Publish>
  </Control>
  <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="&amp;Next">
    <Publish Event="ValidateProductID" Value="0">1</Publish>
    <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg">CostingComplete = 1</Publish>
    <Publish Event="NewDialog" Value="SetupTypeDlg">ProductID</Publish>
  </Control>
  <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="Cancel">
    <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
  </Control>

  <Control Id="BannerLine" Type="Line" X="0" Y="50" Width="370" Height="0" />
  </Dialog>      
</UI>

С этим я создал свой диалог, как я хотел, и вставил в оригинальную цепочку диалогов.

И в моем Project.wxs

<UI Id="MyWixUI_Mondo">
      <UIRef Id="WixUI_Mondo" />
      <UIRef Id="WixUI_ErrorProgressText" />

  <DialogRef Id="OldVersionDlg" />

  <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="OldVersionDlg" Order="3">LicenseAccepted = "1"</Publish>
  <Publish Dialog="SetupTypeDlg" Control="Back" Event="NewDialog" Value="OldVersionDlg">1</Publish>
</UI>

При этом я получаю свой OldVErsionDlg каждый раз, и я не знаю, как заставить его показывать ТОЛЬКО, если существует предыдущая версия.

Я добавил в Project.wxs

<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="{80EE38CE-1A3B-445F-8CC1-31B32AA77715}">
  <UpgradeVersion Minimum="1.0.0.0" Maximum="9.0.0.0"
                  Property="PREVIOUSVERSIONSINSTALLED"
                  IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>

и попробовал с:

 <UI Id="MyWixUI_Mondo">
  <UIRef Id="WixUI_Mondo" />
  <UIRef Id="WixUI_ErrorProgressText" />

  <DialogRef Id="OldVersionDlg" />

  <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="OldVersionDlg" Order="3">LicenseAccepted = "1" AND PREVIOUSVERSIONSINSTALLED</Publish>
  <Publish Dialog="SetupTypeDlg" Control="Back" Event="NewDialog" Value="OldVersionDlg">1</Publish>
</UI>

Не повезло с этим.

4b9b3361

Ответ 1

Переопределение кнопки "Далее/Назад": я не эксперт по графическому интерфейсу, на самом деле это заброшенная область (GUI всегда запрещен для корпоративного развертывания), но я считаю, что что-то подобное может сработать - переопределение кнопок "Далее" и "Назад" - задействовано 3 диалоговых окна:

<!-- 1. OldVersionDlg showing -->
<Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" 
         Value="OldVersionDlg">LicenseAccepted = "1" AND PREVIOUSVERSIONSINSTALLED</Publish>

<Publish Dialog="SetupTypeDlg" Control="Back" Event="NewDialog" 
         Value="OldVersionDlg">PREVIOUSVERSIONSINSTALLED</Publish>

<!-- 2. OldVersionDlg dialog not showing -->
<Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" 
         Value="SetupTypeDlg">LicenseAccepted = "1" AND NOT PREVIOUSVERSIONSINSTALLED</Publish>

<Publish Dialog="SetupTypeDlg" Control="Back" Event="NewDialog" 
         Value="LicenseAgreementDlg">NOT PREVIOUSVERSIONSINSTALLED</Publish>

Фактические последовательности диалога:

  1. LicenseAgreementDlg <-> OldVersionDlg <-> SetupTypeDlg

  2. LicenseAgreementDlg <-> SetupTypeDlg

Чтобы быть уверенным, не забудьте протестировать во всех режимах установки: install, upgrade, repair, modify, patching, uninstall (и есть незнакомые берега, такие как возобновленная установка - редко можно увидеть).

В заключение: действительно ли эта функция необходима? Я считаю, что подобные функции часто вызывают больше ошибок, чем выгод, но это всего лишь личное мнение. Фактически, я написал ответ давным-давно о том, как реализовать такую проверку обновления без использования диалогов установки.


Некоторые ссылки: