WiX v5 is here! Let us help.

Beyond Files

In the real life out there, you'll probably need more to do than to copy files into their final repository. To create a registry keys, include them inside a RegistryKey in the component:

<RegistryKey Root='HKLM' Key='Software\Acme\Foobar 1.0'>
    <RegistryValue Type='string' Name='InstallDir' Value='[INSTALLDIR]'/>
    <RegistryValue Type='integer' Name='Flag' Value='0'/>
</RegistryKey>

Type can be string, integer, binary, expandable, or multiString. If the Name attribute is omitted, the default key will be created.

In the case of a multiString, use one or more MultiStringValue children to specify the individual strings. You can also include the Root and Key attributes directly on the RegistryValue element:

<RegistryValue Root='HKLM' Key='Software\Acme\Foobar 1.0' Type='multiString' Name='InstallDir'>
    <MultiStringValue>[TARGETDIR]</MultiStringValue>
    <MultiStringValue>[INSTALLDIR]</MultiStringValue>
    <MultiStringValue>[ProgramFilesFolder]</MultiStringValue>
</RegistryValue>

If your application handles its own file data type, you will need to register a file association for it. Put a ProgId inside your component. FileId should refer to the Id attribute of the File element describing the file meant to handle the files of this extension:

<ProgId Id='AcmeFoobar.xyzfile' Description='Acme Foobar data file'>
    <Extension Id='xyz' ContentType='application/xyz'>
        <Verb Id='open' Command='Open' TargetFile='FileId' Argument='"%1"' />
    </Extension>
</ProgId>

To assign an icon to this file type, you have to specify where the icon should come from:

<ProgId Id='AcmeFoobar.xyzfile' Description='Acme Foobar data file' Icon='Foobar.ico'>

or, if the icon comes from an executable or resource file containing several icons, you can specify which one:

<ProgId Id='AcmeFoobar.xyzfile' Description='Acme Foobar data file' Icon='Foobar.exe' IconIndex='1'>

And finally, if you want to write an .ini file---although the registry is more in vogue these days---this is what you need in your component:

<IniFile Id="WriteIntoIniFile" Directory="INSTALLDIR" Name="Foobar.ini" Action="addLine" Key="InstallDir" Section="Paths" Value="[INSTALLDIR]" />

In the next lesson we'll see how to implement a user interface so that the user can get a chance to decide what and where to install.