Reputation: 71
I have a special situation I need to find a workaround for. I have an wix installer for my 32-bit application, but it has a dependency on an office document file that must go in a fixed place under the "Program Files" folder regardless of 32/64 bit windows versions. Please for a moment just accept that its location cannot be changed due to preserving backwards compatibility for an app that has been around since the XP days. I need to install my app in the "Program Files (x86)" folder as well as deliver this file that must reside in "Program Files". I do not want to split them into two installers if at all possible. Anyone know of any possible way to make this work?
Upvotes: 2
Views: 3313
Reputation: 20790
Attempts to install into 64-bit folders from a 32-bit MSI install result in redirection to the 32-bit location, this appears in a log of the install with this kind of entry:
WIN64DUALFOLDERS: 'C:\Program Files (x86)\' will substitute 17 characters in 'C:\Program Files\Wi......
PROPERTY CHANGE: Modifying TARGETDIR property. Its current value is 'C:\Program Files\Wilson\NewSetup'. Its new value: 'C:\Program Files (x86)\Wilson\NewSetup\'.
32-bit packages can contain only 32-bit components, the docs are explicit about that.
If there is one file that needs to be delivered to the 64-bit Program Files location then the usual fix is to have something in the application that copies it to that location the first time it runs. 32-bit apps can temporarily disable the redirection by calling Wow64DisableWow64FsRedirection().
As it says here, if you've not seen it yet:
and a 64-bit app (that can also contain 32-bit components) would solve the problem, which I suspect you already know.
Upvotes: 1
Reputation: 4798
You should be able to include "ProgramFiles64Folder" in your directory definition and then use that dir as the directory for the components that need to go into the 64-bit location.
You'll likely have to include two components which duplicate the same files where one component installs into the "C:\Programs Files" on a 64-bit machine and the other one installs into "C:\Programs Files" on a 32-bit machine.
I do something like this with some snmp related files. An example of what I mean:
<ComponentGroup Id="Files_32" Directory="OfficeProgramFilesFolder">
<Component Id="SomeFile.dll_32" >
<Condition>NOT VersionNT64</Condition>
<File Id="SomeFile.dll_32" KeyPath="yes" Source="$(var.BinariesDir)\_bin\Win32\SomeFile.dll" />
</Component>
</ComponentGroup>
<ComponentGroup Id="Files_64" Directory="OfficeProgramFiles64Folder">
<Component Id="SomeFile.dll_64" Win64="yes">
<Condition>VersionNT64</Condition>
<File Id="SomeFile.dll_64" KeyPath="yes" Source="$(var.BinariesDir)\_bin\x64\SomeFile.dll" />
</Component>
</ComponentGroup>
This should install the file into the "C:\Program Files" whether it is a 32-bit or 64-bit machine.
You will get an ICE warning if the file is exactly the same between the 64-bit and 32-bit components but it is okay because they are mutually exclusive.
Upvotes: 1