2016-04-29 90 views
1

我有这样的特性:维克斯维修安装在默认路径,而不是在那里安装该应用程序

<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER"/> 

我的目录:

<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="LocalAppDataFolder"> 
    <Directory Id="LocalAppDataCompany" Name="Company"> 
     <Directory Id="INSTALLFOLDER" Name="Product" /> 
    </Directory> 
    </Directory> 
</Directory> 

它编译成功。当我运行.msi时,它会按预期方式安装C:\Users\[CurrentUser]\AppData\Local\Company\Product中的文件。

但问题是:

  1. 我运行安装程序,并更改路径(让我们在对话中说,我改变了路径Product2
  2. 该产品安装在...\AppData\Local\Company\Product2成功
  3. 我再次运行安装程序,并选择修复
  4. 现在我有2个产品实例:

C:\Users\[CurrentUser]\AppData\Local\Company\Product C:\Users\[CurrentUser]\AppData\Local\Company\Product2

如何解决的修复,在重新安装的文件(维修期间)的...\AppData\Local\Company\Product2(或任何应用程序是最初安装的)?

我试过使用注册表搜索(因为我在注册表中保存了INSTALLFOLDER的值),但它不起作用。

+0

你可以在问题中分享你的RegistrySearch和RegistryValue组件吗?这是做这件事的方式,所以我会怀疑某件作品是不正确的。 –

回答

1

编辑:哇我真的需要在回答前阅读完整问题。刚注意到你正在将这个值存储在注册表中。尽管如此,我仍然会留下我的答案,因为它可能有用。


你需要实现一个记得我图案让你的安装可以在初始安装过程中已被修改,即可拾取性。安装目录可能是您应该记住的最经常修改的属性。有很多安装程序不这样做,你会注意到,如果你正在升级,他们总是默认为默认的安装目录,而不是你之前安装的可能会令人讨厌的地方。

This很好地解释了“记住我”模式的概念。在大多数情况下,您可以简单实施。

要点是,您需要存储更改后的安装目录(通常位于注册表中)的值,然后在每次随后运行安装程序时尝试将其提取出来。

对于INSTALLFOLDER属性,您只需添加两件东西,一个注册表搜索和一个注册表项。

首先我们需要添加一个新的组件用的RegistryKey到INSTALLFOLDER的值写入注册表

<Component Id="InstallFolderRegistry" Directory='INSTALLFOLDER'> 
    <RegistryValue Root='HKCU' Key='SOFTWARE\[Manufacturer]\[ProductName]' 
       Name='InstallFolder' Value='[INSTALLFOLDER]' 
       Type='string' KeyPath="yes" />  
</Component> 

您也可以搭载此注册表值到另一个组件,如果你真希望删除“的keyPath =”是“”。

这会在安装期间将INSTALLFOLDER属性的值放入注册表中。

现在我们需要尝试读取该值,如果它在启动时存在,以便在升级或修理期间我们将得到用户选择安装的正确位置。

<Property Id='INSTALLFOLDER'> 
    <RegistrySearch Id='InstallFolderRegSearch' Root='HKCU' 
        Key='SOFTWARE\[Manufacturer]\[ProductName]' 
        Name='InstallFolder' Type='raw' /> 
</Property> 

现在,当你修复安装程序时,应该找到这个注册表项,然后修复正确的目录。在升级过程中,安装位置将被设置为与当前安装的产品相同的位置。

要注意,如果您有非静态的ProductName或Manufacturer,则只需在注册表路径中输入静态文本而不是“[Manufacturer]”和“[ProductName]”即可。

+0

感谢您的回答。我会尝试一下,当我使用注册表记住我的模式时,我可能错过了一些东西:) – KaeL