<quote> What is WiX?
The Windows Installer XML (WiX) platform is a set of tools and specifications that allow you to easily create Windows Installer database files (MSI and MSM). The WiX tools model the traditional compile and link model used to create executables from source code. For WiX, source code is written in xml files. These files are validated against a schema, wix.xsd, then processed by a preprocessor, compiler, and linker to create the desired result. The WiX platform has been designed to allow for the easy creation of multiple Windows Installer databases from a small set of source files. </quote> <quote> The Redmond software giant is making its Windows installer technology under OSI's Common Public License. snip Microsoft made available an internally-developed product called the "Windows Installer XML" (WiX) to SourceForge. The code is downloadable here: http://sourceforge.net/projects/wix/ WiX is a toolset for building Windows installation packages from XML source code. It runs on Windows NT and Windows 2000. </quote> Dark is a tool for converting an MSI or MSM file into a WiX source file. An Apache2 example of the WiX decompiler Dark.exe ran on Windows XP: C:\WIX>dark.exe Apache_2.0.49-win32-x86-no_ssl.msi apache249.wxs Microsoft (R) MSI to Wix 2.0 Decompiler Version 0.1 Copyright (C) Microsoft Corporation 2003. All rights reserved. Apache_2.0.49-win32-x86-no_ssl.msi C:\WIX>dir 04/11/2004 03:29 PM <DIR> . 04/11/2004 03:29 PM <DIR> .. 04/11/2004 03:30 PM 387,080 apache249.wxs 04/11/2004 03:30 PM 6,097,408 apache_2.0.49-win32-x86-no_ssl.msi 04/05/2004 12:25 PM 24,576 candle.exe 04/05/2004 02:39 AM 11,666 CPL.TXT 04/05/2004 12:25 PM 24,576 dark.exe 04/11/2004 03:07 PM <DIR> doc 04/05/2004 12:25 PM 28,672 light.exe 04/05/2004 12:25 PM 24,576 lit.exe 04/05/2004 12:25 PM 737,280 wix.dll 04/05/2004 12:21 PM 86,016 wixcab.dll 9 File(s) 7,421,850 bytes apache249.wxs contains: <?xml version="1.0" encoding="utf-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi"> <Product UpgradeCode="0EA14757-3D48-4F78-878E-B9AF261753D9" Name="Apache HTTP Server 2.0.49" Version="2.0.49" Manufacturer="Apache Software Foundation" Id="3A862C7D-0504-48BC-AEF8-7F7479C7C158" Language="1033"> <Package Id="CC46F4F0-4B90-425F-B164-23EFE176F359" Keywords="Installer; MSI; Database" Description="The Apache HTTP Web Server" Comments="Contact: Your local administrator" Manufacturer="Apache Software Foundation" InstallerVersion="110" Platforms="Intel" Languages="1033" SummaryCodepage="1252" /> <Property Id="DiskPrompt">[1]</Property> <Property Id="Registration">No</Property> <Property Id="DialogCaption">Installation Wizard</Property> <Property Id="ProductID">None</Property> <Property Id="ISReleaseFlags">NoSSL</Property> <Property Id="ALLUSERS">1</Property> snip <Property Id="ReinstallModeText">omus</Property> <Property Id="ARPCONTACT">Apache Users Mailing List</Property> <Property Id="ARPNOREPAIR">0</Property> <Property Id="ARPURLINFOABOUT">http://httpd.apache.org/</Property> <Property Id="ARPURLUPDATEINFO">http://www.apache.org/dist/httpd/binaries/win32/ </Property> <Property Id="ARPPRODUCTICON">apache.exe</Property> snip <Property Id="SERVICENAME">Apache2</Property> <Property Id="SERVICEINTERNALNAME">Apache2</Property> <Property Id="SERVERPORT">80</Property> <Property Id="EXISTING_APACHE_SERVICE_PATH"> <RegistrySearch Id="ExistingApacheService" Root="HKLM" Key="System\CurrentControlSet\Services\[SERVICEINTERNALNAME]" Name="ImagePath" Type="registry" /> </Property> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="AppDataFolder" Name="." SourceName="APPLIC~1" LongSource="Application Data" /> <Directory Id="CommonFilesFolder" Name="." SourceName="Common" /> <Directory Id="DesktopFolder" Name="." SourceName="Desktop" /> snip <Directory Id="ProgramFilesFolder" Name="." SourceName="PROGRA~1" LongSource="program files"> <Directory Id="INSTALLDIR" Name="APACHE~1" LongName="Apache Group"> <Directory Id="APACHEDIR" Name="Apache2"> <Component Id="ApacheAdmin" Guid="CBAA1CEC-C5BD-40B3-A5AE-B277C0BF46ED"> <Condition>ALLUSERS</Condition> <Registry Root="HKLM" Key="SOFTWARE\Apache Group\Apache\2.0.49" Name="ServerRoot" Value="[APACHEDIR]" Id="Registry5" /> <Registry Root="HKLM" Key="SOFTWARE\Apache Group\Apache\2.0.49" Name="Shared" Value="#1" KeyPath="yes" Id="Registry6" /> <Registry Root="HKLM" Key="SOFTWARE\Classes\.conf" Value="txtfile" Id="Registry9" /> snip <Shortcut Id="Shortcut4" Directory="Dir68" Name="Stop" Target="[#F98246_Apache.exe]" Description="Stop the Apache http Server" Arguments="-w -n "[SERVICENAME]" -k stop " Show="normal" WorkingDirectory="APACHEDIR" /> <Shortcut Id="Shortcut5" Directory="Dir68" Name="Start" Target="[#F98246_Apache.exe]" Description="Start the Apache http Server" Arguments="-w -n "[SERVICENAME]" -k start" Show="normal" WorkingDirectory="APACHEDIR" /> </Component> <Component Id="ApacheNonAdmin" Guid="DFE85255-CA1B-48E9-B4A8-93565D3F44BA"> <Condition>Not ALLUSERS</Condition> <Registry Root="HKCU" Key="SOFTWARE\Apache Group\Apache\2.0.49" Name="Installed" Value="#1" KeyPath="yes" Id="Registry28" /> <Shortcut Id="Shortcut8" Directory="Dir68" Name="STARTA~1" LongName="Start Apache in Console" Target="[#F98246_Apache.exe]" Description="Start Apache http Server in a Console Window" Arguments="-w -f "[APACHECONFDIR]httpd.conf" -d "[APACHEDIR]."" Show="normal" WorkingDirectory="APACHEDIR" /> </Component> snip <Directory Id="APACHEMANUALDIR" Name="manual"> <Component Id="manual" Guid="6373C7DB-DD21-47AC-B8F5-6D342B38460C"> <File Id="F168793_index.html.en" Name="INDEXH~1.EN" LongName="index.html.en" Compressed="yes" KeyPath="yes" DiskId="1" /> <File Id="F260050_LICENSE" Name="LICENSE" Compressed="yes" DiskId="1" /> <File Id="F260051_bind.html" Name="BIND~1.HTM" LongName="bind.html" Compressed="yes" DiskId="1" /> snip <File Id="F260276_urlmapping.xml.ko" Name="URLMAP~1.KO" LongName="urlmapping.xml.ko" Compressed="yes" DiskId="1" /> <File Id="F260277_urlmapping.xml.meta" Name="URLMAP~1.MET" LongName="urlmapping.xml.meta" Compressed="yes" DiskId="1" /> </Component> <Directory Id="Dir43" Name="DEVELO~1" LongName="developer"> <Component Id="manual_developer" Guid="1795F656-B757-40B7-BECE-5D6E4B0F77AD"> <File Id="F235778_index.html.en" Name="INDEXH~1.EN" LongName="index.html.en" Compressed="yes" KeyPath="yes" DiskId="1" /> <File Id="F260278_API.html" Name="API~1.HTM" LongName="API.html" Compressed="yes" DiskId="1" /> snip <File Id="F261048_namebased.xml.ko" Name="NAME-B~1.KO" LongName="name-based.xml.ko" Compressed="yes" DiskId="1" /> <File Id="F261049_namebased.xml.meta" Name="NAME-B~1.MET" LongName="name-based.xml.meta" Compressed="yes" DiskId="1" /> </Component> </Directory> </Directory> <Directory Id="APACHEHTDOCSDIR" Name="htdocs"> <Component Id="htdocs" Guid="1D13B3F6-54C4-4920-AF8B-6DBA702F9E44"> <File Id="F168518_index.html.en" Name="INDEXH~1.EN" LongName="index.html.en" Compressed="yes" KeyPath="yes" DiskId="1" /> <File Id="F259467_index.html.ca" Name="INDEXH~1.CA" LongName="index.html.ca" Compressed="yes" DiskId="1" /> snip <Directory Id="APACHECONFDIR" Name="conf"> <Component Id="conf" Guid="00557AFD-F5B5-4EFF-87D3-8942174F9778"> <File Id="F45780_mime.types.default" Name="MIMETY~1.DEF" LongName="mime.types.default" Compressed="yes" KeyPath="yes" DiskId="1" /> <File Id="F45781_magic.default" Name="MAGIC~1.DEF" LongName="magic.default" Compressed="yes" DiskId="1" /> <RemoveFile Directory="APACHECONFDIR" Name="HTTPDC~1.DEF|httpd.conf.default" On="install" Id="R01" /> <RemoveFile Directory="APACHECONFDIR" Name="HTTPDD~1.CON|httpd.default.conf" On="uninstall" Id="R02" /> <RemoveFile Directory="APACHECONFDIR" Name="SSLDEF~1.CON|ssl.default.conf" On="install" Id="R03" /> </Component> <Component Id="conf_temp" Guid="0E1C777D-47A6-4775-93D4-0A5464767D25" KeyPath="yes"> <File Id="F46421_InstallConf.awk" Name="INSTAL~1.AWK" LongName="InstallConf.awk" Compressed="yes" DiskId="1" /> <File Id="F98940_httpdwin.conf" Name="HTTPD-~1.CON" LongName="httpd-win.conf" Compressed="yes" DiskId="1" /> <CreateFolder /> </Component> </Directory> <Directory Id="APACHEBINDIR" Name="bin"> <Component Id="Apache" Guid="93F0E04F-8467-4A8B-8B02-11A6C766F196"> <File Id="F98246_Apache.exe" Name="Apache.exe" Compressed="yes" KeyPath="yes" DiskId="1" /> snip <Media Id="1" DiskPrompt="1" EmbedCab="yes" Cabinet="Data.Cab" VolumeLabel="DISK1" /> <CustomAction Id="InstallConfFiles" BinaryKey="awk_exe" ExeCommand="-f "[#F46421_InstallConf.awk]" "[SERVERDOMAIN]" "[SERVERNAME]" "[SERVERADMIN]" [SERVERPORT] "[APACHEDIR] "" Return="ignore" Execute="commit" /> <CustomAction Id="SelfInstallService" FileKey="F98246_Apache.exe" ExeCommand="-w -k install -n "[SERVICENAME]" -f "[APACHECONFDIR]httpd.conf" -d "[APACHEDIR]."" Return="ignore" Execute="commit" /> <CustomAction Id="SelfRemoveService" FileKey="F98246_Apache.exe" ExeCommand="-k uninstall -n "[SERVICENAME]" -f "[APACHECONFDIR]httpd.conf" -d "[APACHEDIR]."" Return="ignore" Execute="deferred" /> <CustomAction Id="ResolveServerName" BinaryKey="real_features_dll" DllEntry="[EMAIL PROTECTED]" Return="asyncNoWait" /> <CustomAction Id="SelfStartService" FileKey="F98246_Apache.exe" ExeCommand="-w -k start -n "[SERVICENAME]"" Return="asyncNoWait" Execute="commit" /> <CustomAction Id="SelfStopService" FileKey="F98246_Apache.exe" ExeCommand="-k stop -n "[SERVICENAME]" -f "[APACHECONFDIR]httpd.conf" -d "[APACHEDIR]."" Return="ignore" Execute="deferred" /> <CustomAction Id="RemovePriorService" FileKey="F98246_Apache.exe" ExeCommand="-k uninstall -n "[SERVICENAME]" -f "[APACHECONFDIR]httpd.conf" -d "[APACHEDIR]."" Return="ignore" Execute="commit" /> <CustomAction Id="ValidateServerName" BinaryKey="real_features_dll" DllEntry="[EMAIL PROTECTED]" Return="ignore" /> <CustomAction Id="StartApacheMonitor" FileKey="F161005_ApacheMonitor.exe" ExeCommand="" Return="asyncNoWait" Execute="commit" /> <CustomAction Id="StopPriorService" FileKey="F98246_Apache.exe" ExeCommand="-k stop -n "[SERVICENAME]" -f "[APACHECONFDIR]httpd.conf" -d "[APACHEDIR]."" Return="ignore" Execute="commit" /> <UI> <Property Id="DefaultUIFont">Tahoma8</Property> <Property Id="ErrorDialog">SetupError</Property> <Dialog Id="SetupCompleteError" Width="374" Height="267" Title="[ApplicationName] - Installation Wizard" NoMinimize="yes" CustomPalette="yes"> <Control Id="Finish" Type="PushButton" X="230" Y="243" Width="66" Height="17" Default="yes" Cancel="yes" Text="&Finish"> <Publish Event="DoAction" Value="CleanUp">ISSCRIPTRUNNING="1"</Publish> <Publish Event="EndDialog" Value="Exit">1</Publish> snip <Show Dialog="MaintenanceWelcome" After="SetupResume">Installed And Not RESUME And Not Preselected And Not PATCH</Show> <Show Dialog="SetupProgress" After="MaintenanceWelcome" /> </InstallUISequence> </UI> <AdvtExecuteSequence /> <AdminExecuteSequence /> <InstallExecuteSequence> <Custom Action="SelfStopService" After="StopServices">?ApacheAdmin=3 And EXISTING_APACHE_SERVICE_PATH</Custom> <Custom Action="SelfRemoveService" After="DeleteServices">$ApacheAdmin=2 And EXISTING_APACHE_SERVICE_PATH</Custom> <Custom Action="InstallConfFiles" After="InstallFiles">$conf=3 Or (?conf=3 And $conf<>2)</Custom> <Custom Action="StopPriorService" After="CreateShortcuts">$ApacheAdmin=3 And ?ApacheAdmin<>3 And EXISTING_APACHE_SERVICE_PATH</Custom> <Custom Action="RemovePriorService" After="StopPriorService">$ApacheAdmin=3 And EXISTING_APACHE_SERVICE_PATH</Custom> <Custom Action="SelfInstallService" After="RegisterComPlus">$ApacheAdmin=3</Custom> <Custom Action="SelfStartService" After="InstallServices">$ApacheAdmin=3 Or (?ApacheAdmin=3 and $ApacheAdmin<>2)</Custom> <Custom Action="StartApacheMonitor" After="SelfRegModules">$ApacheMonitor=3 Or (?ApacheMonitor=3 and $ApacheMonitor<>2)</Custom> </InstallExecuteSequence> <Binary Id="awk_exe" src="Binary\awk_exe.ibd" /> <Binary Id="real_features_dll" src="Binary\real_features_dll.ibd" /> <Binary Id="Binary2" src="Binary\Binary2.ibd" /> snip <Binary Id="Binary17" src="Binary\Binary17.ibd" /> <Binary Id="Binary18" src="Binary\Binary18.ibd" /> <Icon Id="apache.exe" src="Icon\apache.exe.ibd" /> </Product> </Wix> WiX covers the installation package file (.msi) and the merge module file (.msm). WiX includes full CSharp source files, already compiled binary .NET files and docs. Jeff