Wix安装程序TARGETDIR INSTALLDIR设置为E:\

时间:2017-04-06 23:52:51

标签: wix

我正在努力与Wix安装程序。在安装过程中,INSTALLDIR被覆盖到自定义文件夹(而不是在Program Files中)。当我卸载时,无论我做什么,INSTALLDIR和TARGETDIR都设置为E:\。

我该如何解决这个问题?以下是相关摘要:

    <Property Id="ARPINSTALLLOCATION">
        <RegistrySearch Id="GetINSTALLDIRFromRegistry" Root="HKLM"
  Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductCode]" Name="InstallLocation" Type="raw" />
    </Property>

    <SetDirectory Id="TARGETDIR" Value="[ARPINSTALLLOCATION]">Installed</SetDirectory>

    <SetProperty Id="ARPINSTALLLOCATION" Value="[INSTALLDIR]" After="CreateFolders" Sequence="execute">NOT Installed</SetProperty>



  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="INSTALLDIR" Name="WinApp">
            </Directory>
    </Directory>
  </Fragment>

提前致谢。我正在使用Wix Tools 3.10。

更新1

以下是我的调查结果(现在。请更正我,因为我还是Wix的新手)

  • 与普遍看法相反,安装程序似乎在卸载期间不会自动设置安装文件夹。
  • 上述规则的一个重要例外是安装文件夹是“众所周知”的文件夹,如ProgramFilesFolder。

因此,如果您将目录结构设置为:

<Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="INSTALLDIR">
                <Directory Id="TEST" Name="WinApp" />
            </Directory>
    </Directory>
  </Fragment>

必须通过属性分配或自定义操作设置INSTALLDIR目录。例如:

<Property Id="INSTALLDIR"><![CDATA[C:\mydir1\mydir1]]></Property>

如果通过对话框动态设置INSTALLDIR,则必须从注册表或文件(安装期间存储它的位置)中读取它。

更新2

略有改进的版本

<SetProperty Id="ARPINSTALLLOCATION" Value="[INSTALLDIR]" Sequence="execute" After="InstallFiles" />

        <Property Id="INSTALLDIR" Secure="yes">
            <RegistrySearch Id="Locate_EXISTINGINSTALLDIR" Root="HKLM" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductCode]" Name="InstallLocation" Type="directory" />
        </Property>


        <CustomAction Id="SetTARGETDIR"
                                    Directory="TARGETDIR"
                                    Value="[INSTALLDIR]"
                                    Return="check" />


        <InstallExecuteSequence>
            <!--this action launches a window to allow the user to choose the folder. don't want 
                    to use standard MSI/Wix dialogs as the functionality is limited
            -->
            <Custom Action='SelectFolderCustomAction' Before='CreateFolders'>NOT Installed</Custom>
            <!--<Custom Action='RegistrationInfoCustomAction' Before='InstallFinalize'>NOT Installed</Custom>-->
            <!--<Custom Action='UninstallCustomAction' Before='RemoveFiles'>Installed AND REMOVE = "ALL"</Custom>-->
            <Custom Action="SetTARGETDIR" Before="RemoveFiles">Installed AND REMOVE = "ALL"</Custom>
        </InstallExecuteSequence>

2 个答案:

答案 0 :(得分:2)

我不明白你上面要做的是什么。为什么要从注册表中读取安装位置?

这是我安装到“D:\ Program Files”文件夹时所做的。

<Property Id="ROOTDRIVE"><![CDATA[D:\]]></Property>
<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFiles" Name="Program Files">

答案 1 :(得分:0)

删除SetDirectory元素,它已过时。安装产品后, Windows Installer会自动将目录属性设置为实际安装目录的路径。

RegistrySearch的{​​{1}}看起来也很奇怪。通常,此属性应仅在首次安装期间设置,您已使用ARPINSTALLLOCATION元素执行此操作。

所以以下内容应该足够了:

SetProperty