Search code examples
wixwindows-installertwincat

32/64 bit WiX Combined Installer-Copying files only


I have an msi that copies files (PLC Code) to a directory(C:\Product\3.1\Boot), and modifies one key.

My visual studio project generates different PLC Code for the different architectures, but the destination is the same on both platforms. They key is in a different spot.

I have looked at using the arch-switch and conditional statements, but these look to only detect the architecture on which it is compiled, and not where the msi is run.

I know that you cant have 32/64 in the same MSI, but I'm not doing anything other than copying files and changing registries. I'm not putting anything in the windows directories/program files.

Though I would like it to appear with a version in the list of programs.

Is it possible in this case to have one installer?

Code '''

<Product Id="*" 
         Name="Company" 
         Language="1033" 
         Version="4.09" 
         Manufacturer="CompanyInc." 
         UpgradeCode="YOUR_GUID"
         >
    <Package Id ="*" 
             InstallerVersion="200" 
             InstallPrivileges="elevated"
             Compressed="yes" 
             InstallScope="perMachine"
             Description="Company PLC Code"
             Manufacturer="CompanyInc."
             Keywords="PLC"
             Comments="F"
             />

    <!--Upgrade/install control-->
    <MajorUpgrade 
                  AllowDowngrades="yes"
                  />

    <!--GUI for install display-->



    <UI>
        <UIRef Id="WixUI_Minimal" />    <!--Define type of UI -->
    </UI>


    <Upgrade Id="GUID_HERE">
        <UpgradeVersion OnlyDetect="no" 
                        Property="SELFFOUND"
                        Minimum="1.0"
                        />
    </Upgrade>


    <MediaTemplate EmbedCab="yes" />

    <!-- Set the icon used in the programs and features list-->
    <Icon Id='ProductIcon' SourceFile='Company.ico' />
    <Property Id='ARPPRODUCTICON' Value='ProductIcon' />


    <!-- Things to install-->
    <Feature Id="Default" Title="PLC Code" Level="1">
        <ComponentGroupRef Id="ProductComponentsx64" />
    </Feature>

    <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="ProgramFilesFolder">
            <Directory Id="INSTALLFOLDER" Name="Company PLC" />
            <Directory Id="BOOTDIR" />
                <Directory Id="PLCDIR" />
        </Directory>

    </Directory>

    <SetDirectory Id="BOOTDIR" Value="C:\CompanySoftware\3.1\Boot" />
    <SetDirectory Id="PLCDIR" Value="C:\CompanySoftware\3.1\Boot\Plc" />


    <!--Specify when actions occur actions during install-->
    <InstallExecuteSequence>
        <Custom Action="ARCHIVEBOOTDIR" After ="CostFinalize"  />
        <!--ToDo: copy files-->
    </InstallExecuteSequence>
</Product>




<Fragment>
    <!--64 bit systems: Place files in appropriate directories and modify registry key for Company to autostart -->
    <ComponentGroup Id="ProductComponentsx64">
        <Component Id="BootComponents" Guid="" Directory="BOOTDIR">
            <File Id="CurrentConfig.xml" Source="..\_Boot\CompanySoftware RT (x64)\CurrentConfig.xml" KeyPath="no" />
        </Component>
        <Component Id="PLCComponent" Guid="" Directory="PLCDIR">
            <File Id="Port_851.app" Source="..\_Boot\CompanySoftware RT (x64)\Plc\Port_851.app" KeyPath="no" />
            <File Id="Port_851.autostart" Source="..\_Boot\CompanySoftware RT (x64)\Plc\Port_851.autostart" KeyPath="no" />
            <File Id="Port_851.cid" Source="..\_Boot\CompanySoftware RT (x64)\Plc\Port_851.cid" KeyPath="no" />
            <File Id="Port_851.crc" Source="..\_Boot\CompanySoftware RT (x64)\Plc\Port_851.crc" KeyPath="no" />
            <File Id="Port_851.occ" Source="..\_Boot\CompanySoftware RT (x64)\Plc\Port_851.occ" KeyPath="no" />
            <File Id="Port_851.ocm" Source="..\_Boot\CompanySoftware RT (x64)\Plc\Port_851.ocm" KeyPath="no" />
            <File Id="Port_851_boot.tizip" Source="..\_Boot\CompanySoftware RT (x64)\Plc\Port_851_boot.tizip" KeyPath="no" />
        </Component>
        <Component Id="StartupReg" Guid="" Directory="TARGETDIR">
            <RegistryKey Root="HKLM"
                         Key="Software\WOW6432Node\Company\CompanySoftware3\System">
                <RegistryValue Name="SysStartupState"
                               Type="integer"
                               Value ="5"/>
            </RegistryKey>
        </Component>
    </ComponentGroup>
</Fragment>


<Fragment>
    <!--32 bit systems: Place files in appropriate directories and modify registry key for Company to autostart -->
    <ComponentGroup Id="ProductComponentsx86">
        <Component Id="BootComponents" Guid="" Directory="BOOTDIR">
            <File Id="CurrentConfig.xml" Source="..\_Boot\CompanySoftware RT (x86)\CurrentConfig.xml" KeyPath="no" />
            <File Id="Company.ico" Source="Company.ico" KeyPath="no" />
        </Component>
        <Component Id="PLCComponent" Guid="" Directory="PLCDIR">
            <File Id="Port_851.app" Source="..\_Boot\CompanySoftware RT (x86)\Plc\Port_851.app" KeyPath="no" />
            <File Id="Port_851.autostart" Source="..\_Boot\CompanySoftware RT (x86)\Plc\Port_851.autostart" KeyPath="no" />
            <File Id="Port_851.cid" Source="..\_Boot\CompanySoftware RT (x86)\Plc\Port_851.cid" KeyPath="no" />
            <File Id="Port_851.crc" Source="..\_Boot\CompanySoftware RT (x86)\Plc\Port_851.crc" KeyPath="no" />
            <File Id="Port_851.occ" Source="..\_Boot\CompanySoftware RT (x86)\Plc\Port_851.occ" KeyPath="no" />
            <File Id="Port_851.ocm" Source="..\_Boot\CompanySoftware RT (x86)\Plc\Port_851.ocm" KeyPath="no" />
            <File Id="Port_851_boot.tizip" Source="..\_Boot\CompanySoftware RT (x86)\Plc\Port_851_boot.tizip" KeyPath="no" />
        </Component>
        <Component Id="StartupReg" Guid="" Directory="TARGETDIR">
            <RegistryKey Root="HKLM"
                         Key="Software\Company\CompanySoftware3\System">
                <RegistryValue Name="SysStartupState"
                               Type="integer"
                               Value ="5"/>
            </RegistryKey>
        </Component>
    </ComponentGroup>
</Fragment>

'''


Solution

  • I was able to figure out how to get this to work. By using the Condition and ![CDATA[NOT(VersionNT64)]] to detect the version I was able to perform different actions!

    <Product Id="*"
             Name="Company PLC"
             Language="1033"
             Version="4.09"
             Manufacturer="Company Inc."
             UpgradeCode="Code"
             >
        <Package Id ="*"
                 InstallerVersion="200"
                 InstallPrivileges="elevated"
                 Compressed="yes"
                 InstallScope="perMachine"
                 Description="Company CompanySoftware PLC Code"
                 Manufacturer="Company Inc."
                 Keywords="PLC"
                 Comments="Company "
                 />
    
        <!--Upgrade/install control-->
        <MajorUpgrade
                      AllowDowngrades="yes"
                      />
    
        <!--GUI for install display-->
    
        <!-- future use for custom graphics on the MSI pages
        <WixVariable Id="WixUIBannerBmp" Value="CompanyWixUIBanner.bmp" />
        <WixVariable Id="WixUIDialogBmp" Value="CompanyWixUIBanner.bmp" />
        -->
    
        <UI>
            <UIRef Id="WixUI_Minimal" />
            <!--Define type of UI -->
        </UI>
    
    
        <Upgrade Id="CODE">
            <UpgradeVersion OnlyDetect="no"
                            Property="SELFFOUND"
                            Minimum="1.0"
                            />
        </Upgrade>
    
    
        <MediaTemplate EmbedCab="yes" />
    
        <!-- Set the icon used in the Windows programs and features list-->
        <Icon Id='ProductIcon' SourceFile='Company.ico' />
        <Property Id='ARPPRODUCTICON' Value='ProductIcon' />
    
    
        <!-- Things to install- This would normally appear as the selectable list of items to install in a regular installer-->
        <Feature Id="Default_x64" Title="PLC Code x64" Level="1">
            <Condition Level ="1">
                <![CDATA[(VersionNT64)]]>
            </Condition>
                <ComponentGroupRef Id="ProductComponentsx64" />
        </Feature>
    
        <Feature Id="Default_x86" Title="PLC Code x86" Level="1">
            <Condition Level ="1">
                <![CDATA[NOT(VersionNT64)]]>
            </Condition>
            <ComponentGroupRef Id="ProductComponentsx86" />
        </Feature>
    
    
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLFOLDER" Name="Company PLC" />
                <Directory Id="BOOTDIR" />
                <Directory Id="PLCDIR" />
            </Directory>
    
        </Directory>
    
        <SetDirectory Id="BOOTDIR" Value="C:\CompanySoftware\3.1\Boot" />
        <SetDirectory Id="PLCDIR" Value="C:\CompanySoftware\3.1\Boot\Plc" />
    
    
    </Product>
    
    
    
    
    <Fragment>
        <!--64 bit systems: Place files in appropriate directories and modify registry key for Company to autostart -->
        <ComponentGroup Id="ProductComponentsx64">
            <Component Id="BootComponentsx64" Guid="" Directory="BOOTDIR">
                <Condition>
                    <![CDATA[(VersionNT64)]]>
                </Condition>
                <File Id="CurrentConfig.xml.x64" Source="..\_Boot\CompanySoftware RT (x64)\CurrentConfig.xml" KeyPath="no" />
            </Component>
            <Component Id="PLCComponent.x64" Guid="" Directory="PLCDIR">
                <Condition>
                    <![CDATA[(VersionNT64)]]>
                </Condition>
                <File Id="Port_851.app.x64" Source="..\_Boot\CompanySoftware RT (x64)\Plc\Port_851.app" KeyPath="no" />
            </Component>
            <Component Id="StartupReg.x64" Guid="" Directory="TARGETDIR">
                <Condition>
                    <![CDATA[(VersionNT64)]]>
                </Condition>
                <RegistryKey Root="HKLM"
                             Key="Software\WOW6432Node\Company\CompanySoftware\System">
                    <RegistryValue Name="SysStartupState"
                                   Type="integer"
                                   Value ="5"/>
                </RegistryKey>
            </Component>
        </ComponentGroup>
    </Fragment>
    
    
    <Fragment>
        <!--32 bit systems: Place files in appropriate directories and modify registry key for Company to autostart -->
        <ComponentGroup Id="ProductComponentsx86">
            <Component Id="BootComponentsx86" Guid="" Directory="BOOTDIR">
                <Condition>
                    <![CDATA[NOT(VersionNT64)]]>
                </Condition>
                <File Id="CurrentConfig.xml.x86" Source="..\_Boot\CompanySoftware RT (x86)\CurrentConfig.xml" KeyPath="no" />
            </Component>
            <Component Id="PLCComponentx86" Guid="" Directory="PLCDIR">
                <Condition>
                    <![CDATA[NOT(VersionNT64)]]>
                </Condition>
                <File Id="Port_851.app.x86" Source="..\_Boot\CompanySoftware RT (x86)\Plc\Port_851.app" KeyPath="no" />
            </Component>
            <Component Id="StartupReg.x86" Guid="" Directory="TARGETDIR">
                <Condition>
                    <![CDATA[NOT(VersionNT64)]]>
                </Condition>
                <RegistryKey Root="HKLM"
                             Key="Software\Company\CompanySoftware\System">
                    <RegistryValue Name="SysStartupState"
                                   Type="integer"
                                   Value ="5"/>
                </RegistryKey>
            </Component>
        </ComponentGroup>
    </Fragment>