2011-12-16 82 views
6

我有一個用Wix創作的安裝程序。在UI嚮導中,有一個默認選中的複選框。我想保存此複選框註冊表更改,維修和升級的使用(的簡化版本)由羅布Mensching描述的價值"Remember Property" pattern保存默認檢查到註冊表的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不設置屬性,如果註冊表值是空的。

我做錯了什麼?或者有更好的方法來做到這一點?

回答

7

基本上,元素將使用默認值,如果找不到或無效的註冊表項,那就是你正在經歷。

在這裏看到的文檔:http://wix.sourceforge.net/manual-wix3/wix_xsd_registrysearch.htm

這是解決問題的辦法: 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

謝謝拉米。這是一種享受。 – Smiffy 2012-01-03 05:57:55

6

這裏的,也可用於如果默認的屬性值被修改也尊重一個屬性的示例通過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>