2011-12-16 8 views
6

Tengo un instalador creado con Wix. En el asistente de IU, hay una casilla de verificación que está seleccionada por defecto. Quiero guardar el valor de esta casilla en el registro para cambios, reparaciones y actualizaciones usando la (versión más simple de) "Remember Property" pattern descrita por Rob Mensching.Guardar un valor de casilla de verificación Wix que se establece como predeterminado en el registro

La aplicación casilla:

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

La definición de propiedad:

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

y la propiedad se escriben en el registro aquí:

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

La instalación inicial funciona bien. El valor en el registro es "verdadero" si la casilla de verificación se deja marcada o vacía si no está marcada.

La próxima vez que se ejecute el instalador, para instalar una nueva característica, por ejemplo, la casilla de verificación siempre se verifica independientemente del valor en la configuración del registro.

Si elimino el valor predeterminado de la definición de propiedad para que la casilla de verificación esté desmarcada la primera vez que se ejecuta el instalador, todo funciona bien. La próxima vez que se ejecute el instalador, la casilla de verificación (y la propiedad) tendrá el valor correcto del registro.

Parece que RegistrySearch no establece la propiedad si el valor del registro está vacío.

¿Estoy haciendo algo mal? ¿O hay una mejor manera de hacer esto?

Respuesta

7

Básicamente, el elemento utilizará el valor predeterminado si la entrada del registro no se encuentra o es nula, y eso es lo que está experimentando.

Consulte la documentación aquí: http://wix.sourceforge.net/manual-wix3/wix_xsd_registrysearch.htm

Aquí es una solución al problema: http://www.mail-archive.com/[email protected]/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> 
+0

Gracias Rami. Eso funciona como un regalo. – Smiffy

6

Aquí hay un ejemplo que también trabaja con una propiedad que también respeta si se modifica el valor de la propiedad por defecto a través de una Transformada MSI (MST), la línea de comando o si el valor ya existe en el registro después de establecerlo a través de la Política de Grupo (es decir, cada caso límite que pude encontrar)

<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> 
Cuestiones relacionadas