tags:

views:

497

answers:

1

I am looking for a way to test if certain third party libraries with certain versions have been installed. I want to check against registered dlls, and dont know where they were installed to in the filesystem. In this example I am making sure they have Prior version 1.50 installed:

<Property Id="PRIORGUID">
  <RegistrySearch Id="priorguid" Root="HKCR" Key="Prior.Encoders\CLSID" Type="raw"/>
</Property>

<Property Id="PRIORLOCATION">
  <RegistrySearch Id="priorlocation" Root="HKCR" Key="CLSID\[PRIORGUID]\InprocServer32" Type="file"/>
</Property>

<Property Id="PRIORVERCHECK">
  <DirectorySearch Id="priorversion" Path="[PRIORLOCATION]">
    <FileSearch Name="Prior.dll" MinVersion="1.49"/>
  </DirectorySearch>
</Property>

<Condition Message="This application requires Prior.">
  <![CDATA[Installed OR PRIORVERCHECK]]>
</Condition>

I basically find the library in the registry which points me to the file and then I look up the version in the file system. I am uneasy with this method. When I use Type="file", it seems to return a directory where the file is instead of returning the full path to the file itself. Does it always work this way? Also this means I have to know the base file name. If there was a way to split the full path into a name and directory then I could do the FileSearch without knowing the basename?

Is my method reliable? Is there a better way to do this? It seems like this would be a common problem. I am using WiX 3.

Thanks.

A: 

You can save lines by simple nesting a within the for PRIORLOCATION (see WiX documentation). Something along the lines of:

<RegistrySearch Id="_test" Root="HKLM" Key="Software\MyCompany\MyProgram" name="Executable"Type="file">
  <FileSearch Id="_oldexe2" Name="PROGRAM2.EXE" MinSize="200000" MaxSize="4000000" />
</RegistrySearch>
Thorsten Dittmar