Question

I want to copy some files into a directory in another product's installation tree, but only if that product is installed. So I figured I could set a property based on a registry search to find that product's installation root. Then I could use the property in a condition element on the component element.

Here is my code. For some reason, I am getting an error when the other product is not installed and the registry search comes up empty since the registry key will not be found.

<Property Id="PRODUCTPATH">
  <RegistrySearch Id="PRODUCTPATH" Root="HKLM" Key="_MY_KEY_" Name="_MY_NAME_" Type="raw" />
</Property>

<SetProperty Id="PRODUCTBINPATH" Value="[PRODUCTPATH]\BIN" After="AppSearch"/>

<Component Id="CommonDLLs" Guid="_MY_GUID_" Directory="INSTALLLOCATION">
  <Condition>PRODUCTPATH</Condition>
  <RegistryValue Id="_MY_ID_" Root="HKLM" Key="_MY_KEY_2" Name="Installed" Value="1" Type="integer" KeyPath="yes" />
  <CopyFile Id="myfile1.dll" FileId="myfile1.dll" DestinationProperty="PRODUCTPATH" DestinationName="myfile1.dll"/>
  <CopyFile Id="myfile2.dll" FileId="myfile2.dll" DestinationProperty="PRODUCTPATH" DestinationName="myfile2.dll"/>
</Component>
Was it helpful?

Solution 2

Actually, all you have to do is add a condition to the SetProperty element like this:

<Property Id="PRODUCTPATH">

<SetProperty Id="PRODUCTBINPATH" Value="[PRODUCTPATH]\BIN" After="AppSearch">PRODUCTPATH</SetProperty>

OTHER TIPS

Try to use the util:RegistrySearch instead of RegistrySeach This element comes with Util Extension. Check here if you don't know how to use extensions.

The util:RegistrySearch has an attribute (Result) for only checking if the key exists or not.

It would be like that:

<util:RegistrySearch
   Id="PRODUCTPATH"
   Variable="PRODUCTPATH"
   Root="HKLM" 
   Key="_MY_KEY_" 
   Format="raw"
   Result="exists">
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top