I have a project which uses wix to generate an install package. The install works fine, but when one tries to uninstall the project, everything looks nice - but after the unistall finishes the product ist still there (still functioning). The entry in add/remove programs disappears when uninstalled from there, but comes back after a refresh (F5). Testers have found that everything looks like the uninstall actually does a repair.
What are we doing wrong (the project otherwise only generates further component fragment files with "heat" (with HeatDirectory-Entries in the wixproj), and defines a few preprocessor variables)?
Here's the product.wxs. Sorry, I know thats a lot of code, but I do not know what I can safely omit to find the problem...:
<?xml version="1.0" encoding="UTF-8"?>
<?define ProductVersion=1.1.0.0?>
<?define UpgradeCode=$(var.UpdateCode)?>
<?define ProductName=$(var.PV) Name?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="$(var.ProductName)" Language="1033" Version="$(var.ProductVersion)" Manufacturer="xyz" UpgradeCode="$(var.UpgradeCode)">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" InstallPrivileges="elevated" />
<SetProperty Id="REINSTALL" Value="ALL" After="FindRelatedProducts" >Installed AND Remove<>"ALL"</SetProperty>
<SetProperty Id="REINSTALLMODE" Value="vamus" After="FindRelatedProducts">Installed AND Remove<>"ALL"</SetProperty>
<MajorUpgrade DowngradeErrorMessage="A newer version of $(var.ProductName) is already installed." />
<MediaTemplate EmbedCab="yes" />
<Feature Id="ProductFeature" Title="XY Installer" Level="1" ConfigurableDirectory="INSTALLLOCATION">
<ComponentGroupRef Id="ProductComponents" />
<ComponentGroupRef Id="DesktopShortcutComponentGroup"/>
<ComponentGroupRef Id="StartmenuShortcuts"/>
</Feature>
<CustomAction Id="RestoreDatabase" Directory="INSTALLLOCATION" ExeCommand="[INSTALLLOCATION]initial_db\BURestore.exe $(var.Sport)_$(var.Project) D:\$(var.Sport)\initial_db\db.bak" Execute="deferred" Return="ignore" HideTarget="no" Impersonate="no" />
<CustomAction Id="RenameFormatFilesFolder" Directory="LISTTOOLLOCATION" ExeCommand="cmd /c "mv FormatFiles fmt"" Return="ignore" Impersonate="yes"></CustomAction>
<InstallExecuteSequence>
<Custom Action="RestoreDatabase" Before="InstallFinalize">NOT REMOVE</Custom>
<Custom Action="RenameFormatFilesFolder" After="InstallFinalize">NOT REMOVE</Custom>
</InstallExecuteSequence>
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLLOCATION"/>
<UI>
<UIRef Id="WixUI_InstallDir"/>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2">1</Publish>
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">1</Publish>
</UI>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ROOTDIR" Name="D"/>
<Directory Id="INSTALLLOCATION" Name="$(var.PV)">
<Directory Id="CONF" Name="conf">
<Directory Id="LISTTOOLLOCATION" Name="PRINT"></Directory>
</Directory>
</Directory>
<Directory Id="DesktopFolder" />
<Directory Id="ProgramMenuFolder">
<Directory Id="ProgramMenuSubfolder" Name="ST">
<Directory Id="ApplicationFolder" Name="$(var.ProductName)" />
</Directory>
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLLOCATION">
<ComponentGroupRef Id="RootFiles" />
<ComponentGroupRef Id="ListToolFiles" />
<ComponentGroupRef Id="inis" />
</ComponentGroup>
<ComponentGroup Id="DesktopShortcutComponentGroup">
<Component Id="DesktopShortcutComponent" Guid="{C54B....}" Directory="DesktopFolder">
<Shortcut Id="ApplicationDesktopShortcut"
Name="$(var.ProductName)"
Description="$(var.ProductName) Application"
Target="[INSTALLLOCATION]RO.exe"
WorkingDirectory="INSTALLLOCATION"/>
<RemoveFolder Id="DesktopFolder" On="uninstall"/>
<RegistryValue Root="HKCU" Key="Software\ST\$(var.ProductName)" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
</Component>
</ComponentGroup>
<ComponentGroup Id="StartmenuShortcuts" Directory="ApplicationFolder">
<Component Id="StartmenuShortcutComp" Guid="{ACD9...}">
<Shortcut Id="StartmenuShortcut" Name="$(var.ProductName)" Description="$(var.ProductName) Application" Target="[INSTALLLOCATION]RO.exe" WorkingDirectory="INSTALLLOCATION" />
<Shortcut Id="UninstallProduct" Name="Uninstall $(var.ProductName)" Target="[SystemFolder]msiexec.exe" Arguments="/x [ProductCode]" Description="Uninstalls $(var.ProductName)" />
<RemoveFolder Id="RemoveProgramMenuSubfolder" Directory="ProgramMenuSubfolder" On="uninstall"/>
<RemoveFolder Id="RemoveApplicationFolder" Directory="ApplicationFolder" On="uninstall"/>
<RegistryValue Root="HKCU" Key="Software\ST\$(var.ProductName)" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
</Component>
</ComponentGroup>
</Fragment>
</Wix>
The below two lines are making this issue.
<SetProperty Id="REINSTALL" Value="ALL" After="FindRelatedProducts" >Installed AND Remove<>"ALL"</SetProperty>
<SetProperty Id="REINSTALLMODE" Value="vamus" After="FindRelatedProducts">Installed AND Remove<>"ALL"</SetProperty>
That condition become true because Remove will be set ALL in Uninstall after InstallValidate action in Install execute sequence. Please check below link for more details.
https://msdn.microsoft.com/en-us/library/aa368013(v=vs.85).aspx
Related
I followed this for getting a functioning Per-User/Per-machine installer working using ALLUSERS=2. Now, my issue is regarding getting shortcuts working properly with this setup. If I set MSIINSTALLPERUSER=1 (Single User) then my Desktop and StartMenu shortcuts are always added per user in the HKCU. If I set MSIINSTALLPERUSER={}, then I can get shortcuts per machine. In the custom UI, MSIINSTALLPERUSER is being set based on the selected radio button in the advanced portion of the UI. So, although the shortcuts are created last and their registry values are set to HKMU, the installer always chooses where to put the shortcuts based on the initial value of MSIINSTALLPERUSER.
Can anyone point me in the right direction to properly creating shortcuts based on the type of install selected in the advanced UI (Per User / Per Machine).
Here is my Product.wxs
`
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Product Id="*" Name="HearCon" Language="1033" Version="2.0.299" Manufacturer="Tremetrics" UpgradeCode="73765816-7ba9-4a2b-89c3-ce1f26863b53">
<Package InstallerVersion="500" Compressed="yes" />
<MediaTemplate EmbedCab="yes" />
<Condition Message="Only Windows 7 and newer are supported">
<![CDATA[Installed OR VersionNT >= 601]]>
</Condition>
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<Feature Id="ProductFeature" Title="Application" Level="1">
<ComponentGroupRef Id="HearConGroup" />
<ComponentRef Id="RA660Folder_Permission" />
</Feature>
<Feature Id="DesktopShortcutFeature" Title="Desktop Shortcut" Level="1">
<ComponentRef Id="DesktopShortcut" />
</Feature>
<Feature Id="StartMenuShortcutFeature" Title="Start Menu Shortcut">
<ComponentRef Id="ProgramMenuShortcut" />
<Condition Level="1">Privileged</Condition>
</Feature>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="APPLICATIONFOLDER" Name="HearCon" />
</Directory>
<Directory Id="DesktopFolder" Name="Desktop" />
<Directory Id="ProgramMenuFolder" />
<Directory Id="CommonAppDataFolder">
<Directory Id="RA660Folder" Name="RA660">
<Directory Id="RA660Driver" Name="Drivers" />
</Directory>
</Directory>
</Directory>
<Property Id="WixAppFolder" Value="WixPerUserFolder" />
<Property Id="ApplicationFolderName" Value="HearCon" />
<Property Id="ALLUSERS" Value="2" />
<Property Id="DISABLEADVTSHORTCUTS" Value="1" />
<Property Id="MSIINSTALLPERUSER" Value="1" />
<UIRef Id="WixUI_CustomAdvanced" />
<WixVariable Id="WixUIBannerBmp" Value="HearConBanner.bmp" />
</Product>
<Fragment>
<DirectoryRef Id="DesktopFolder">
<Component Id="DesktopShortcut" Guid="10E3E42D-8B2E-471D-A6F9-6263C3491D4C">
<RegistryValue Root="HKMU" Key="Software\Tremetrics\HearCon" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</Component>
</DirectoryRef>
</Fragment>
<Fragment>
<DirectoryRef Id="ProgramMenuFolder">
<Component Id="ProgramMenuShortcut" Guid="2C7EA878-B1B1-4B64-937A-6B583ED5E9B3">
<RegistryValue Root="HKMU" Key="Software\Tremetrics\HearCon" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</Component>
</DirectoryRef>
</Fragment>
<Fragment>
<DirectoryRef Id="RA660Folder">
<Component Id="RA660Folder_Permission" Guid="0A538414-E53F-470E-9546-7EF193878F05">
<CreateFolder>
<util:PermissionEx User="Users" GenericAll="yes"/>
</CreateFolder>
</Component>
</DirectoryRef>
</Fragment>
</Wix>
`
The snippet of Files.wxs generated by heat:
<?xml version="1.0" encoding="utf-8"?>
<Wix
xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="INSTALLFOLDER">
<Directory Id="dirF5D9BDF13CBC346EDDFD6D0959FFB838" Name="config">
<Component Id="cmp0CBEDCE6B62E5666B3362D0EB41267BC" Guid="*">
<File Id="fil73D1987B7864F07C97735D7E40243AB2" KeyPath="yes"
Source="$(var.App.TargetDir)\config\accounts-example.ini" />
</Component>
</Component>
</Directory>
</DirectoryRef>
</Fragment>
<Fragment>
<ComponentGroup Id="Binaries">
<ComponentRef Id="cmp0CBEDCE6B62E5666B3362D0EB41267BC" />
</ComponentGroup>
</Fragment>
</Wix>
Product.wxs:
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
<Product Id="*" Name="xxx" Language="2052" Version="$(var.ProductVersion)" Manufacturer="xxx"
UpgradeCode="425BDA6F-31B8-47AD-88D8-4B2DBE394XXX">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="New Version [ProductName] has been installed。" />
<MediaTemplate EmbedCab="yes" />
<WixVariable Id="WixUILicenseRtf" Value="./License.rtf" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="MANUFACTURERFOLDER" Name="!(bind.property.Manufacturer)">
<Directory Id="INSTALLFOLDER" Name="!(bind.property.ProductName)" />
</Directory>
</Directory>
<Directory Id="ProgramMenuFolder">
<Directory Id="ApplicationProgramsFolder" Name="!(bind.property.ProductName)" />
<Directory Id="DesktopFolder" Name="Desktop" />
</Directory>
</Directory>
<Feature Id="ProductFeature" Title="XXX_Installer" Level="1">
<ComponentGroupRef Id="Binaries" />
<ComponentRef Id="ApplicationShortcut" />
<ComponentRef Id="ApplicationShortcutDesktop" />
<ComponentRef Id="RegistryEntries" />
</Feature>
<UIRef Id="WixUI_ErrorProgressText" />
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
<UIRef Id="WixUI_InstallDir" />
<DirectoryRef Id="ApplicationProgramsFolder">
<Component Id="ApplicationShortcut" Guid="E1F61345-CC60-40FE-8FC4-FBE1598F8XXX">
<Shortcut Id="ApplicationStartMenuShortcut"
Name="!(bind.property.ProductName)"
Description="!(bind.property.ProductName)"
Target="[INSTALLFOLDER]XXX_App.exe"
WorkingDirectory="INSTALLFOLDER" />
<RemoveFolder Id="ApplicationProgramsFolder" On="uninstall" />
<RegistryValue Root="HKCU" Key="Software\Microsoft\!(bind.property.ProductName)" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</Component>
</DirectoryRef>
<DirectoryRef Id="DesktopFolder">
<Component Id="ApplicationShortcutDesktop" Guid="BEDF111F-0889-4317-8E67-41425F00CXXX">
<Shortcut Id="ApplicationDesktopShortcut"
Name="!(bind.property.ProductName)"
Description="!(bind.property.ProductName)"
Target="[INSTALLFOLDER]XXX_App.exe"
WorkingDirectory="INSTALLFOLDER" />
<RemoveFolder Id="DesktopFolder" On="uninstall" />
<RegistryValue Root="HKCU" Key="Software\Microsoft\!(bind.property.ProductName)" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</Component>
</DirectoryRef>
<DirectoryRef Id="TARGETDIR">
<Component Id="RegistryEntries" Guid="0D919675-E219-43EA-AAB3-E6F81A013XXX">
<RegistryKey Root="HKCU"
Key="Software\Microsoft\Windows\CurrentVersion\Run">
<RegistryValue Name="!(bind.property.ProductName)"
Type="string"
Value="[INSTALLFOLDER]XXX_App.exe"/>
</RegistryKey>
</Component>
</DirectoryRef>
<UI>
<Publish Dialog="ExitDialog"
Control="Finish"
Event="DoAction"
Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
</UI>
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="启动!(bind.property.ProductName)" />
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1" />
<Property Id="WixShellExecTarget" Value="[INSTALLFOLDER]XXX_App.exe" />
<CustomAction Id="LaunchApplication"
BinaryKey="WixCA"
DllEntry="WixShellExec"
Impersonate="yes" />
</Product>
</Wix>
Every time I install a new version, it overwrites the existing file accounts-example.ini.
The overwrite behavior is expected for accounts-example.ini, but I will have another file user.db do not want to be overwritten.
It says if KeyPath is set to 'yes' then it doesn't overwrite the existing file, isn't it? How could I config Wix to overwrite one file and not overwirte another?
Some articles about KeyPath:
what-is-the-wix-keypath-attribute
copy-if-not-exist-in-wix
If you are doing this with a majorupgrade element you need to tell us where it's scheduled. If it's "early" (such as afterInstallInitialize) then everything will be uninstalled first, and then the new upgrade installed, and every file that was installed will be from the new upgrade. If it's sequenced "late" (such as afterInstallExecute) then the overwrite rules apply (such as this https://msdn.microsoft.com/en-us/library/windows/desktop) and that's because the upgrade basically installs each file over the existing files.
Note that the WiX default for the MajorUpgrade schedule is afterInstallValidate, so as I described (and as the WiX documentation says) the entire older product will be uninstalled first (obviously removing all files) then all the new files will be installed.
See schedule here:
http://wixtoolset.org/documentation/manual/v3/xsd/wix/majorupgrade.html
The explanation at the WiX keypath link leaves a lot to be desired. It is not really true to say that if the component is present none of its resources will be installed. It's not clear to me what that is intended to mean because the overwrite rules will be applied.
As far as your data files are concerned, they will not be overwritten by an incoming file if they have been updated since they were installed. So it's likely that your ini file is being overwritten because it hasn't been changed. If your db has been updated then it won't be replaced, but, again, this is overwrite rules when your major upgrade is "late" (or it's a patch).
first time using Wix so sorry if my question appears dumb. i have had a look around here for my answer and it appears I need to use a bundle.
I have my main wxs page with all my registry, files DB to install but how do I include a bundle within this file? I have this:
<?xml version="1.0" encoding="UTF-8"?>
<Wix
xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"
xmlns:ui="http://schemas.microsoft.com/wix/UIExtension" >
<Bundle>
</Bundle>
<Product Id="*" Name="IMy Application Name" Language="1033" Version="2.0.0.0" Manufacturer="My Company Name" UpgradeCode="5d4e4839-11b8-403c-a440-796507b2f057">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" InstallPrivileges="elevated" />
<MajorUpgrade
AllowDowngrades="no"
AllowSameVersionUpgrades="no"
IgnoreRemoveFailure="no"
DowngradeErrorMessage="loc.NewerVersionInstalled"
Schedule="afterInstallInitialize"/>
ERRORS FROM HERE!
<Bundle Name="Prog" Version="1.0.0.0" Manufacturer="my Corporation" UpgradeCode="*">
<Chain>
<PackageGroupRef Id="Netfx45FullPackage" />
</Chain>
</Bundle>
<Fragment>
<PackageGroup Id="Netfx45FullPackage">
<ExePackage Id="Netfx45Xxx" Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="no" InstallCommand="/q" SourceFile="..\SetupProject\dotnetfx45_full_x86_x64.exe" DetectCondition="(Netfx4FullVersion="4.5.50709") AND (NOT VersionNT64 OR (Netfx4x64FullVersion="4.5.50709"))" InstallCondition="(VersionNT >= v6.0 OR VersionNT64 >= v6.0) AND (NOT (Netfx4FullVersion="4.5.50709" OR Netfx4x64FullVersion="4.5.50709"))" />
TO HERE!
<MsiPackage Id="MyProg" Cache="no" Compressed="no" DisplayInternalUI="yes" Vital="yes" SourceFile="$(var.installerPath)\MyProgCore.msi" />
</PackageGroup>
</Fragment>**
<InstallUISequence>
<Custom Action='PreventDowngrading' After='FindRelatedProducts'>NEWPRODUCTFOUND</Custom>
</InstallUISequence>
<CustomAction Id='PreventDowngrading' Error='Newer version already installed' />
<Property Id="WIXUI_INSTALLDIR" Value="APPLICATIONROOTDIRECTORY" />
<UI>
<UIRef Id="WixUI_Minimal" />
<Publish
Dialog="ExitDialog"
Control="Finish"
Event="DoAction"
Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed
</Publish>
</UI>
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Launch My Application" />
<Property Id="WixShellExecTarget" Value="[#InformedWorker]" />
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />
<MediaTemplate EmbedCab="yes"/>
<PropertyRef Id="NETFRAMEWORK45"/>
<Condition Message="This application requires .NET Framework 4.5. Please install the .NET Framework then run this installer again.">
<![CDATA[Installed OR NETFRAMEWORK20]]>
</Condition>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="APPLICATIONROOTDIRECTORY" Name="Informed Worker"/>
<Directory Id="OriginalFilesFolder" Name="OriginalFiles" SourceName="SourceFiles"/>
<Directory Id="CopiedFilesFolder" Name="My Application Name" />
</Directory>
<Directory Id="CommonAppDataFolder">
<Directory Id="ConfigFOLDER" Name="My Application Name">
<Directory Id="EmptyDataFolderDir" Name="Data" />
<Directory Id="EmptyLogFolderDir" Name="Log" />
<Directory Id="RegComponents" Name="Reg" />
</Directory>
</Directory>
<!-- Step 1: Define the directory structure -->
<Directory Id="ProgramMenuFolder">
<Directory Id="ApplicationProgramsFolder" Name="My Application Name"/>
<Directory Id="DesktopFolder" Name="Desktop"></Directory>
</Directory>
</Directory>
<DirectoryRef Id="APPLICATIONROOTDIRECTORY">
<Component Id="InformedWorker" Guid="*">
<File Id="InformedWorker" Source="SourceFiles\MyApp.exe" KeyPath="yes" Checksum="yes"/>
</Component>
</DirectoryRef>
<Feature Id="MainApplication" Title="Main Application" Level="1">
<ComponentRef Id="MyApp" />
</Feature>
<Feature Id="ProductFeature" Title="Setup" Level="1">
<ComponentGroupRef Id="DataFolderComponent" />
<ComponentGroupRef Id="LogFolderComponent" />
<ComponentGroupRef Id="RegComponents" />
<ComponentGroupRef Id="FilesFolder" />
<ComponentGroupRef Id="DBFolder" />
</Feature>
<Icon Id="InformedWorker" SourceFile="SourceFiles\MyApp.exe" />
<Property Id="ARPPRODUCTICON" Value="My Application Name" />
</Product>
<Fragment>
<ComponentGroup Id="DataFolderComponent" Directory="EmptyDataFolderDir">
<Component Id="CMP_MyEmptyDataDir" Guid="85DAD4AE-6404-4A40-B713-43538091B9D3" KeyPath="yes">
<CreateFolder />
</Component>
</ComponentGroup>
</Fragment>
<Fragment>
<ComponentGroup Id="LogFolderComponent" Directory="EmptyLogFolderDir">
<Component Id="CMP_MyEmptyLogDir" Guid="a4594ec9-3101-4627-8ee7-d60d0a9b1f63" KeyPath="yes">
<CreateFolder />
</Component>
</ComponentGroup>
</Fragment>
<Fragment>
<ComponentGroup Id="RegComponents" Directory="APPLICATIONROOTDIRECTORY">
<Component Id="RegistryEntries" Guid="9AB04D89-19B5-4729-9CD5-656C8C6B833F">
<RegistryKey Root="HKCR" Key="My Application Name">
<RegistryValue Type="string" Name="ClientRef" Value=""/>
</RegistryKey>
</Component>
</ComponentGroup>
</Fragment>
<Fragment>
<ComponentGroup Id="FilesFolder" Directory="OriginalFilesFolder">
<Component Id="EXE_File" Guid="*">
<File Id="AppExe" Source="SourceFiles\MyApp.exe" KeyPath="yes">
<CopyFile Id="Copy_EXE" DestinationDirectory="APPLICATIONROOTDIRECTORY" DestinationName="MyApp.exe" />
</File>
</Component>
</ComponentGroup>
</Fragment>
<Fragment>
<ComponentGroup Id="DBFolder" Directory="OriginalFilesFolder">
<Component Id="DB_File" Guid="a4eeb7a3-635c-41c3-b8c8-35c9c4f46d97">
<File Id="AppDB" Source="SourceFiles\Data.db3" KeyPath="yes">
<CopyFile Id="Copy_DB" DestinationDirectory="EmptyDataFolderDir" DestinationName="MyDB.db3" />
</File>
</Component>
</ComponentGroup>
</Fragment>
</Wix>
But it does not like the inclusion of my bundle..?
Bundles are separate projects. One project for your MSI and one for your bundle.
I have a WIX file which i'm using to to install an app and create two short cuts. One in all users start menu and one in the desktop.
Since it creates it's stuff in all users I thought that you didn't need to have a reg key.
But without it it complains.
with
error LGHT0204: ICE38: Component ProgramMenuAppFolder installs to user profile. It must use a registry key under HKCU as its KeyPath, not a file.
With HKLM however it also complains that the
LGHT0204: ICE38: Component ProgramMenuAppFolder installs to user profile. It's KeyPath registry key must fall under HKCU.
Even though it's installing to the all users and so shouldn't be installing to the user profile.
Any suggestions?
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
<Product Id="*" Name="$(var.PublisherSimple) $(var.AppName)" Language="1033" Version="$(var.ProductVersion)" Manufacturer="$(var.Publisher)" UpgradeCode="$(var.ProductUpgradeCode)">
<Package
Description="$(var.PublisherSimple) $(var.AppName) $(var.ProductVersion)"
InstallerVersion="200" Compressed="yes"
InstallScope="perMachine"
/>
<Property Id="DISABLEADVTSHORTCUTS" Value="1" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate CompressionLevel="none" />
<Feature Id="ProductFeature" Title="$(var.PublisherSimple) $(var.AppName) $(var.ProductVersion)" Level="1">
<ComponentGroupRef Id="ProductComponents" />
<ComponentRef Id="ProgramMenuDir"/>
<ComponentRef Id="ProgramMenuAppFolder"/>
</Feature>
<UI>
<UIRef Id="WixUI_InstallDir" /> <!-- actually uses but that just skips the licence page <UIRef Id="WixUI_InstallDir_Custom" />-->
<Publish Dialog="ExitDialog"
Control="Finish"
Event="DoAction"
Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
</UI>
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
<!--<Property Id="WixAppFolder" Value="WixPerMachineFolder" />-->
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Launch $(var.AppName)" />
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1" />
<Property Id="WixShellExecTarget" Value="[#MVTestApp.exe]" />
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="PublisherDirectory" Name="MV">
<Directory Id="INSTALLFOLDER" Name="MV Test App"/>
</Directory>
</Directory>
<Directory Id="ProgramMenuFolder" Name="Programs">
<Directory Id="ProgramMenuDir" Name="MV" >
<Directory Id="ProgramMenuAppFolder" Name="MV Test App Folder">
<Component Id="ProgramMenuAppFolder" Guid="3ebfd81d-08b2-4bcf-8c90-e84241a58976">
<RemoveFolder Id="ProgramMenuAppFolder" On="uninstall" />
<!--<RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" KeyPath="yes" />-->
</Component>
</Directory>
<Component Id="ProgramMenuDir" Guid="f1cf94bf-5e5a-4c60-8729-65bdf1cb9244">
<RemoveFolder Id="ProgramMenuDir" On="uninstall" />
<!--<RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]Start" Type="string" Value="" KeyPath="yes" />-->
</Component>
</Directory>
</Directory>
<Directory Id="DesktopFolder" Name="Desktop" />
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents">
<Component Id="MVTestApp.Exe" Directory="INSTALLFOLDER" Guid="*" Win64="no">
<File Id="MVTestApp.Exe" KeyPath="yes" Source="MVTestApp.Exe" />
<Shortcut Id="startmenuShortCut" Directory="ProgramMenuAppFolder" Name="MV Test App Short Start" WorkingDirectory="INSTALLFOLDER" Advertise="yes" />
<Shortcut Id="desktopShortCut" Directory="DesktopFolder" Name="MV Test App Short Desk" WorkingDirectory="INSTALLFOLDER" Advertise="yes" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
This is a similar problem as Install optional desktop shortcut for all users
I have got a strange problem when using Wix to create a Windows Installer Setup for an application I'm working on.
Basically, when the application uninstalls it seems to be launching the application's executable before finalizing the uninstall. I am not sure why it is doing this as I am a newbie on Wix.
Here is the full Wix code, which I got from here.
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<?define Product_Name="Orbit Invoice System"?>
<?define Product_Manufacturer="Orbit"?>
<?define Product_Name_Short="OIS"?>
<?define Product_Manufacturer_Short="Orbit"?>
<?define MainExeID="MainExeID"?>
<!--<?define Product_Version=!(bind.fileVersion.$(var.MainExeID))?>-->
<?define Product_Version=!(bind.assemblyVersion.$(var.MainExeID))?>
<?define SetupResourcesDir=$(var.SolutionDir)\icons\?>
<Product Id="*" Name="$(var.Product_Name)" Version="$(var.Product_Version)" Manufacturer="$(var.Product_Manufacturer)"
Language="1033"
UpgradeCode="F9A23E67-669B-40E5-9995-D8425D08F35F">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<!--Check for .Net Framework 3.5 SP 1-->
<PropertyRef Id='NETFRAMEWORK40FULL'/>
<Condition Message="This application requires .NET Framework 4.0. Please install the .NET Framework then run this installer again.">
<![CDATA[Installed OR NETFRAMEWORK40FULL]]>
</Condition>
<MajorUpgrade DowngradeErrorMessage="A newer version of $(var.Product_Name) is already installed."
Schedule="afterInstallValidate"
/>
<MediaTemplate EmbedCab="yes" />
<Feature Id="ProductFeature" Title="$(var.Product_Name) Setup" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
<!--Icon must be 16x16-->
<Icon Id="AddRemoveProgramsIcon" SourceFile="$(var.SetupResourcesDir)libra.ico"/>
<Property Id="ARPPRODUCTICON" Value="AddRemoveProgramsIcon" />
<!--<Property Id="ARPHELPLINK" Value="" />-->
<InstallExecuteSequence>
<Custom Action="CleanUpUserData" After="InstallInitialize">Installed AND NOT UPGRADINGPRODUCTCODE AND NOT REINSTALL</Custom>
<!--<Custom Action="LaunchApplication" Before="InstallFinalize" >UPGRADINGPRODUCTCODE OR REINSTALL OR NOT Installed</Custom>-->
</InstallExecuteSequence>
</Product>
<Fragment>
<CustomAction Id="CleanUpUserData" FileKey="$(var.MainExeID)" ExeCommand="cleanUpUserData" Execute="immediate" Impersonate="yes" Return="ignore"/>
<!--<CustomAction Id="LaunchApplication" FileKey="$(var.MainExeID)" ExeCommand="mustBeSomethingOrTheUpdateWillFailWithError2753" Execute="commit" Impersonate="yes" Return="asyncNoWait"/>-->
</Fragment>
<!--Directory general structure-->
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<!--Program Files-->
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="$(var.Product_Name)" />
</Directory>
<!--Startup Programs Menu-->
<Directory Id="ProgramMenuFolder" Name="Programs">
<Directory Id="ProgramMenuDir" Name="$(var.Product_Manufacturer)">
<Component Id="ProgramMenuDir" Guid="*" >
<Shortcut Id="UninstallProduct"
Name="Uninstall $(var.Product_Name)"
Target="[SystemFolder]msiexec.exe"
Arguments="/x [ProductCode]"
Description="Uninstalls $(var.Product_Name)" />
<RemoveFolder Id='ProgramMenuDir' On='uninstall' />
<RegistryValue Root='HKCU' Key='Software\$(var.Product_Manufacturer_Short)\$(var.Product_Name_Short)' Type='string' Value='' KeyPath='yes' />
</Component>
</Directory>
</Directory>
<!--Desktop-->
<Directory Id="DesktopFolder" Name="Desktop" />
</Directory>
</Fragment>
<!--Directory file structure-->
<Fragment>
<DirectoryRef Id="INSTALLFOLDER">
<Component Id="MainExecutable" Guid="*">
<File Id="$(var.MainExeID)" Name="$(var.Product_Name).exe" Source="$(var.Invoice.TargetPath)" DiskId="1" KeyPath="yes" Vital="yes"
Assembly=".net" AssemblyApplication="$(var.MainExeID)">
<Shortcut Id="MainExeDesktop" Directory="DesktopFolder" Name="$(var.Product_Name)" WorkingDirectory="INSTALLFOLDER"
Icon="MainExeIcon.exe"
Description="Launches the $(var.Product_Name) application" Advertise="yes" >
<Icon Id="MainExeIcon.exe" SourceFile="$(var.Invoice.TargetPath)"/>
</Shortcut>
<Shortcut Id="MainExeProgramMenu" Directory="ProgramMenuDir" Name="$(var.Product_Name)" WorkingDirectory="INSTALLFOLDER"
Icon="MainExeIcon.exe"
Description="Launches the $(var.Product_Name) application" Advertise="yes" />
<Shortcut Id="CleanUpLocalFiles" Directory="ProgramMenuDir" Name="CleanUp the Local Files" Arguments="cleanUpUserData" WorkingDirectory="INSTALLFOLDER"
Icon="MainExeIcon.exe"
Description="Cleanup all the downloaded files of the $(var.Product_Name) for the current user" Advertise="yes"/>
</File>
</Component>
<Component Id="MainExecutableConfig" Guid="BDFC3501-CB6A-4C75-A4AE-05C0F7FE2DC2">
<File Id="MainExeConfig" Name="$(var.Product_Name).exe.config" Source="$(var.Invoice.TargetPath).config" DiskId="1" KeyPath="yes" Vital="yes" />
<File Id="InvoiceConfig" Name="InvoiceConfiguration.dll" Source="$(var.Invoice.TargetDir)\InvoiceConfiguration.dll" DiskId="1" Vital="yes" />
<File Id="DocumentFormatOpenXml" Name="DocumentFormat.OpenXml.dll" Source="$(var.Invoice.TargetDir)\DocumentFormat.OpenXml.dll" DiskId="1" Vital="yes" />
<File Id="SalesInvoiceTemplate" Name="SalesInvoiceTemplate.docx" Source="$(var.Invoice.TargetDir)\SalesInvoiceTemplate.docx" DiskId="1" Vital="yes" />
</Component>
</DirectoryRef>
</Fragment>
<!--Components groups-->
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<ComponentRef Id="MainExecutable" />
<!--<ComponentRef Id="Dlls" />
<ComponentRef Id="LetterTemplates"/>-->
<ComponentRef Id="MainExecutableConfig" />
<ComponentRef Id="ProgramMenuDir" />
</ComponentGroup>
</Fragment>
</Wix>
Any ideas?
CleanUpUserData custom action run the $(var.MainExeID) application.
<CustomAction Id="CleanUpUserData" FileKey="$(var.MainExeID)" ExeCommand="cleanUpUserData" Execute="immediate" Impersonate="yes" Return="ignore"/>
The below condition (Installed AND NOT UPGRADINGPRODUCTCODE AND NOT REINSTALL) means the Custom action will be run if setup installed and not in upgrade or reinstall. So it will run in Repair or Uninstall(both will meet this condition). So your application is running in Uninstall.
<Custom Action="CleanUpUserData" After="InstallInitialize">Installed AND NOT UPGRADINGPRODUCTCODE AND NOT REINSTALL</Custom>
Check more about install and uninstall Conditions here.
After reviewing the answer given by #Vinoth I have changed the 'CleanUpUserData' custom action to this:
<Custom Action="CleanUpUserData" After="InstallInitialize">INSTALLED OR UPGRADINGPRODUCTCODE OR REINSTALL</Custom>
And this has now resolved the problem.