WiX Изменение поведения пользовательского интерфейса в зависимости от значения реестра - PullRequest
0 голосов
/ 12 сентября 2011

Короткая версия заключается в том, что я создаю установочный пакет, и я хочу, чтобы кнопка «Далее» на экране приветствия меняла свое поведение в зависимости от того, существует ли определенный раздел реестра.Кажется, что я должен быть в состоянии изменить условия действий следующей кнопки, чтобы получить такое поведение, но пока не повезло.Я всегда получаю поведение A или B, я не получаю поведение, чувствительное к значению реестра.

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

Более подробно ...

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

Мой мыслительный процесс заключался в изменениистандартный интерфейс WixUI_InstallDir для проверки результатов поиска в реестре и пропуска InstallDirDlg, если он установлен.Однако это не похоже на работу.Вот некоторые фрагменты из XML:

<Property Id="FOOPATH">
  <RegistrySearch Id="PathSet" Type="directory" Root="HKLM" Key="Software\Foo" Name="InstallPath"></RegistrySearch>
</Property>
<Property Id="PATHSET">
  <RegistrySearch Id="PathSet" Type="directory" Root="HKLM" Key="Software\Foo" Name="InstallPath"></RegistrySearch>
</Property>

<Directory Id="FOOPATH" Name="Foo">
  <Component Id="FooPathReg" Guid="Some Guid">
    <RegistryKey Root="HKLM" Key="Software\Foo" Action="createAndRemoveOnUninstall">
      <RegistryValue Name="InstallPath" Type="string" Value="[FOOPATH]" KeyPath="yes"></RegistryValue>
    </RegistryKey>
  </Component>
</Directory>

<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg">NOT Installed AND NOT PATHSET</Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">NOT Installed AND PATHSET</Publish>

Если мои условия публикации используют свойство PATHSET (как показано), то я всегда получаю диалоговое окно установки каталога, если я переключаю их на использование свойства FOOPATH, тогда яникогда не получай диалог.Я также пытался поиграть с InstallUISequence, и, кажется, не имеет значения, как рано я планирую действие AppSearch, я все равно получаю тот же результат.

Есть ли что-то простое, что мне не хватает?Или мне нужен другой подход к этому?

Ответы [ 2 ]

2 голосов
/ 13 сентября 2011
  1. Проверьте подробный журнал, чтобы увидеть, установлены ли свойства, как вы ожидаете.
  2. Используйте Orca , чтобы увидеть, соответствует ли ControlEvent ожидаемому.Пользовательский интерфейс является аддитивным, поэтому вы должны предпринять дополнительные шаги, если хотите заменить стандартный пользовательский интерфейс.Например, см. http://neilsleightholm.blogspot.com/2008/08/customised-uis-for-wix.html.
1 голос
/ 13 сентября 2011

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

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

Что я забыл сделать, так это создать каталог, на который ссылается запись реестра.Я шел по процессу с коллегой, и в процессе объяснения я заметил этот раздел журнала:

Action start 8:26:16: AppSearch.
MSI (c) (BC:D4) [08:26:16:505]: Note: 1: 2262 2: Signature 3: -2147287038 
MSI (c) (BC:D4) [08:26:16:506]: Note: 1: 2262 2: Signature 3: -2147287038 
MSI (c) (BC:D4) [08:26:16:507]: Note: 1: 2262 2: Signature 3: -2147287038 
MSI (c) (BC:D4) [08:26:16:507]: PROPERTY CHANGE: Adding NETFRAMEWORK35 property. Its value is '#1'.
Action ended 8:26:16: AppSearch. Return value 1.

И мне пришло в голову попытаться создать каталог, на который ссылается реестрзначение, а также само значение реестра.Как только каталог был там, все начало работать правильно.

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

...