Hi Michael,

Thanks a lot for the explanation and for the link. I'll take a look, as 
this would be the "approved" way of doing this.

If one wants to do that with CA, then the code would be (I'll put the 
code here for further reference):

<CustomAction Id="QtExecDeferred_Cmd" Property="QtExecDeferred" 
Value='"[SystemFolder]Cmd.exe"  /C del /Q "[INSTALLLOCATION]momo.txt"'/>
<CustomAction Id="QtExecDeferred" BinaryKey="WixCA" 
DllEntry="CAQuietExec" Execute="deferred" Return="ignore" Impersonate="no"/>

<InstallExecuteSequence>
<Custom Action="QtExecDeferred" 
After="RemoveExistingProducts">REMOVE="ALL" AND NOT 
UPGRADINGPRODUCTCODE</Custom>
<Custom Action="QtExecDeferred_Cmd" Before="QtExecDeferred">REMOVE="ALL" 
AND NOT UPGRADINGPRODUCTCODE</Custom>
</InstallExecuteSequence>

Thank you,
MeCoco

On 11/29/2010 4:02 PM, Michael Urman 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


------------------------------------------------------------------------------
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

Reply via email to