user1006720
user1006720

Reputation: 29

How to set TARGETDIR or INSTALLDIR from a registry entry?

I've got great problems setting the install dir from a value in the Windows registry which I set the last time the setup ran. This to default the path correctly. The odd thing here is that we always let the user set the installation path, even on an upgrade and if it differs from the folder of the last installation, then we don't do RemoveExistingProducts in order to let the user run several versions of the application side-by-side.

Now, I've been searching the web for a solution and I've found many suggestions but none of these actually affects my INSTALLDIR which I can see in the setup UI where I get to choose where to install.

Here's what I got at the moment:

<Property Id="PREVINSTALLDIR">
   <RegistrySearch Id="PrevInstallDir" 
                   Root="HKCU" 
                   Key="Software\MyCompany\MyApp" 
                   Name="InstallDir" 
                   Type="raw" />
</Property>

<CustomAction Id="SetTargetDir" Property="TARGETDIR" 
              Value="[PREVINSTALLDIR]" 
              Execute="firstSequence" />

<InstallExecuteSequence>
   <Custom Action="SetTargetDir" Before="CostFinalize"></Custom>
   <RemoveExistingProducts After="InstallFinalize">PREVINSTALLDIR ~= INSTALLDIR</RemoveExistingProducts>
</InstallExecuteSequence>

Can anyone spot what I'm doing wrong here?

Note, the RemoveExistingProducts part works so PREVINSTALLDIR has been read. In the setup log I can also see this:

Action start 13:50:27: AppSearch. 
AppSearch: Property: PREVINSTALLDIR, Signature: PrevInstallDir 
Action ended 13:50:27: AppSearch. Return value 1. 

When exiting the setup, properties are dumped into the log file and I see this:

Property(C): PREVINSTALLDIR = C:\Some\Path\MyApp 
Property(C): TARGETDIR = C:\ 
Property(C): MyAppDir = C:\ProgramData\Microsoft\Windows\Start Menu\Programs\MyApp\ 
Property(C): INSTALLDIR = C:\Program Files (x86)\MiTek\MyApp\ 

INSTALLDIR is not affected by my wix script above, neither is TARGETDIR which I would assume would be C:\Some\Path\MyApp as well.

I've tried a bunch of things here but regardless I just can't make TARGETDIR nor INSTALLDIR change.

Upvotes: 0

Views: 6089

Answers (2)

Dmitriy Konovalov
Dmitriy Konovalov

Reputation: 1817

This worked for me:

<!-- Existing install path -->
<Property Id="EXISTINGINSTALLDIR" Secure="yes">
    <RegistrySearch Id="Locate_EXISTINGINSTALLDIR" Root="HKCU" Key="Software\$(var.CompanyName)\$(var.ProductName)" Name="InstallDir" Type="directory" />
</Property>

<!-- custom action specification -->
<CustomAction Id="Set_INSTALLDIR" Execute="firstSequence" Property="INSTALLDIR" Value="[EXISTINGINSTALLDIR]" />

<InstallExecuteSequence>
    <Custom Action="Set_INSTALLDIR" After="FileCost"><![CDATA[NOT Installed AND (NOT INSTALLDIR) AND EXISTINGINSTALLDIR]]></Custom>
</InstallExecuteSequence>

<InstallUISequence>
  <Custom Action="Set_INSTALLDIR" After="FileCost"><![CDATA[NOT Installed AND (NOT INSTALLDIR) AND EXISTINGINSTALLDIR]]></Custom>
</InstallUISequence>

Upvotes: 3

Natalie Carr
Natalie Carr

Reputation: 3797

Hi I managed to get my INSTALLLOCATION changed using this:

<SetDirectory Id="INSTALLLOCATION" Value="[$(var.PlatformProgramFilesFolder)]\[$(var.Manufacturer)]\[ProductName]" Sequence="both"></SetDirectory>

Value has to be a full path..hope this helps..:)

Upvotes: 1

Related Questions