From MSI to WiX, Part 15 - Installable Items - Ini files
The main page for the series is here.
Introduction
Today's topic is how to create and modify Ini files.
MSI story
Ini file contains configuration information that application needs during run-time.
MSI has two tables related to Ini files: IniFile and RemoveIniFile. IniFile table contains information about data which need to added to the Ini file on install or removed from the Ini file on uninstall. RemoveIniFile table describes the data which need to be removed from the Ini file on install.
Two standard actions must be scheduled in the Execute sequence tables: WriteIniValues and RemoveIniValues.
Here is the list of columns of the IniFile table:
Column | Description |
---|---|
IniFile | The primary key for the table. |
FileName | The localizable name of the .ini file in which to write the information. |
DirProperty | The name of the property which will be resolved to the full path of the folder containg the .ini file. If this field is blank, the WindowsFolder property will be used to determine the path. |
Section | The localizable .ini file section. |
Key | The localizable .ini file key within the section. |
Value | The localizable value to be written. |
Action | The type of modification to be made. |
Component_ | External key into the first column of the Component table. |
Here is the list of columns of the RemoveIniFile table:
Column | Description |
---|---|
RemoveIniFile | The primary key for the table. |
FileName | The localizable name of the .ini file in which to delete the information. |
DirProperty | The name of the property which will be resolved to the full path of the folder containg the .ini file. If this field is blank, the WindowsFolder property will be used to determine the path. |
Section | The localizable .ini file section. |
Key | The localizable .ini file key within the section. |
Value | The localizable value to be deleted. The value is required when Action is 4. |
Action | The type of modification to be made. |
Component_ | External key into the first column of the Component table. |
Removing the last value from a section deletes that section. There is no other way to delete an entire section other than removing all its values.
What we can do with the Ini file
These are the options we have when we add/delete value:
- Create a new entry or update it if entry already exist.
- Create a new entry if it does not exist.
- Remove entry.
- Create a new entry or append a tag if entry already exist.
- Remove a tag from the entry. If entry becomes empty, it will be removed.
Also, keep in mind that if you delete a last entry in the .ini file, file will be deleted.
How it translates to WiX?
To create/delete entries:
IniFile/Action | RemoveIniFile/Action | <IniFile> attribute | Description |
---|---|---|---|
msidbIniFileActionAddLine (0) | Action="addLine" | Create or update an .ini entry. | |
msidbIniFileActionCreateLine (1) | Action="createLine" | Create an .ini entry if entry does not exist. | |
msidbIniFileActionAddTag (3) | Action="addTag" | Creates a new entry or appends value to existing entry. | |
msidbIniFileActionRemoveLine (2) | Action="removeLine" | Removes an entry. | |
msidbIniFileActionRemoveTag (4) | Action="removeTag" | Removes a tag from an entry. If entry's value becomes empty, entry is removed. |
Examples
- Create a new entry if it does not exist:
<IniFile Id="Ini1"
Action="createLine"
Directory="INSTALLLOCATION"
Section="Test"
Name="Minimal.ini"
Key="TestKey"
Value="TestValue" />
Creates this:
[Test]
TestKey=TestValue
- Add a tag to already existing entry:
<IniFile Id="Ini1"
Action="addTag"
Directory="INSTALLLOCATION"
Section="Test"
Name="Minimal.ini"
Key="TestKey"
Value="TestValue2" />
Creates this:
[Test]
TestKey=TestValue,TestValue2
- Remove a tag:
<IniFile Id="Ini1"
Action="removeTag"
Directory="INSTALLLOCATION"
Section="Test"
Name="Minimal.ini"
Key="TestKey"
Value="TestValue" />
Creates this:
[Test]
TestKey=TestValue2
Here is the sample which installs ini file both in the installation folder and Windows folder. Code for this sample is attached.
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="https://schemas.microsoft.com/wix/2003/01/wi">
<?include ..\..\Common\CommonDefinitions.wxi ?>
<?include Definitions.wxi ?>
<Product Id="$(var.ProductCode)"
Name="$(var.ProductName)"
Language="$(var.Language)"
Version="$(var.CurrentVersion)"
Manufacturer="$(var.Manufacturer)"
UpgradeCode="$(var.UpgradeCode)" >
<Package Id="$(var.PackageCode)"
Description="$(var.PackageDescription)"
Comments="$(var.PackageComments)"
InstallerVersion="200"
Compressed="yes"
Languages="$(var.Languages)" />
<?include ..\..\Common\ARP.wxi ?>
<Media Id="1" Cabinet="Product.cab" EmbedCab="yes" />
<?include ..\..\Common\UpgradeSupport.wxi ?>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION"
Name="Minimal"
LongName="MinimalInstallation">
<Component Id="TestIni"
Guid="{DC752365-A598-4B76-AC60-C99BF34D539F}">
<CreateFolder />
<IniFile Id="Ini1"
Action="createLine"
Directory="INSTALLLOCATION"
Section="Test"
Name="Minimal.ini"
Key="TestKey"
Value="TestValue" />
<IniFile Id="Ini2"
Action="createLine"
Directory="WindowsFolder"
Section="Test"
Name="Minimal.ini"
Key="TestKey"
Value="WindowsFolder TestValue" />
</Component>
</Directory>
</Directory>
</Directory>
<Feature Id="MainFeature"
Title="TestApp application"
Level="1">
<ComponentRef Id="TestIni" />
</Feature>
</Product>
</Wix>
Comments
Anonymous
August 20, 2008
The comment has been removedAnonymous
August 20, 2008
I've updated this post to include sample and attachment with this sample.Anonymous
January 09, 2009
Hi Alex, I am new with WIX and I am searching for how to make a multilingual .msi installer. Is there any way to do this?Anonymous
December 30, 2009
The comment has been removedAnonymous
April 05, 2012
@questsid <IniFile Id="Ini2" Action="createLine" Directory="WindowsFolder" Section="Test" Name="Minimal.ini" Key="TestKey" Value="[PROPERTYNAMEFOREDITBOXWHICHHASIPVALUE]" />Anonymous
August 21, 2012
@ron I think you're a few years too late....Anonymous
December 13, 2013
I never know why people jump in and say, "you are a few years too late". I stumbled across this page, and found an answer I was looking for. Now, if our friend Ron here didn't put his answer, I would still be looking. So, just because he jumped in years later, it was unanswered -- that is, until Ron did. So, for that, I applaud him ;o)Anonymous
January 20, 2014
I get a 2343 file not found error in uninstall process, when I use inifile element to edit file that I just installed. It seems that in uninstall process Wix tries to restore ini file parameters, but at that time that ini filie is already deleted. Is there any way to control sequence of inifile actions during install and uninstall?