多个目标目录的WIX UI

时间:2018-02-02 08:16:23

标签: user-interface wix windows-installer wix3.5

我需要用户能够为我的安装设置多个不同的目标目录。

我有这个目录结构:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder">
    <Directory Id="DCOMPANY" Name="MyCompany" >
      <Directory Id="DMAIN" Name="MainDir">
        <Directory Id="DPART1" Name="Part1"/>
        <Directory Id="DPART2" Name="Part2"/>
      </Directory>
    </Directory>
  </Directory>
</Directory>

我在这里也有这些属性

<Property Id="WIXUI_INSTALLPATH" Hidden="yes" /> 
<Property Id="VARIABLE_PATH_DPART1" Value="DPART1" />
<Property Id="VARIABLE_PATH_DPART2" Value="DPART2" />

要覆盖Single InstallDirDialog,我复制了文件WIXUI_InstallDir.wxs和InstallDirDlg.wxs。我复制了InstallDirDlg.wxs并将数字1和2添加到文件的末尾,使用custom_为所有三个前缀添加并相应地更改了他们的UI-Tags:        

现在,在custom_WIXUI_InstallDir.wxs中,我改变了一下这个块,所以我希望MY Properties由Actions设置:

  <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="custom_InstallDirDlg1">LicenseAccepted = "1"</Publish>


  <Publish Dialog="custom_InstallDirDlg1" Control="Back" Event="NewDialog"
  Value="LicenseAgreementDlg">1</Publish>
  <Publish Dialog="custom_InstallDirDlg1" Control="Next"    
  Event="SetTargetPath" Value="[VARIABLE_PATH_DPART1]" Order="1">1</Publish>
  <Publish Dialog="custom_InstallDirDlg1" Control="Next" Event="DoAction"
  Value="WixUIValidatePath" Order="2">NOT WIXUI_DONTVALIDATEPATH</Publish>
  <Publish Dialog="custom_InstallDirDlg1" Control="Next" Event="SpawnDialog"
  Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND
  WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
  <Publish Dialog="custom_InstallDirDlg1" Control="Next" Event="DoAction"
  Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND
  WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
  <Publish Dialog="custom_InstallDirDlg1" Control="Next" Event="NewDialog"
  Value="VerifyReadyDlg" Order="4">WIXUI_DONTVALIDATEPATH OR
  WIXUI_INSTALLDIR_VALID="1"</Publish>
  <Publish Dialog="custom_InstallDirDlg1" Control="ChangeFolder"
  Property="_BrowseProperty" Value="[VARIABLE_PATH_DPART1]"
  Order="1">1</Publish>
  <Publish Dialog="custom_InstallDirDlg1" Control="ChangeFolder"
  Event="SpawnDialog" Value="BrowseDlg" Order="2">1</Publish>

  <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog"
  Value="custom_InstallDirDlg1" Order="1">NOT Installed</Publish>

在custom_InstallDirDlg1.wxs中,我还将此行更改为路径变量:

    <Control Id="Folder" Type="PathEdit" X="20" Y="100" Width="320"
  Height="18" Property="VARIABLE_PATH_DPART1" Indirect="yes" />

当我现在编译时,一切都被创建,当我运行安装程序时,当我点击“更改...”按钮或“下一步...”按钮时,安装程​​序冻结约30秒,然后说“指定的路径DPART1不可用。“

当我查看所有CDATA块中调用的自定义操作的来源时,我看到那些只关心WIXUI_INSTALLPATH并且不接受任何给予它们的东西。所以它几乎是使用间接方式。

我还读过某个地方,可以重复使用此对话框让用户输入多个目标路径,但我无法弄清楚如何。

请帮助:)

1 个答案:

答案 0 :(得分:1)

也许我会将它添加为答案,这样你就可以接受它,就像你说的那样 - 也许是upvote。然后让赏金耗尽 - 我认为它没有用,因为你还没有声誉。

我目前没有时间详细阅读此内容,但请看一下这个答案:WiX-installer With Configurable Feature Directory(中间,如果看起来相关的话,还有其他答案)。这些是“功能目录”,可以链接到实际的目录属性,如链接中所述。

上面的示例使用WiX Mondo对话框。 I describe setting up a minimal WiX compile with the Mondo dialog set here。本质上是一个“ Hello WiX ”项目,但你已经失败了。只需添加它以防其他人可能会发现它有用。

更新:我的简短测试似乎表明,系统会为大多数安装模式保留此类功能目录,但主要升级不会。要阅读这些自定义文件夹的先前设置,您需要AppSearch或我要说的自定义操作,您应该使您的设置保持在注册表中的目录属性。

一些指针

这些只是快速测试的一些建议。请一如既往地亲自测试。 Windows Installer中有许多我称之为“conspiratory complexity”的问题 - 问题出现意外 - 例如当您尝试提供升级时。

在安装期间在您的注册表中保留您的属性(您的功能目录属性):

<!--Put this inside a component-->
<RegistryKey Root="HKLM" Key="Software\MyCompany\MyApp" ForceCreateOnInstall="yes">
  <RegistryValue Type="string" Name="MYCUSTOMDIR" Value="[MYCUSTOMDIR]" KeyPath="yes"/>
</RegistryKey>

<!--Put this inside a component-->
<RegistryKey Root="HKLM" Key="Software\MyCompany\MyApp" ForceCreateOnInstall="yes">
  <RegistryValue Type="string" Name="MYCUSTOMDIRTWO" Value="[MYCUSTOMDIRTWO]" KeyPath="yes"/>
</RegistryKey>

非常重要!:这将写入HKLM\SOFTWARE\WOW6432Node\MyCompany\MyApp - 64位操作系统上注册表的32位部分。您可能需要从64位部分进行写入和读取。如果是这样,只需将Win64="yes"属性添加到Components和RegistrySearch元素。

链接:http://robmensching.com/blog/posts/2010/5/2/the-wix-toolsets-remember-property-pattern/

接下来使用注册表搜索

重新阅读它们
<Property Id="MYCUSTOMDIR">
  <RegistrySearch Id='MYCUSTOMDIR' Root='HKLM' Key='Software\MyCompany\MyApp' Name='MYCUSTOMDIR' Type='raw' />
</Property>

<Property Id="MYCUSTOMDIRTWO">
  <RegistrySearch Id='MYCUSTOMDIRTWO' Root='HKLM' Key='Software\MyCompany\MyApp' Name='MYCUSTOMDIRTWO' Type='raw' />
</Property>    

在理想的世界中,这应该足以达到你的目的。我没有时间测试在命令行中为升级设置这些属性时会发生什么(可能会发生)。

要创建主要升级进行测试,您基本上只需提升版本号的前三位数之一并编译新的MSI(重命名输出文件夹中的旧MSI以保留它) ) - 并生成一个新产品GUID(除非你将它设置为自动生成,在这种情况下版本凸起就足够了)。 MSI版本号应该只有3位数符合MSI标准。