Раздел реестра не обновляется при значении 0 при использовании Wix Toolset

значение раздела реестра не обновляется с его предполагаемыми данными с помощью Wix Toolset для MSI. Если k:v отсутствует, он добавляет его. Если данные k:v установлены в 0, он полностью игнорирует его, что является фактической проблемой здесь (я думаю)

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

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
    <Product Id="*" Name="SampleInstaller" Language="1033" Version="1.0.0.0" Manufacturer="ACME" UpgradeCode="cf6248e9-d7da-4996-9b8e-90072e8510f6">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Platform="x64"/>
        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
        <Feature Id="ProductFeature" Title="SampleInstaller" Level="1">
            <ComponentGroupRef Id="ProductComponents" />
        </Feature>    
    </Product>

    <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder64">
        <Directory Id="INSTALLFOLDER" Name="SampleInstaller" />
      </Directory>
    </Directory>
    <Property Id="VKB_QUERY_HKCU" Secure="yes">
      <RegistrySearch Id="VkbVisibleHkcu"
            Win64="yes"
            Type="raw"
            Root="HKCU"
            Key="SoftwareMicrosoftTabletTip.7"
            Name="TipbandDesiredVisibility"/>
    </Property>
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
      <Component Id="ShowVKB_Registry_HKCU" Guid="{97AB4B1D-C9C8-4B34-9328-FF8CA3ED8992}" Directory="INSTALLFOLDER">
        <RegistryKey Id="VKB_Registry_Key_HKCU" Root="HKCU" Key="SoftwareMicrosoftTabletTip.7" ForceCreateOnInstall="yes" ForceDeleteOnUninstall="no">
          <RegistryValue Id="VKB_Registry_Value_HKCU" Action="write" Type="integer" Name="TipbandDesiredVisibility" Value="1"/>
        </RegistryKey>
      </Component>
    </ComponentGroup>
    <InstallExecuteSequence>
      <ScheduleReboot After="InstallFinalize">NOT (VKB_QUERY_HKCU = "#1")</ScheduleReboot>
    </InstallExecuteSequence>
    </Fragment>  
</Wix>

кроме того, похоже, что код выхода от MSIEXEC всегда возвращается 0 вместо 3010 of 1641 при проверке $LastExitCode и %errorlevel%. Я не возился с различными поведениями перезагрузки, но я думал, что приглашение перезагрузки заставило бы мой установщик выйти из ненулевого режима, поэтому любое руководство также приветствуется.

2 ответов


сделайте это установить и создать подробный журнал с:

msiexec / I [путь к msi] / l*vx [путь к текстовому файлу журнала]

и посмотрите на значения свойств и т. д. Наиболее вероятной причиной вы не получаете 3010 результате выход в том, что ScheduleReboot обусловлено ложным.

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

один из ваших комментариев относится к %errorlevel%, но непонятно, почему это актуально. Если вы инициируете это из пакетного файла или аналогичного, то это полезная информация для добавления. Кроме того, если вы устанавливаете это каким-то образом, отдельным от текущего интерактивного пользователя тогда это тоже полезно знать.

журнал, кажется, указывает, что все в порядке. Свойства имеют значения, которые выглядят правильно, и выполняется действие ScheduleReboot. Единственная проблема, которую я вижу, заключается в том, что установщик Windows не показал диалоговое окно с просьбой пользователя выполнить перезагрузку, поэтому он делает неинтерактивную вещь, которая должна вернуть 3010, чтобы сообщить вызывающему абоненту, что требуется перезагрузка. Нет никаких очевидных причин, по которым установщик Windows не запрашивал перезагрузку (которая что ScheduleReboot делает), но если установка выполняется в неинтерактивном пользовательском контексте, то Windows не будет показывать диалог рабочего стола другому пользователю (или ни одному пользователю никто не вошел в систему).


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

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

таким образом, в основном это была тестовая ошибка / отсутствие внутренних знаний WiX.

таким образом, всегда удаляйте MSI перед повторным запуском, если вы специально не пытаетесь вызвать поведение обновления.

Я не уверен, почему я не получал ошибку о уже существующем продукте. Я бы я думал, что это будет поведение по умолчанию.