2011-05-13 100 views
7

目前我已经定制了Wix_InstallDirDlg以使用户能够在安装时设置注册表项。在InstallDirDlg和MaintenanceTypeDlg后面都会显示一个自定义对话框,以便它可以同时满足安装和修复情况。Wix安装程序在修复时清空注册表设置

自定义对话框有一个链接到属性的单个文本框。此属性具有注册表搜索功能,因此如果用户修复或升级,则先前的值将保留下来,并显示在自定义对话框中以供用户验证。该对话框在安装时工作正常,并且创建了注册表项。但是,在修复时,自定义对话框显示输入正确的注册表值(因此RegistrySearch正在运行),但修复完成后,键值为空。

<Property Id='SERVER_LISTEN_URL'> 
      <RegistrySearch Id='ServerListenUrlRegSearch' Root='HKLM' 
          Key='SOFTWARE\$(var.Manufacturer)\$(var.Name)' 
          Name='ServerListenUrl' 
          Type='raw' Win64='no' /> 
     </Property> 

<Component Id="RegistryEntries" Guid="0234974B-6158-4312-90A7-56869809B42E"> 
     <RegistryKey Id="ServerRegKey" 
       Root="HKLM" 
       Key='SOFTWARE\$(var.Manufacturer)\$(var.Name)' 
       Action='createAndRemoveOnUninstall'> 
      <RegistryValue Id="ServerListenUrlRegVal" 
         Name='ServerListenUrl' 
         Value='[SERVER_LISTEN_URL]' 
         KeyPath='yes' 
         Type='string' /> 
     </RegistryKey> 
</Component> 

<Dialog Id="SettingsDlg"> 
    <Control Id="ListenUrl" Type="Edit" X="20" Y="100" Width="320" Height="18" Property="SERVER_LISTEN_URL" Indirect="no" /> 
</Dialog> 

我做了什么错了?

回答

7

我在贴出来之后直接解决了这个问题。我花了将近一天的时间试图解决这个问题,所以希望这可以节省一些痛苦。您只需将该属性更改为安全属性即可。

<Property Id='SERVER_LISTEN_URL' Secure='yes'> 
     <RegistrySearch Id='ServerListenUrlRegSearch' Root='HKLM' 
         Key='SOFTWARE\$(var.Manufacturer)\$(var.Name)' 
         Name='ServerListenUrl' 
         Type='raw' Win64='no' /> 
</Property> 
3

安全属性可以在一个“升高安装”通过其从所述客户端进程向服务器进程(在系统环境中运行)的含量(在用户上下文运行)。换句话说,由非管理员用户调用的安装。不要过于慷慨地提供哪些属性是安全的,但必须添加升级表中使用的所有属性,以及在GUI中使用的任何特殊属性,以获取关键信息,就像您所做的那样。

http://msdn.microsoft.com/en-us/library/aa371571(v=vs.85).aspx

+0

感谢您的澄清,它现在是有道理的,为什么它没有工作。 Wix编译器(或Orca)无法检测到我正在使用应该需要安全的属性,这真是令人遗憾! – 2011-05-15 08:45:51

+0

我同意穴居人。在Windows安装程序中有很多陷阱。 Wix实际上确实帮助你多一点,但仍有改进的余地。 – 2011-05-15 14:39:23

相关问题