Сохранение значения флажка Wix, которое по умолчанию установлено в реестре - PullRequest
7 голосов
/ 16 декабря 2011

У меня есть установщик, созданный с помощью Wix.В мастере пользовательского интерфейса есть флажок, который по умолчанию установлен на.Я хочу сохранить значение этого флажка в реестре для изменений, исправлений и обновлений, используя (более простую версию) шаблон «Помнить свойство» , описанный Робом Меншингом.

Флажокреализация:

<Control Id="httpsCheckBox" Type="CheckBox" CheckBoxValue="true" X="30" Y="119" Width="139" Height="17" Text="Enable HTTPS services" Property="ENABLEHTTPS" />

Определение свойства:

    <Property Id="ENABLEHTTPS" value="true">
        <RegistrySearch Id="EnableHttpsRegistrySearch" Type="raw" Root="HKLM" Key="SOFTWARE\CompanyName\ProductName" Name="EnableHttps" />
    </Property>

И свойство записывается в реестр здесь:

    <Component Id="RegistryEntries">
        <RegistryKey Root="HKLM" Key="SOFTWARE\CompanyName\ProductName">
            <RegistryValue Name="EnableHttps" Value="[ENABLEHTTPS]" Type="string" />
        </RegistryKey>
    </Component>

Первоначальная установка работает нормально.Значение в реестре равно «true», если флажок оставлен отмеченным или пустым, если он не отмечен.

При следующем запуске программы установки, например, для установки новой функции, флажок всегда устанавливается независимо от того,значение в параметре реестра.

Если я удаляю значение по умолчанию из определения свойства, чтобы флажок был снят при первом запуске программы установки, все работает нормально.При следующем запуске программы установки флажок (и свойство) получат правильное значение из реестра.

Это похоже на то, что RegistrySearch не устанавливает свойство, если значение реестра пустое.

AmЯ что то не так делаю?Или есть лучший способ сделать это?

Ответы [ 2 ]

8 голосов
/ 16 декабря 2011

По сути, элемент будет использовать значение по умолчанию, если запись реестра не найдена или равна нулю, и это то, что вы испытываете.

См. Документацию здесь: http://wix.sourceforge.net/manual-wix3/wix_xsd_registrysearch.htm

Вот решение проблемы: http://www.mail-archive.com/wix-users@lists.sourceforge.net/msg32524.html

    <Property Id="ENABLEHTTPS" >
         <RegistrySearch Id="EnableHttpsRegistrySearch" Type="raw" Root="HKLM" Key="SOFTWARE\CompanyName\ProductName" Name="EnableHttps" />
    </Property>

    <CustomAction Id="SetENABLEHTTPS" Property="ENABLEHTTPS" Value="1" Execute="firstSequence" />

    <Control Id="httpsCheckBox" Type="CheckBox" CheckBoxValue="1" X="30" Y="119" Width="139" Height="17" Text="Enable HTTPS services" Property="ENABLEHTTPS" />

    <InstallUISequence>
        <Custom Action="SetENABLEHTTPS" Before="AppSearch">NOT Installed AND NOT OLDERVERSIONDETECTED</Custom>
    </InstallUISequence>
    <InstallExecuteSequence>
        <Custom Action="SetENABLEHTTPS" Before="AppSearch">NOT Installed AND NOT OLDERVERSIONDETECTED</Custom>
    </InstallExecuteSequence> 
6 голосов
/ 08 февраля 2012

Вот пример, который также работает со свойством, которое также учитывает, изменяется ли значение свойства по умолчанию с помощью преобразования MSI (MST), командной строки или если значение уже существует в реестре после установки с помощью групповой политики (т. Е. каждый крайний случай, который я смог найти!)

<Property Id='MYPROP' Secure="yes" Admin="yes" Value='-1'>
    <RegistrySearch Id='RegSearch_MYPROP' Root="HKLM"
                    Key="SOFTWARE\CompanyName\ProductName" 
                    Name='MYPROP' Type='raw' />
</Property>

<CustomAction Id='MYPROPSaveCmdLine' Property='CMDLINE_MYPROP' 
              Value='[MYPROP]' Execute='firstSequence' />
<CustomAction Id='MYPROPSetFromCmdLine' Property='MYPROP'
              Value='[CMDLINE_MYPROP]' Execute='firstSequence' />
<CustomAction Id='MYPROPClearCheckbox' Property='MYPROP'
              Value='{}' Execute='firstSequence'/>
<CustomAction Id='MYPROPSaveCheckboxOff' Property='MYPROP' Value='0' />
<CustomAction Id='MYPROPSaveCheckboxOn' Property='MYPROP' Value='1' />

<InstallUISequence>
    <Custom Action='MYPROPSaveCmdLine' Before='AppSearch'>MYPROP &lt;&gt; -1</Custom>
    <Custom Action='MYPROPSetFromCmdLine' After='AppSearch'>CMDLINE_MYPROP</Custom>
    <Custom Action='MYPROPClearCheckbox' After ='MYPROPSetFromCmdLine'>MYPROP=0</Custom>
</InstallUISequence>
<InstallExecuteSequence>
    <Custom Action='MYPROPSaveCmdLine' Before='AppSearch'>MYPROP &lt;&gt; -1</Custom>
    <Custom Action='MYPROPSetFromCmdLine' After='AppSearch'>CMDLINE_MYPROP</Custom>
    <Custom Action='MYPROPClearCheckbox' After ='MYPROPSetFromCmdLine'>MYPROP=0</Custom>
    <Custom Action='MYPROPSaveCheckboxOff' Before='InstallInitialize'>Not MYPROP Or MYPROP=0</Custom>
    <Custom Action='MYPROPSaveCheckboxOn' Before='InstallInitialize'>MYPROP And MYPROP &lt;&gt; 0</Custom>
</InstallExecuteSequence>
...