1

我知道这是 WiX 的一个常见问题,我知道解决这个问题可能很容易,但我被困住了,我找不到的主题都对我有帮助,所以我开始了。

我在 Visual Studio 中使用 WiX 3.11 并带有一个非常简单的 UI 对话框序列,取自wix 文档示例

<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
<UI>
      <UIRef Id="WixUI_InstallDir"/>
      <Publish Dialog="WelcomeDlg"    Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2"> 1 </Publish>
      <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg"    Order="2"> 1 </Publish>
</UI>

在我的目录定义中的其他地方定义了 INSTALLFOLDER。
如您所见,这非常简单:
- 欢迎
- 选择目录
- 结束安装

现在,我想修改此设置以在 .msi 升级时跳过 InstallDir 对话框,并直接在现有安装文件夹中进行升级。

我在 HKCU 中编写了一个注册表值,用于存储安装路径,并在安装时使用属性来检索它。我尝试使用条件在 UI 中创建不同的对话框序列并根据我的属性设置安装文件夹,但在运行 .msi 文件时出现错误。

这是它现在的样子:

<Product ...Some stuff here ... >

   <Property Id="ALREADYINSTALLED">
      <RegistrySearch Id="InstallPath" 
                      Key="Software\$(var.MainDir)\$(var.SecondaryDir)" 
                      Name="InstallFolder" 
                      Root="HKCU" 
                      Type="directory" 
                      Win64="$(var.Win64)"/>
   </Property>  

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

   <UI>
      <UIRef Id="WixUI_InstallDir"/>
      <Publish Dialog="WelcomeDlg"    Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>
      <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg"    Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>

      /!\ Interesting part here /!\
      <Publish Dialog="WelcomeDlg" Control="Next" Event="SetTargetPath" Value="[ALREADYINSTALLED]" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
      <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
   </UI>

</Product>

<Fragment>
   <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="$(var.PlatformProgramFilesFolder)">
         <Directory Id="SAFEFOLDER" Name="$(var.MainDir)">
             <Directory Id="INSTALLFOLDER" Name="$(var.SecondaryDir)" />
         </Directory>
      </Directory>
   </Directory>
</Fragment>

<Component ... Some stuff here ... >
   <RegistryValue Root="HKCU"
                   Key="Software\$(var.MainDir)\$(var.SecondaryDir)"
                   Name="InstallFolder"
                   Type="string"
                   Value="[INSTALLFOLDER]"
                   KeyPath="yes" />
   ... Some other stuff here ...
</Component>

我的条件似乎工作正常,但我无法使用该属性传递安装文件夹。
我觉得我错过了一些简单的东西,但我不知道是什么。

有人可以帮我吗?

4

1 回答 1

0

好吧,由于这个主题,我最终找到了解决方案。正如我所想,这很简单。
事实证明,您可以覆盖片段定义中的目录路径,因此解决方案是:

<Fragment>
   <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="$(var.PlatformProgramFilesFolder)">
         <Directory Id="SAFEFOLDER" Name="$(var.MainDir)">
             <Directory Id="INSTALLFOLDER" Name="$(var.SecondaryDir)" />
         </Directory>
      </Directory>
   </Directory>

   <!-- Overwrites the Install Folder if this is an upgrade -->
   <SetDirectory Id="INSTALLFOLDER" Value="[ALREADYINSTALLED]"> <![CDATA[ALREADYINSTALLED]]> </SetDirectory>
</Fragment>

然后,设置 UI 对话框以从 WelcomeDlg 转到 VerifyReadyDlg:

<UI>
     <UIRef Id="WixUI_InstallDir"/>
     <Publish Dialog="WelcomeDlg"    Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>
     <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg"    Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>

     <Publish Dialog="WelcomeDlg"     Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
     <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg"     Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
</UI>

你可以走了。

于 2017-06-22T08:51:08.667 回答