WiX根据注册表值更改UI行为

时间:2011-09-12 19:15:34

标签: wix registry wix3.5

简短版本是我正在构建一个安装程序包,我希望欢迎屏幕的“下一步”按钮根据是否存在特定的注册表项来更改其行为。看起来我应该能够修改下一个按钮动作的条件来获得这种行为,但到目前为止还没有运气。我总是得到行为A或行为B,我没有得到对注册表值敏感的行为。

我应该注意,我可以完全删除UI并通过命令行运行包以获得所需的结果,但我想通过在适当时添加安装路径对话框来提高用户友好性。

更详细一点......

我正在为一系列独立但相关的类库安装工作。如果我们在一个干净的盒子上安装一个库,我希望安装程序提示用户输入安装路径,然后在安装过程中将此路径写入注册表。但是,如果我们在已经存在其他库之一的盒子上安装库,我希望安装程序读取注册表并使用与先前安装相同的路径。

我的思维过程是修改标准WixUI_InstallDir接口以检查注册表搜索结果,如果已设置则跳过InstallDirDlg。然而,这似乎不起作用。以下是XML中的一些剪辑:

<Property Id="FOOPATH">
  <RegistrySearch Id="PathSet" Type="directory" Root="HKLM" Key="Software\Foo" Name="InstallPath"></RegistrySearch>
</Property>
<Property Id="PATHSET">
  <RegistrySearch Id="PathSet" Type="directory" Root="HKLM" Key="Software\Foo" Name="InstallPath"></RegistrySearch>
</Property>

<Directory Id="FOOPATH" Name="Foo">
  <Component Id="FooPathReg" Guid="Some Guid">
    <RegistryKey Root="HKLM" Key="Software\Foo" Action="createAndRemoveOnUninstall">
      <RegistryValue Name="InstallPath" Type="string" Value="[FOOPATH]" KeyPath="yes"></RegistryValue>
    </RegistryKey>
  </Component>
</Directory>

<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg">NOT Installed AND NOT PATHSET</Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">NOT Installed AND PATHSET</Publish>

如果我的发布条件使用PATHSET属性(如图所示),那么我总是得到安装目录对话框,如果我将它们切换为使用FOOPATH属性,那么我永远不会得到对话框。我也尝试过使用InstallUISequence,我似乎没有多久安排AppSearch操作,我仍然得到相同的结果。

我缺少一些简单的东西吗?或者我需要采取另一种方法吗?

2 个答案:

答案 0 :(得分:2)

  1. 检查详细日志以查看属性是否按预期设置。
  2. 使用Orca查看ControlEvent是否符合您的预期。 UI是附加的,因此当您想要替换股票UI时,您必须采取额外的步骤。例如,请参阅http://neilsleightholm.blogspot.com/2008/08/customised-uis-for-wix.html

答案 1 :(得分:1)

好吧,结果证明这是我在测试过程中遗漏了一些脑力不足的时刻。我正在填写为什么它失败的详细信息,希望它能为其他人节省一些我在工作时遇到的挫败感。

首先,重要的是要知道我实际上并没有测试多个软件包,我试图用第一个软件包来完成我的基础结构,然后当我认为它相当接近时将其应用于其余软件包,这是帮助减少在整个软件包组中复制所需的更改次数。为此,我在运行包之前手动添加了有问题的注册表项,通过模拟先前的安装。

我忽略的是实际创建注册表项引用的目录。我和同事一起走过这个过程,在解释过程中我注意到了这段日志:

Action start 8:26:16: AppSearch.
MSI (c) (BC:D4) [08:26:16:505]: Note: 1: 2262 2: Signature 3: -2147287038 
MSI (c) (BC:D4) [08:26:16:506]: Note: 1: 2262 2: Signature 3: -2147287038 
MSI (c) (BC:D4) [08:26:16:507]: Note: 1: 2262 2: Signature 3: -2147287038 
MSI (c) (BC:D4) [08:26:16:507]: PROPERTY CHANGE: Adding NETFRAMEWORK35 property. Its value is '#1'.
Action ended 8:26:16: AppSearch. Return value 1.

我尝试创建注册表值引用的目录以及注册表值本身。一旦目录在那里,一切都开始正常工作。

显然,当您告诉RegistrySearcher该值是一个目录时,它只在该目录实际存在时将值设置为该属性。这个细节从未出现在我对该主题的搜索中,并且在我发现的文档中并不清楚,但回想起来我可以看到它隐含的位置。