Broken Link. The correct one is http://wixcontrib.codeplex.com/
-----Original Message----- From: Rob Mensching [mailto:r...@robmensching.com] Sent: Tuesday, November 30, 2010 9:10 AM To: General discussion for Windows Installer XML toolset. Subject: Re: [WiX-users] [BUG/limitation in WIX/MSI]No way to distinguish between an uninstall and an update when <RemoveExistingProducts After="InstallInitialize"/> Getting the RemoveFile table entry right is *a lot* easier than getting rollback correct in all the cases it is required. The RemoveFoldersEx custom action does the same sort of work in the http://wix-contrib.codeplex.comproject. On Mon, Nov 29, 2010 at 7:02 AM, Michael Urman <mur...@gmail.com> wrote: > The trick here is that in the working case, the component is never > uninstalled. With REP after InstallFinalize, the new install > increments the component's reference count, possibly installing > updated contents. Then REP uninstalls the earlier version, which > merely decrements this component's reference count. You can verify > this by examining the differences in the verbose logs for each > scenario. > > If you want to find an "approved" way to handle this, perhaps you > should consider the approach in Bob's Semi-custom actions article > (http://www.joyofsetup.com/2007/07/01/semi-custom-actions/) by > conditionally writing to the remove file table. I'm personally torn as > to how great an idea it is, because the difficulty of getting the > RemoveFile table entry correct is nearly as difficult as getting a > file removal correct. > > However one last comment: this whole approach has problems. If you > ever use an Upgrade table entry to remove this product from from a new > unrelated product, it will then likely leave this file behind when it > should not. A pity there's no great way to handle such scenarios. > > On Mon, Nov 29, 2010 at 08:36, MeCoco <vcotirl...@hotmail.com> wrote: > > Hi Michael, > > > > Thanks for your answer. > > > > > Because of this, the premise that a component condition can > > prevent the RemoveFile table entry from executing during uninstall > > is flawed, > > > > I wouldn't have expected that, because of: > > > > 1) The code works as expected when I have REP after installFinalize, > > meaning the file is deleted only when uninstall, not also update. > > Why is then the code working as I was expecting when REP is after > > InstallFinalize? In that case the file should have also been removed > > as part of the component-uninstall right? > > > > 2) I was sure, one can accomplish my requirement (delete a file > > created by my application only when uninstall, not updates and REP > > is after > > InstallInitialize) with component conditions. > > > > If I can't accomplish that with component conditions, I have to use > > some CustomActions like a batch file or so, which is never > > recommended because they can't be rolled-back. > > I kept reading all around on the forum stuff like: > > "But as Brian pointed out before, you should not use batch files. If > > you're writing registry values or copying files, use native > > authoring which is transacted. Batch files are not transactional in > > nature. You'd need a separate batch file scheduled before your > > deferred CA executed as a rollback CA. But what about when your > > product is repaired or patched? > > What then? Conditions become difficult. Keeping standard or even > > custom data dependent on component install and action states helps > > avoid most of these issues. > " > > this is why I tried doing this with component conditions. > > > > That means there is no "approved" way of accomplishing this??? I > > wouldn't consider this being a so weird task: just deleting, when > > uninstalling, some files your app created and needs. I would have > > expected a standard way of doing this, and not through batch or > > other external custom actions as they can't be controlled during rollbacks. > > > > And still, why does this work when REP is after InstallFinalize? > > > > Thank you, > > MeCoco > > > > > > On 11/26/2010 1:57 PM, Michael Urman wrote: > >> Good job isolating it, but it's a problem understanding how > >> component conditions work. They only serve to gate when a component > >> is installed. With the transitive bit set, their going false can > >> also cause them to be uninstalled in a minor upgrade or other > >> maintenance scenario. However their being false will never prevent > >> their uninstallation. > >> > >> Because of this, the premise that a component condition can prevent > >> the RemoveFile table entry from executing during uninstall is > >> flawed, and you will need to find an alternate approach. Either it > >> needs to be tied to a component that is not removed, or possibly > >> you will need to use a custom action whose execution you can correctly > >> condition (e.g. > >> something referring to the combination of component install and > >> action states as well as the presence of UPGRADINGPRODUCTCODE). > >> > >> On Fri, Nov 26, 2010 at 04:48, MeCoco<vcotirl...@hotmail.com> wrote: > >>> OK, this seems to be a MSI bug, because after investigating I > >>> noticed > that: > >>> > >>> 1) by opening the created MSI with Orca I can see in the Component > table: > >>> removeFile {F82061CB-27F9-41F5-B5FE-2EDCA1F1A8F9} > >>> INSTALLLOCATION 0 (REMOVE=ALL) AND (NOT UPGRADINGPRODUCTCODE) > >>> > >>> 2) The, after an update, in the log file I can see: > >>> > >>> Ln 448 > >>> MSI (s) (44:40) [11:03:35:733]: Command Line: > >>> UPGRADINGPRODUCTCODE={BD36EB78-4DDE-4567-A300-DC497B51F5F5} > >>> CLIENTUILEVEL=0 REMOVE=ALL > >>> > >>> Ln 717 > >>> MSI (s) (44:40) [11:03:36:184]: Executing op: > >>> FileRemove(,FileName=momo.txt,,) > >>> > >>> So, even thoug in the MSI the component is correctly written with > >>> it's condition and even though one can see in the log that > >>> UPGRADINGPRODUCTCODE is set, still later in the log one can see > >>> that the component is executed, so I would say this is a MSI problem. > >>> > >>> MeCoco > >>> > >>> On 11/26/2010 10:00 AM, MeCoco wrote: > >>>> Hi all, > >>>> > >>>> After searching any possible explanation on the internet, and > >>>> after trying any possible combination of conditions, I got to the > >>>> conclusion that this is either a bug or a limitation of Wix/MSI, > >>>> because there is no condition that could distinguish between an > >>>> uninstall (from add/remove programs) and an update, when REP is > >>>> after > InstallInitialize, > >>>> eg<RemoveExistingProducts After="InstallInitialize"/>. > >>>> > >>>> I'm not sure if I should report this somewhere or not, but I will > >>>> post again my sample here, as this sample proves this bug/limitation. > >>>> In order to distinguish between an uninstall (from control panel) > >>>> and > an > >>>> update, I used any possible combination of: > >>>> Installed, REMOVE="ALL", OLDAPPFOUND and UPGRADINGPRODUCTCODE > >>>> without success. > >>>> > >>>> I created a small sample file that shows exactly this problem, > >>>> pls see below. The problem can be easily duplicated by doing: > >>>> 1) build the below sample into a project with version 1.0.0 > >>>> 2) build the same sample but with another version 1.0.1 (change > >>>> the version in CurrentVersion) > >>>> 3) run version 1.0.0 => the product will be installed > >>>> 4) In C:\Program Files\MySmallProject add a dummy file: momo.txt > (think > >>>> of it as a log file generated by running the application) > >>>> 5) run the second version 101, which _updates_ the product > >>>> > >>>> => after the update the momo.txt is !!gone!! even though the > component > >>>> which removes the file is having the condition: > >>>> (REMOVE=ALL) AND (NOT UPGRADINGPRODUCTCODE) which means that the > >>>> file shouldn't have been removed during an update only during an > >>>> uninstall. > >>>> > >>>> But if in the code instead of: > >>>> <RemoveExistingProducts After="InstallInitialize"/> > >>>> > >>>> you have: > >>>> <RemoveExistingProducts After="InstallFinalize"/> > >>>> > >>>> by doing all the above steps the momo.txt is _not_ deleted during > >>>> an update, only during a real uninstall (from add/remove > >>>> programs), which is the _desired_ behavior. > >>>> > >>>> So, it seems that when having<RemoveExistingProducts > >>>> After="InstallInitialize"/> there is no way to distinguish between > an > >>>> uninstall and an update. > >>>> > >>>> The code that proves the above described behaviour: > >>>> > >>>> <?xml version="1.0" encoding="UTF-8"?> > >>>> > >>>> <?define UpgradeCode = "61608F07-C47C-459F-97DD-CD02D104294C"?> > >>>> <?define CurrentVersion = "1.0.0"?> > >>>> > >>>> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> > >>>> <Product Id="*" Name="SmallProject" Language="1033" > >>>> Version="$(var.CurrentVersion)" Manufacturer="SmallProject" > >>>> UpgradeCode="$(var.UpgradeCode)"> <Package Id="*" > >>>> InstallerVersion="200" Compressed="yes" /> > >>>> > >>>> <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" /> > >>>> > >>>> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory > >>>> Id="ProgramFilesFolder"> <Directory Id="INSTALLLOCATION" > >>>> Name="MySmallProject"> > >>>> > >>>> <Component Id="mytest.txt" > Guid="7CED77A9-597B-456A-BEF7-44C094800A06"> > >>>> <File Id="mytest.txt" Source="mytest.txt" KeyPath="yes" /> > >>>> </Component> > >>>> > >>>> <Component Id="removeFile" > Guid="F82061CB-27F9-41F5-B5FE-2EDCA1F1A8F9"> > >>>> <RemoveFile Id="remove" Name="momo.txt" On="uninstall"/> > >>>> <Condition>(REMOVE=ALL) AND (NOT > >>>> UPGRADINGPRODUCTCODE)</Condition> </Component> > >>>> > >>>> </Directory> > >>>> </Directory> > >>>> </Directory> > >>>> > >>>> <Feature Id="ProductFeature" Title="SmallProject" Level="1"> > >>>> <ComponentRef Id="mytest.txt"/> <ComponentRef Id="removeFile"/> > >>>> </Feature> > >>>> > >>>> <Upgrade Id="$(var.UpgradeCode)"> <UpgradeVersion OnlyDetect="no" > >>>> Property="OLDAPPFOUND" Minimum="0.0.1" > >>>> IncludeMinimum="yes" Maximum="$(var.CurrentVersion)" > IncludeMaximum="no" /> > >>>> <UpgradeVersion OnlyDetect="yes" Property="NEWAPPFOUND" > >>>> Minimum="$(var.CurrentVersion)" IncludeMinimum="no" /> > >>>> <UpgradeVersion OnlyDetect="yes" Property="SELFFOUND" > >>>> Minimum="$(var.CurrentVersion)" IncludeMinimum="yes" > >>>> Maximum="$(var.CurrentVersion)" IncludeMaximum="yes" /> > >>>> </Upgrade> > >>>> > >>>> <CustomAction Id="NewerVersionDetected" Error="2000"/> > >>>> <CustomAction Id="CurrentVersionDetected" Error="2001"/> > >>>> > >>>> <UI> <Error Id="2000">!(loc.Error2000)</Error> </UI> > >>>> <UI> <Error Id="2001">!(loc.Error2001)</Error> </UI> > >>>> > >>>> <InstallExecuteSequence> > >>>> <FindRelatedProducts Sequence="100" /> <AppSearch > >>>> After="FindRelatedProducts"/> <LaunchConditions After="AppSearch" > >>>> /> <Custom Action="NewerVersionDetected" > After="AppSearch">NEWAPPFOUND</Custom> > >>>> <Custom Action="CurrentVersionDetected" > After="AppSearch">SELFFOUND</Custom> > >>>> <RemoveExistingProducts After="InstallInitialize"/> > >>>> <!--<RemoveExistingProducts After="InstallFinalize"/>--> > >>>> </InstallExecuteSequence> > >>>> > >>>> <!-- Find previous installation directory --> <Property > >>>> Id="INSTALLDIR"> <RegistrySearch Id="FindInstallLocation" > >>>> Root="HKLM" > >>>> > Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[OLDAPPFOUND]" > >>>> Name="InstallLocation" Type="raw" /> </Property> > >>>> > >>>> <CustomAction Id="SetARPINSTALLLOCATION" Property="ARPINSTALLLOCATION" > >>>> Value="[INSTALLDIR]" /> > >>>> <InstallExecuteSequence> > >>>> <Custom Action="SetARPINSTALLLOCATION" > >>>> After="InstallValidate">NOT Installed</Custom> > >>>> </InstallExecuteSequence> > >>>> > >>>> </Product> > >>>> </Wix> > >>>> > >>>> > >>>> Thank you, > >>>> MeCoco > >>>> > >>>> > ---------------------------------------------------------------------- > -------- > >>>> Increase Visibility of Your 3D Game App& Earn a Chance To Win $500! > >>>> Tap into the largest installed PC base& get more eyes on your game > by > >>>> optimizing for Intel(R) Graphics Technology. Get started today > >>>> with > the > >>>> Intel(R) Software Partner Program. Five $500 cash prizes are up > >>>> for > grabs. > >>>> http://p.sf.net/sfu/intelisp-dev2dev > >>>> _______________________________________________ > >>>> WiX-users mailing list > >>>> WiX-users@lists.sourceforge.net > >>>> https://lists.sourceforge.net/lists/listinfo/wix-users > >>>> > >>>> > >>> > >>> > ---------------------------------------------------------------------- > -------- > >>> Increase Visibility of Your 3D Game App& Earn a Chance To Win $500! > >>> Tap into the largest installed PC base& get more eyes on your > >>> game by optimizing for Intel(R) Graphics Technology. Get started > >>> today with the > >>> Intel(R) Software Partner Program. Five $500 cash prizes are up > >>> for > grabs. > >>> http://p.sf.net/sfu/intelisp-dev2dev > >>> _______________________________________________ > >>> WiX-users mailing list > >>> WiX-users@lists.sourceforge.net > >>> https://lists.sourceforge.net/lists/listinfo/wix-users > >>> > >> > ---------------------------------------------------------------------- > -------- > >> Increase Visibility of Your 3D Game App& Earn a Chance To Win $500! > >> Tap into the largest installed PC base& get more eyes on your game > >> by optimizing for Intel(R) Graphics Technology. Get started today > >> with the > >> Intel(R) Software Partner Program. Five $500 cash prizes are up for > grabs. > >> http://p.sf.net/sfu/intelisp-dev2dev > >> _______________________________________________ > >> WiX-users mailing list > >> WiX-users@lists.sourceforge.net > >> https://lists.sourceforge.net/lists/listinfo/wix-users > > > > > > > ---------------------------------------------------------------------- > -------- > > Increase Visibility of Your 3D Game App & Earn a Chance To Win $500! > > Tap into the largest installed PC base & get more eyes on your game > > by optimizing for Intel(R) Graphics Technology. Get started today > > with the > > Intel(R) Software Partner Program. Five $500 cash prizes are up for > grabs. > > http://p.sf.net/sfu/intelisp-dev2dev > > _______________________________________________ > > WiX-users mailing list > > WiX-users@lists.sourceforge.net > > https://lists.sourceforge.net/lists/listinfo/wix-users > > > > > ---------------------------------------------------------------------- > -------- Increase Visibility of Your 3D Game App & Earn a Chance To > Win $500! > Tap into the largest installed PC base & get more eyes on your game by > optimizing for Intel(R) Graphics Technology. Get started today with > the > Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs. > http://p.sf.net/sfu/intelisp-dev2dev > _______________________________________________ > WiX-users mailing list > WiX-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/wix-users > -- virtually, Rob Mensching - http://RobMensching.com LLC ------------------------------------------------------------------------------ Increase Visibility of Your 3D Game App & Earn a Chance To Win $500! Tap into the largest installed PC base & get more eyes on your game by optimizing for Intel(R) Graphics Technology. Get started today with the Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs. http://p.sf.net/sfu/intelisp-dev2dev _______________________________________________ WiX-users mailing list WiX-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/wix-users ------------------------------------------------------------------------------ Increase Visibility of Your 3D Game App & Earn a Chance To Win $500! Tap into the largest installed PC base & get more eyes on your game by optimizing for Intel(R) Graphics Technology. Get started today with the Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs. http://p.sf.net/sfu/intelisp-dev2dev _______________________________________________ WiX-users mailing list WiX-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/wix-users