Well there is the free way and the $$$ way. I cannot document everything here but this should get you started.
On a side note, yes, Windows Installer is a maddening technology. There are many times where I think a task will be straight forward but actually becomes complicated. You definitely have to immerse yourself to understand it.
In any case, here goes:
Free: WIX (here)
This is a free tool to generate MSI files from a set of XML configuration files. I'll leave you to find tutorials online, but here is the crux:
You can compress your EXE into the installer by using the following tag in the WXS file:
<Binary Id="MYEXE" src="<path to my exe?"/>
Then you can create a custom action which launches your EXE
<CustomAction Id="EXECA_CALLMYEXE" Return="check" Execute="deferred" BinaryKey="MYEXE"
ExeCommand="my command line"/>
Then you insert your custom action into the InstallExecuteSequence in the appropriate spot (I almost always run mine somewhere between InstallInitialize and InstallFinalize)
<InstallExecuteSequence>
<Custom Action="EXECA_CALLMYEXE" After="InstallInitialize"><![CDATA[Not REMOVE]]></Custom>
$$$: Get Installshield (HERE
First create a "Basic MSI" project and make sure you say you want no setup.exe generated. You set this in the Release settings.
Then you essentially do the same thing as with WIX but you have a UI for it.
- You can specify your helper EXE by using the Direct Editor and putting your EXE in the 'Binary' table
- You can create a custom action to launch that EXE from the "Custom Actions" Node in the tree on the left
- You can insert the custom action by selecting "Install Sequences" and putting it in the InstallExecuteSequence somewhere between InstallInitialize and InstallFinalize as I said before.
Sorry I could not be more detailed, but this should be a good start.