1
votes

I am struggling with Wix installer. During the install, the INSTALLDIR is overridden to a custom folder (not in Program Files). When I uninstall, the INSTALLDIR and the TARGETDIR gets set to E:\ no matter what I do.

How do I fix this? Here are the relevant snippets:

    <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>

Thanks in advance. I am using Wix Tools 3.10.

Update 1

Here are my findings (for now. please correct me as I am still new to Wix)

  • Contrary to popular belief, the installer does not seem to set the install folders automatically during uninstall.
  • An important exception to the above rule is when the install folders are "well known" folders like ProgramFilesFolder.

So, If you set your directory structure to this:

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

You must set the INSTALLDIR directory through a property assignment or through a custom action. For example:

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

If you set INSTALLDIR dynamically through a dialog box, you must read it from the registry or from a file (where you stored it during the install).

Update 2

Slightly improved version

<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

2 Answers

2
votes

I dont understand what you are trying to do above. Why are you reading the install location from the registry?

This is what I do for installing to "D:\Program Files" folder.

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

Remove the SetDirectory element, it's obsolete. When the product is already installed, Windows Installer automatically sets the directory properties to the pathes of the actual installation directories.

The RegistrySearch for ARPINSTALLLOCATION looks strange too. Normally this property should only be set during first install, which you already do by using the SetProperty element.

So the following should be enough:

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

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