Hi all,

I'm having a problem with Custom Action Type 50 in WiX 3.0. We're using the 
version 3.0.4805.0.
Background:
===========
We'd like to uninstall the old version of our software when installing the new 
version. The old version software's installer was made by using Inno Setup. 
What we need to do is really simple:
Look for the registry at 
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\cpsoftware_is1"
to find out the "UninstallString". This string is something like "C:\Program 
Files\cpsoftware\unins000.exe"
Then run this uninstaller with the parameters like "/silent /keepdata"
Our code:
=========
#1. Firstly, I thought we can do this below, but it didn't work:
<Property Id='QUERY_REG_CPSW'>
<RegistrySearch Id='QueryRegCpsw' 
                    Root='HKLM' 
                    
Key='Software\Microsoft\Windows\CurrentVersion\Uninstall\cpsw_is1' 
                    Name='UninstallString'
                    Type='raw' />
</Property>
<CustomAction Id="ExecUninstallCpswCmd" 
              Property="QUERY_REG_CPSW" 
              ExeCommand="/SILENT /KEEPDATA"
              Return="asyncWait" 
              />
<InstallExecuteSequence>
<Custom Action="ExecUninstallCpswCmd" Before="InstallFinalize">QUERY_REG_CPSW 
And Not Installed</Custom>
</InstallExecuteSequence>

#2. Then, I googled and someone said "you need to set property for type 50 
custom action". Then I tried this which still didn't work:
<Property Id='QUERY_REG_CPSW'>
<RegistrySearch Id='QueryRegCpsw' 
                    Root='HKLM' 
                    
Key='Software\Microsoft\Windows\CurrentVersion\Uninstall\cpsw_is1' 
                    Name='UninstallString'
                    Type='raw' />
</Property>
<CustomAction Id="SetUninstallCpswCmd" 
              Property="ExecUninstallCpswProperty" 
              Value='[QUERY_REG_CPSW]' 
              />
<CustomAction Id="ExecUninstallCpswCmd" 
              Property="ExecUninstallCpswProperty" 
              ExeCommand="/SILENT /KEEPDATA"
              Return="asyncWait" 
              />
<InstallExecuteSequence>
<Custom Action="SetUninstallCpswCmd" After="AppSearch">QUERY_REG_CPSW</Custom>
<Custom Action="ExecUninstallCpswCmd" Before="InstallFinalize">QUERY_REG_CPSW 
And Not Installed</Custom>
</InstallExecuteSequence>

#3. Finally, I tried another way below. I made 2 changes here: 
1). Instead of query "UninstallString" string which includes the full path and 
the uninstaller name, I query "InstallLocation" which is just the path to the 
uninstaller. 
2). In the property ExecUninstallCpswProperty, I set the value as 
'[QUERY_REG_CPSW]unins000.exe'.
This time, it works - the old software got uninstalled during installing the 
new software.
<Property Id='QUERY_REG_CPSW'>
<RegistrySearch Id='QueryRegCpsw' 
                    Root='HKLM' 
                    
Key='Software\Microsoft\Windows\CurrentVersion\Uninstall\cpsw_is1' 
                    Name='InstallLocation'
                    Type='raw' />
</Property>
<CustomAction Id="SetUninstallCpswCmd" 
              Property="ExecUninstallCpswProperty" 
              Value='[QUERY_REG_CPSW]unins000.exe' 
              />
<CustomAction Id="ExecUninstallCpswCmd" 
              Property="ExecUninstallCpswProperty" 
              ExeCommand="/SILENT /KEEPDATA"
              Return="asyncWait" 
              />
<InstallExecuteSequence>
<Custom Action="SetUninstallCpswCmd" After="AppSearch">QUERY_REG_CPSW</Custom>
<Custom Action="ExecUninstallCpswCmd" Before="InstallFinalize">QUERY_REG_CPSW 
And Not Installed</Custom>
</InstallExecuteSequence>

Questions:

==========
1. Why the code I posted in #2 case above didn't work? That "UninstallString" 
does includes the uninstaller path and name. Whey I can't use it directly and 
give some parameters? What is wrong in the code in #2?
2. In #3 code above, it works. But why I must give the uninstaller name in the 
property ExecUninstallCpswProperty? The reason that I don't want to explicitly 
give the uninstaller name is, sometimes the uninstaller name might not be 
"unins000.exe". Sure, in most of the cases, it is "unins000.exe". But in some 
cases, it is not. I mean, if we can read the uninstaller path and name from 
registry, why I have to give the uninstaller name which isn't a sure thing? 
Am I doing the right thing? Please point me out.
Thanks in advance,
/Brian


      __________________________________________________________________
Reclaim your name @ymail.com or @rocketmail.com. Get your new email address 
now! Go to http://ca.promos.yahoo.com/jacko/
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
WiX-users mailing list
WiX-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wix-users

Reply via email to