Install files to windows directory in WiX - wix

I am trying to install some files to WindowsFolder. Here is the markup:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="MyAppSetup" Language="1033" Version="1.0.0.0" Manufacturer="abc" UpgradeCode="C313D73A-0FE5-496C-BD86-C21565BD65ED">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate />
<Feature Id="ProductFeature" Title="MyAppSetup" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="WindowsFolder">
<Directory Id="INSTALLFOLDER" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<Component Id="myApp1" Guid="13B43FD7-8D69-4D2E-BF03-B3EC5679D78A">
<File Id="myApp.pdb" Source="myApp64.pdb" KeyPath="yes" />
</Component>
<Component Id="myApp2" Guid="23B43FD7-8D69-4D2E-BF03-B3EC5679D78A">
<File Id="myApp.sys" Source="myApp64.sys" KeyPath="yes" />
</Component>
<Component Id="myApp3" Guid="33B43FD7-8D69-4D2E-BF03-B3EC5679D78A">
<File Id="myAppsvc.exe" Source="myAppsvc64.exe" KeyPath="yes" />
</Component>
<Component Id="myApp4" Guid="43B43FD7-8D69-4D2E-BF03-B3EC5679D78A">
<File Id="myAppsvc.pdb" Source="myAppsvc64.pdb" KeyPath="yes" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
Based on my reading, this directory element specifies the files to be installed/copied under WindowsFolder (on my machine C:\windows), but instead, it installs files to D:\ which has the most space. So the question is : what did I do wrong on the directory?

It turns out that the Directory reset happens when the msi is launched through msiexec using /a (admin) option. Here is a few log entries show this:
PROPERTY CHANGE: Adding TARGETDIR property. Its value is 'D:\'.
PROPERTY CHANGE: Modifying WindowsFolder property. Its current value is 'C:\windows\'. Its new value: 'D:\'.
PROPERTY CHANGE: Adding APPLICATIONROOTDIRECTORY property. Its value is 'D:\'.
If msi is launched using /i option, then the Directory reset is not happening. Since package needs to be installed with elevated privilege, the correct way to do this is using /i option in a elevated CMD console. The markup was never the issue.

Related

How to ship file in our desktop folder and how to create shortcut to desktop folder?

I want to ship file to our target folder and create shortcut to desktop folder.my wix coding is
enter code here`
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="5A157ECF-D387-43EF-855E-C39E9F26B463" Name="DesktopPermission" Language="1033" Version="1.0.0.0" Manufacturer="Naveen" UpgradeCode="5A157ECF-D387-43EF-855E-C39E9F26B463">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate />
<Feature Id="ProductFeature" Title="DesktopPermission" Level="1">
<ComponentRef Id="compid"/>
</Feature>
<DirectoryRef Id="APP_DIR">
<Component Id="compid" Guid="F2450B59-EA82-4762-8AEF-984D54F6EAA9">
<File Id="BuildFile" KeyPath="yes" Source="C:\Users\naveen.raja\Desktop\Text.txt"/>
</Component>
</DirectoryRef>
<CustomAction Id="sample" Directory="APP_DIR" Value="C:\Users\naveen.raja\Desktop\Installone" Execute="immediate" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="APP_DIR" Name="myfile">
</Directory>
</Directory>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="DesktopFolder" Name="Desktop">
<Component Id="ApplicationShortcutDesktop" Guid="258B1044-131B-49F7-90CB-CC92C8658191">
<Shortcut Id="ApplicationDesktopShortcut"
Name="Text under your icon"
Description="Comment field in your shortcut"
Target="[APP_DIR]"
WorkingDirectory="APP_DIR"/>
<RemoveFolder Id="DesktopFolder" On="uninstall"/>
<RegistryValue
Root="HKCU"
Key="Software/MyAppName"
Name="installed"
Type="integer"
Value="1"
KeyPath="yes"/>
</Component>
</Directory>
</Directory>
</Product>
<Fragment>
<InstallExecuteSequence>
<Custom Action="sample" Sequence="600" />
</InstallExecuteSequence>
</Fragment>
</Wix>
but the file not shipped and also not created the shortcut. so please help what are all things to change in this coding. Thanks in advance.
Normally, if you provide a verbose log of your installation, it makes it easier to see exactly what went wrong. Without that log, I had to go with your code only.
Your code as provided didn't compile for me (I am using v3.9), and there were other errors in form probably preventing your installer from running as you intended. The errors I found were of the following types:
1: your custom action to set the location of APP_DIR wasn't ever included because the fragment scheduling it was never referenced. That would cause the file to be installed to C:\myfile\Text.txt (replace C: with the drive with the largest amount of free space on your computer) instead of under your desktop as you intended. (May your file be there?)
2: Code failed ICE21 because ApplicationShortcutDesktop wasn't included in any feature (probable reason that your shortcut didn't appear).
3: Code couldn't compile because was repeated.
4: Code failed ICE 12 because your custom action "sample" is of type: 35. Therefore it must come after CostFinalize # 1000 in Seq Table: InstallExecuteSequence.
A side note: Normally ProductCode (Product\#Id) and UpgradeCode (Product\#Upgrade) are NOT the same value. You may wish to learn more about those two values in Windows Installer/MSI. There are a lot of experts in this area on the wix toolset's wix-users list. In fact, a lot of help can be found by searching that lists archives and/or by asking questions there.
Fixing these four errors, your file's folder and your shortcut to the file's folder both showed up on the indicated desktop, and the file was found added to that folder.
Here's what my version (minimal changes) of your code looks like:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="5A157ECF-D387-43EF-855E-C39E9F26B463" Name="DesktopPermission" Language="1033" Version="1.0.0.0" Manufacturer="Naveen" UpgradeCode="5A157ECF-D387-43EF-855E-C39E9F26B463">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate />
<Feature Id="ProductFeature" Title="DesktopPermission" Level="1">
<ComponentRef Id="compid"/>
<ComponentRef Id="ApplicationShortcutDesktop"/>
</Feature>
<DirectoryRef Id="APP_DIR">
<Component Id="compid" Guid="F2450B59-EA82-4762-8AEF-984D54F6EAA9">
<File Id="BuildFile" KeyPath="yes" Source="C:\Users\naveen.raja\Desktop\Text.txt"/>
</Component>
</DirectoryRef>
<CustomAction Id="sample" Directory="APP_DIR" Value="C:\Users\naveen.raja\Desktop\Installone" Execute="immediate" />
<InstallExecuteSequence>
<Custom Action="sample" After="CostFinalize" />
</InstallExecuteSequence>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="APP_DIR" Name="myfile">
</Directory>
</Directory>
<DirectoryRef Id="TARGETDIR">
<Directory Id="DesktopFolder" Name="Desktop">
<Component Id="ApplicationShortcutDesktop" Guid="258B1044-131B-49F7-90CB-CC92C8658191">
<Shortcut Id="ApplicationDesktopShortcut"
Name="Text under your icon"
Description="Comment field in your shortcut"
Target="[APP_DIR]"
WorkingDirectory="APP_DIR"/>
<RemoveFolder Id="DesktopFolder" On="uninstall"/>
<RegistryValue
Root="HKCU"
Key="Software/MyAppName"
Name="installed"
Type="integer"
Value="1"
KeyPath="yes"/>
</Component>
</Directory>
</DirectoryRef>
</Product>
</Wix>
Hope that helps!

Wix doesn't include any of the files in the .MSI

i am trying to add files in my WIX installer, however it doesn't do that at the moment. i am staring at it for hours now and i just can't see what might be the problem. the referencing seems to work alright as well as the target location. the installer runs fine up to the point when it needs to install files of course.
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="Wix_setup" Language="1033" Version="1.0.0.0" Manufacturer="Frank Jansen" UpgradeCode="37a42e55-dea8-47da-8f4f-fb065dd38a9e">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate EmbedCab="yes"/>
<Feature Id="ProductFeature" Title="Wix_setup" Level="1">
<!--create a seperate ComponentGroupRef and Fragment for each extra added program-->
<ComponentGroupRef Id="InstallationFiles" />
<ComponentGroupRef Id="DLLs" />
<ComponentGroupRef Id="IniFiles" />
<ComponentGroupRef Id="Scripts" />
<ComponentGroupRef Id="TeamViewer" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="Wix_setup" />
</Directory>
</Directory>
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" ></Property>
<UIRef Id="WixUI_InstallDir"/>
</Fragment>
here is also a part of the references that i made using heat:
<Fragment>
<DirectoryRef Id="INSTALLFOLDER">
<Directory Id="dirE31AF1F0EC087256AE3A304B079577CE" Name="Program Files">
<Directory Id="dir686DC70E77279FD983277BA8C61F0AF5" Name="ActiveX Control Pad">
<Component Id="cmp50E37DF3A2B94BC9155ED7F4A264B47B" Guid="{F3CE58FB-5E41-4CD9-B761-C1B14A4F6C5F}">
<File Id="fil0D955E35C33B26A36350F0C4D02733AF" KeyPath="yes" Source="C:\Users\fjansen\Documents\MMI installatie bestanden\MMI install files\Program Files\ActiveX Control Pad\license.txt" />
</Component>
<Component Id="cmp367C764B6CFEC27E7632FB3F5B37A3F9" Guid="{FBEC3C91-3DCD-4CF3-B58D-B7C97AEB8ACF}">
<File Id="fil084E5B485699543BB060A10BAEEC4519" KeyPath="yes" Source="C:\Users\fjansen\Documents\MMI installatie bestanden\MMI install files\Program Files\ActiveX Control Pad\ped.cnt" />
</Component>
<Component Id="cmp5EF25EC501B2689546C69D7C8B18B79F" Guid="{182C17ED-01E1-4529-A733-D3FBA7FF61EE}">
<File Id="filF5043624868A85726914B5A383640B6F" KeyPath="yes" Source="C:\Users\fjansen\Documents\MMI installatie bestanden\MMI install files\Program Files\ActiveX Control Pad\PEd.exe" />
</Component>
<Fragment>
<ComponentGroup Id="Wix_database" Directory="INSTALLFOLDER" >
<ComponentRef Id="cmp50E37DF3A2B94BC9155ED7F4A264B47B" />
<ComponentRef Id="cmp367C764B6CFEC27E7632FB3F5B37A3F9" />
<ComponentRef Id="cmp5EF25EC501B2689546C69D7C8B18B79F" />
the ComponentGroupRef's and the Fragments they are connected to are currently not yet in use and dont have an impact on the program (the Fragments are left out of this example)
can anybody see what i might have done wrong or what is missing?
thanks in advance,
i have solved the errors. it had a conflict with my reference file i still had in the project, because of that it did see it as two references to the same symbol that i declared the way heavyd suggested.
thanks for the support Heavyd.

Wix XML Error - The Component/#Directory attribute cannot be specified when the Component element is nested underneath a Directory element

First time doing some Wix practice, so im completely new to it.
Here is my short script:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="SampleMSI" Language="1033" Version="1.0.0.0" Manufacturer="Nunya" UpgradeCode="b2c39f9b-1de1-433e-bc59-a3548cc531b9">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Description="Installs Signout Utility" Keywords="Practice,Signout,Utility,MSI,Installer" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate />
<Feature Id="ProductFeature" Title="SampleMSI" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="SampleMSI" />
<Directory Id="APPFOLDER" Name="APPDir" >
</Directory>
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<Component Id="CMP_ADispOCX"
Guid="5E23B839-35CA-480E-8AFC-2E914BA8E32A"
Directory="INSTALLLOCATION">
<File Id="FILE_ADispocx"
Source="ADisp.ocx"
KeyPath="yes" />
</Component>
<Component Id="CMP_Abtn32ocx"
Guid="98B357F2-C295-4019-A878-885E56AA3BF3"
Directory="INSTALLLOCATION">
<File Id="FILE_Abtn32a20ocx"
Source="btn32a20.ocx"
KeyPath="yes" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
I just wanted to make sure they are going to the same folder, basic installation check. (it is my first time)
I get this error however:
Error 2 The Component/#Directory attribute cannot be specified when the Component element is nested underneath a Directory element.
I get it twice for each component id I have.
Am I missing something? Im using Wix 3.6 A Developers Guide for reference.
edit: Side question......how do I specify an exact path? like C:\Herp\Derp
You don't need to specify the directory of a Component if you did so already in the ComponentGroup element. Remove the Directory attribute in both Components elements in your fragment.
Change your code to this
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<Component Id="CMP_ADispOCX"
Guid="5E23B839-35CA-480E-8AFC-2E914BA8E32A">
<File Id="FILE_ADispocx"
Source="ADisp.ocx"
KeyPath="yes" />
</Component>
<Component Id="CMP_Abtn32ocx"
Guid="98B357F2-C295-4019-A878-885E56AA3BF3">
<File Id="FILE_Abtn32a20ocx"
Source="btn32a20.ocx"
KeyPath="yes" />
</Component>
</ComponentGroup>
</Fragment>

wix not updating executable

I am new to WIX. In fact, this is my first project. So it should not be surprising that I am having issues.
I had my installer all setup and ready to roll, but this morning I needed a change made to my service, so I made the change and compiled. I build the WIX project and installed it. I started my service up and ran it, but the old code was executed. As it turns out, the old version of my service is still installed. Does this mean that the new version of the service was not packaged or that there was some kind of upgrade rule that I am missing? For some reason the PDB file got updated, but not the EXE.
Below is my wxs file. Please be kind...
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<?define AppName="My Service"?>
<?define MfgName="My Company"?>
<?define SourcePath="..\My Service\bin\$(var.Configuration)"?>
<Product Name="$(var.AppName)" Language="1033" Version="1.0.0.0" Manufacturer="$(var.MfgName)"
Id="*" UpgradeCode="063de86b-f12b-4af1-91ff-ce0917fffd5c" Codepage="1252">
<Package Id="*" Keywords="Installer" Description="$(var.AppName) Installer"
Manufacturer="$(var.MfgName)" Comments="My Service blah blah blah"
InstallerVersion="200" Compressed="yes" InstallScope="perMachine" SummaryCodepage="1252" />
<!--
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate />
-->
<Media Id="1" Cabinet="setup.cab" EmbedCab="yes" DiskPrompt="CD-ROM #1"/>
<Property Id="DiskPrompt" Value="$(var.AppName) Installer [1]"/>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles">
<Directory Id="CompanyFolder" Name="$(var.MfgName)">
<Directory Id="INSTALLFOLDER" Name="$(var.AppName)">
<Component Id="ServiceFile" Guid="3688d9ee-08ed-4dde-87d8-3b7a752a99bf">
<File Id="ServiceEXE" Name="My Service.exe" DiskId="1" Source="$(var.SourcePath)\My Service.exe" KeyPath="yes" Vital="yes" />
<File Id="ServicePDB" Name="My Service.pdb" DiskId="1" Source="$(var.SourcePath)\MY Service.pdb" KeyPath="no" Vital="yes"/>
<File Id="LibraryDLL" Name="library.dll" DiskId="1" Source="$(var.SourcePath)\library.dll" KeyPath="no" Vital="yes"/>
<File Id="LibraryPDB" Name="library.pdb" DiskId="1" Source="$(var.SourcePath)\library.pdb" KeyPath="no" Vital="yes"/>
<File Id="Config" Name="My Service.exe.config" DiskId="1" Source="$(var.SourcePath)\My Service.exe.config" KeyPath="no" Vital="yes"/>
<ServiceInstall Id="InstallService" Name="MyService" Type="ownProcess" ErrorControl="normal" Start="auto"
DisplayName="$(var.AppName)" Description="My Service blah blah blah">
<ServiceConfig OnInstall="yes" DelayedAutoStart="yes" />
</ServiceInstall>
<ServiceControl Id="ControlService" Name="MyService" Remove="both" Stop="both" Wait="no"/>
</Component>
</Directory>
</Directory>
</Directory>
</Directory>
<Feature Id="MainFeature" Title="$(var.AppName) Setup" Level="1">
<ComponentRef Id="ServiceFile"/>
</Feature>
</Product>
</Wix>
If the installation was successful yet the file was not updated, you should log the install to see why. For example:
msiexec /i filename.msi /lvoicewarmupx log.txt
One reason for a file to not get updated is if Windows Installer checks the version of the existing file and it is newer than the version of the file you are trying to install.

Confused with Wix bootstraper

I am having trouble understanding wix documentation. I have created a simple installer that allows user to select a destination folder for app. It looks something like this:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="AppName" Language="1033" Version="1.0.0.0" Manufacturer="Manufacturer" UpgradeCode="guid">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate />
<Feature Id="ProductFeature" Title="SetupProjectFeature" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
<UIRef Id="WixUI_InstallDir"/>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="OeeCoach" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<!-- TODO: Insert files, registry keys, and other resources here. -->
<Component Id="EntityFramework" Guid="guid">
<File Id="EntityFramework.dll" Source="../App/bin/Release/EntityFramework.dll" KeyPath="yes" />
</Component>
<Component Id="MvvmLight.Extras" Guid="guid">
<File Id="GalaSoft.MvvmLight.Extras.WPF4.dll" Source="../App/bin/Release/GalaSoft.MvvmLight.Extras.WPF4.dll" KeyPath="yes" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
Now I need to check for .net 4 and its prerequisites, but I could not understand hot to do this. Documentation says that I need to use Bundle element, but compiler seems to complain when it is together with Product element in same wix file.
Any help is appreciated.
The bootstrapper is a separate project from your setup project. If you are using Visual Studio, add a new project to your solution and choose Bootstrapper project (instead of Setup project).