1
votes

Major upgrade does not work correctly for following installation.
If the previous version of the application is installed on the current PC, then during major upgrade old version will be automatically uninstalled, but new version is not installed by some reason.
I need to run this new installation twice in order to uninstall the old version and then install new one.
But if I comment out the custom action LaunchApplication in the old version of installation, then there will not be any problems and old version will be uninstalled and new version will be installed during the one run of the new installation.

<?xml version='1.0' encoding='windows-1252'?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

  <Product Name='Foobar 2.0.0' Id='GUID' UpgradeCode='GUID'
    Language='1033' Codepage='1252' Version='2.0.0' Manufacturer='Acme Ltd.'>

    <Package Id='*' Keywords='Installer' Description="Acme's Foobar 2.0.0 Installer"
      Comments='Foobar is a registered trademark of Acme Ltd.' Manufacturer='Acme Ltd.'
      InstallerVersion='100' Languages='1033' Compressed='yes' SummaryCodepage='1252' />

    <Property Id="ALLUSERS" Secure="yes" Value="2" />
    <Property Id="MSIINSTALLPERUSER" Secure="yes" Value="1" />
    <Property Id='ApplicationFolderName' Value="Acme" />
    <Property Id='WixAppFolder' Value="WixPerUserFolder" />

    <Upgrade Id='GUID'>
       <UpgradeVersion OnlyDetect='no' Property='PREVIOUSFOUND'
           Minimum='0.0.1' IncludeMinimum='yes'
           Maximum='2.0.0' IncludeMaximum='no' />
          <UpgradeVersion OnlyDetect='yes' Property='NEWERFOUND'
             Minimum='2.0.0' IncludeMinimum='no' />
    </Upgrade>

    <Media Id='1' Cabinet='Sample.cab' EmbedCab='yes' DiskPrompt="CD-ROM #1" />
    <Property Id='DiskPrompt' Value="Acme's Foobar 2.0.0 Installation [1]" />

    <Directory Id='TARGETDIR' Name='SourceDir'>
      <Directory Id='ProgramFilesFolder' Name='PFiles'>
        <Directory Id='Acme' Name='Acme'>
          <Directory Id='INSTALLDIR' Name='Foobar 2.0.0'>
          </Directory>
        </Directory>
      </Directory>
    </Directory>

    <DirectoryRef Id="INSTALLDIR">
       <Component Id='start.vbs' Guid='GUID'>
          <File Id='start.vbs' Name='start.vbs' DiskId='1' Source='start.vbs' KeyPath='yes' >
          </File>
       </Component>
    </DirectoryRef>

    <Feature Id='Complete' Title='Foobar 2.0.0' Description='The complete package.'
      Display='expand' Level='1' ConfigurableDirectory='INSTALLDIR'>
      <Feature Id='MainProgram' Title='Program' Description='The main executable.' Level='1'>
        <ComponentRef Id='start.vbs' />
      </Feature>
    </Feature>

    <CustomAction Id='AlreadyUpdated' Error='[ProductName] has already been updated to 2.0.0 or newer.' />
    <CustomAction Id='NoDowngrade' Error='A later version of [ProductName] is already installed.' />

    <Property Id="WixShellExecTarget" Value="[#start.vbs]" />
    <CustomAction Id="LaunchApplication" 
        BinaryKey="WixCA" 
        DllEntry="WixShellExec"
        Execute="immediate"
        Impersonate="yes" />

    <InstallExecuteSequence>
         <Custom Action='AlreadyUpdated' After='FindRelatedProducts'>SELFFOUND</Custom>
         <Custom Action="NoDowngrade" After="FindRelatedProducts">NEWERFOUND</Custom>

         <RemoveExistingProducts Before="InstallInitialize" />

         <Custom Action="LaunchApplication" After="InstallFinalize"/>

    </InstallExecuteSequence>
  </Product>
</Wix>

What could be wrong with this installation or with custom action?
VBS procedure is empty.
start.vbs:

Private Function startServerSub()
End Function
startServerSub

What should be changed to have ability to uninstall previous version and install new one during one run of new application?

UPDATE:
I changed my installation a little.
1. RemoveExistingProducts will be executed after InstallInitialize.
2. Added SELFFOUND to Upgrade element.

<?xml version='1.0' encoding='windows-1252'?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

  <Product Name='TestApp 2.0.0' Id='GUID' UpgradeCode='GUID'
    Language='1033' Codepage='1252' Version='2.0.0' Manufacturer='TestManufacturer Ltd.'>

    <Package Id='*' Keywords='Installer' Description="TestManufacturer's TestApp 2.0.0 Installer"
      Comments='TestAppis a registered trademark of TestManufacturer Ltd.' Manufacturer='TestManufacturer Ltd.'
      InstallerVersion='100' Languages='1033' Compressed='yes' SummaryCodepage='1252' />

    <Property Id="ALLUSERS" Secure="yes" Value="2" />
    <Property Id="MSIINSTALLPERUSER" Secure="yes" Value="1" />
    <Property Id='ApplicationFolderName' Value="TestManufacturer" />
    <Property Id='WixAppFolder' Value="WixPerUserFolder" />

    <Upgrade Id='GUID'>
       <UpgradeVersion OnlyDetect='yes' Property='SELFFOUND'
           Minimum='2.0.0' IncludeMinimum='yes'
           Maximum='2.0.0' IncludeMaximum='yes' />
       <UpgradeVersion OnlyDetect='no' Property='PREVIOUSFOUND'
           Minimum='0.0.1' IncludeMinimum='yes'
           Maximum='2.0.0' IncludeMaximum='no' />
          <UpgradeVersion OnlyDetect='yes' Property='NEWERFOUND'
             Minimum='2.0.0' IncludeMinimum='no' />
    </Upgrade>

    <Media Id='1' Cabinet='Sample.cab' EmbedCab='yes' DiskPrompt="CD-ROM #1" />
    <Property Id='DiskPrompt' Value="TestManufacturer's TestApp 2.0.0 Installation [1]" />

    <Directory Id='TARGETDIR' Name='SourceDir'>
      <Directory Id='ProgramFilesFolder' Name='PFiles'>
        <Directory Id='TestManufacturer' Name='TestManufacturer'>
          <Directory Id='INSTALLDIR' Name='TestApp 2.0.0'>
          </Directory>
        </Directory>
      </Directory>
    </Directory>

    <DirectoryRef Id="INSTALLDIR">
       <Component Id='start.vbs' Guid='GUID'>
          <File Id='start.vbs' Name='start.vbs' DiskId='1' Source='start.vbs' KeyPath='yes' >
          </File>
       </Component>
    </DirectoryRef>

    <Feature Id='Complete' Title='TestApp 2.0.0' Description='The complete package.'
      Display='expand' Level='1' ConfigurableDirectory='INSTALLDIR'>
      <Feature Id='MainProgram' Title='Program' Description='The main executable.' Level='1'>
        <ComponentRef Id='start.vbs' />
      </Feature>
    </Feature>

    <CustomAction Id='AlreadyUpdated' Error='[ProductName] has already been updated to 2.0.0 or newer.' />
    <CustomAction Id='NoDowngrade' Error='A later version of [ProductName] is already installed.' />

    <Property Id="WixShellExecTarget" Value="[#start.vbs]" />
    <CustomAction Id="LaunchApplication" 
        BinaryKey="WixCA" 
        DllEntry="WixShellExec"
        Execute="immediate"
        Impersonate="yes" />

    <InstallExecuteSequence>
         <Custom Action='AlreadyUpdated' After='FindRelatedProducts'>SELFFOUND</Custom>
         <Custom Action="NoDowngrade" After="FindRelatedProducts">NEWERFOUND</Custom>

         <RemoveExistingProducts After="InstallInitialize" />

         <Custom Action="LaunchApplication" After="InstallFinalize"/>

    </InstallExecuteSequence>

  </Product>
</Wix>

Then I created 4 installation packages:
1. Version 1.0.0 with custom action LaunchApplication after InstallFinalize.
2. Version 1.0.0 without custom action LaunchApplication.
3. Version 2.0.0 with custom action LaunchApplication after InstallFinalize.
4. Version 2.0.0 without custom action LaunchApplication.

It is impossible to install any type of version 2.0.0, if version 1.0.0 with custom action was installed.

I tried to install version 2.0.0(without custom action) after version 1.0.0(with custom action):

=== Verbose logging started: 7/22/2015  18:37:48  Build type: SHIP UNICODE 5.00.7601.00  Calling process: C:\Windows\system32\msiexec.EXE ===  
...  
Action 18:37:48: FindRelatedProducts. Searching for related applications  
Action start 18:37:48: FindRelatedProducts.  
FindRelatedProducts: Found application: {GUID of 1.0.0}  
MSI (c) (A8:A4) [18:37:48:221]: PROPERTY CHANGE: Adding PREVIOUSFOUND property. Its value is '{GUID of 1.0.0}'.  
...  
Action start 18:37:48: InstallInitialize.  
MSI (s) (F4:0C) [18:37:48:299]: Machine policy value 'AlwaysInstallElevated' is 0  
MSI (s) (F4:0C) [18:37:48:299]: User policy value 'AlwaysInstallElevated' is 0  
MSI (s) (F4:0C) [18:37:48:299]: BeginTransaction: Locking Server  
MSI (s) (F4:0C) [18:37:48:299]: Note: 1: 1715 2: TestApp 2.0.0   
MSI (s) (F4:0C) [18:37:48:299]: Note: 1: 2262 2: Error 3: -2147287038   
MSI (s) (F4:0C) [18:37:48:299]: Calling SRSetRestorePoint API. dwRestorePtType: 0, dwEventType: 102, llSequenceNumber: 0, szDescription: "Installed TestApp 2.0.0".  
MSI (s) (F4:0C) [18:37:48:299]: The System Restore service is disabled. Returned status: 1058. GetLastError() returned: 1058  
MSI (s) (F4:0C) [18:37:48:299]: Server not locked: locking for product {GUID of 2.0.0}  
Action ended 18:37:48: InstallInitialize. Return value 1.  
MSI (s) (F4:0C) [18:37:48:845]: Doing action: RemoveExistingProducts  
MSI (s) (F4:0C) [18:37:48:845]: Note: 1: 2205 2:  3: ActionText   
Action start 18:37:48: RemoveExistingProducts.  
MSI (s) (F4:0C) [18:37:48:845]: Note: 1: 2262 2: Error 3: -2147287038   
MSI (s) (F4:0C) [18:37:48:845]: Note: 1: 2262 2: Error 3: -2147287038   
...  
Action start 18:37:48: InstallFinalize.  
...  
MSI (s) (F4:AC) [18:37:48:939]: Verifying accessibility of file: start.vbs  
MSI (s) (F4:AC) [18:37:48:939]: Note: 1: 2318 2:    
MSI (s) (F4:AC) [18:37:48:939]: Note: 1: 2318 2:    
...  
Action ended 18:37:48: InstallFinalize. Return value 1.  
MSI (s) (F4:AC) [18:37:48:939]: Doing action: LaunchApplication  
MSI (s) (F4:AC) [18:37:48:939]: Note: 1: 2205 2:  3: ActionText   
Action start 18:37:48: LaunchApplication.  
MSI (s) (F4:AC) [18:37:48:939]: Creating MSIHANDLE (9) of type 790542 for thread 8108  
MSI (s) (F4:B0) [18:37:48:939]: Invoking remote custom action. DLL: C:\Windows\Installer\MSIECB.tmp, Entrypoint: WixShellExec  
MSI (s) (F4:24) [18:37:48:939]: Generating random cookie.  
MSI (s) (F4:24) [18:37:48:939]: Created Custom Action Server with PID 8596 (0x2194).  
MSI (s) (F4:48) [18:37:48:970]: Running as a service.  
MSI (s) (F4:48) [18:37:48:970]: Hello, I'm your 32bit Impersonated custom action server.  
MSI (s) (F4!74) [18:37:49:001]: Creating MSIHANDLE (10) of type 790541 for thread 1140  
MSI (s) (F4!74) [18:37:49:001]: Creating MSIHANDLE (11) of type 790531 for thread 1140  
MSI (s) (F4!74) [18:37:49:001]: Closing MSIHANDLE (11) of type 790531 for thread 1140  
MSI (s) (F4!74) [18:37:49:001]: Creating MSIHANDLE (12) of type 790531 for thread 1140  
WixShellExec:  Error 0x80070002: ShellExec failed with return code 2  
MSI (s) (F4!74) [18:37:49:001]: Closing MSIHANDLE (12) of type 790531 for thread 1140  
MSI (s) (F4!74) [18:37:49:017]: Creating MSIHANDLE (13) of type 790531 for thread 1140  
WixShellExec:  Error 0x80070002: failed to launch target  
MSI (s) (F4!74) [18:37:49:017]: Closing MSIHANDLE (13) of type 790531 for thread 1140  
MSI (s) (F4!74) [18:37:49:017]: Closing MSIHANDLE (10) of type 790541 for thread 1140  
CustomAction LaunchApplication returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)  
MSI (s) (F4:B0) [18:37:49:017]: Closing MSIHANDLE (9) of type 790542 for thread 8108  
Action ended 18:37:49: LaunchApplication. Return value 3.  
Action ended 18:37:49: INSTALL. Return value 3.  
...  
Property(N): WixShellExecTarget = [#start.vbs]  
...  
CustomAction  returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)  
MSI (s) (F4:0C) [18:37:49:017]: Note: 1: 2262 2: Error 3: -2147287038   
MSI (s) (F4:0C) [18:37:49:017]: Note: 1: 2262 2: Error 3: -2147287038   
Action ended 18:37:49: RemoveExistingProducts. Return value 3.  
MSI (s) (F4:0C) [18:37:49:017]: User policy value 'DisableRollback' is 0  
MSI (s) (F4:0C) [18:37:49:017]: Machine policy value 'DisableRollback' is 0  
MSI (s) (F4:0C) [18:37:49:017]: Executing op: Header(Signature=1397708873,Version=500,Timestamp=1190565049,LangId=1033,Platform=0,ScriptType=2,ScriptMajorVersion=21,ScriptMinorVersion=4,ScriptAttributes=0)  
MSI (s) (F4:0C) [18:37:49:017]: Executing op: DialogInfo(Type=0,Argument=1033)  
MSI (s) (F4:0C) [18:37:49:017]: Executing op: DialogInfo(Type=1,Argument=TestApp 1.0.0)  
MSI (s) (F4:0C) [18:37:49:017]: Executing op: RollbackInfo(,RollbackAction=Rollback,RollbackDescription=Rolling back action:,RollbackTemplate=[1],CleanupAction=RollbackCleanup,CleanupDescription=Removing backup files,CleanupTemplate=File: [1])  
MSI (s) (F4:0C) [18:37:49:017]: Executing op: SetTargetFolder(Folder=C:\Users\user1\AppData\Local\Programs\TestManufacturer\TestApp 1.0.0\)  
MSI (s) (F4:0C) [18:37:49:017]: Executing op: FileCopy(SourceName=C:\Config.Msi\1bc1cc05.rbf,,DestName=C:\Users\user1\AppData\Local\Programs\TestManufacturer\TestApp 1.0.0\start.vbs,Attributes=40992,FileSize=331,PerTick=0,,VerifyMedia=0,ElevateFlags=1,,,,,,,InstallMode=4194308,,,,,,,)  
MSI (s) (F4:0C) [18:37:49:017]: File: C:\Users\user1\AppData\Local\Programs\TestManufacturer\TestApp 1.0.0\start.vbs;   To be installed;    Won't patch;    No existing file  
...  
MSI (s) (F4:0C) [18:37:49:126]: Executing op: End(Checksum=0,ProgressTotalHDWord=0,ProgressTotalLDWord=0)  
MSI (s) (F4:0C) [18:37:49:126]: Error in rollback skipped.  Return: 5  
MSI (s) (F4:0C) [18:37:49:126]: No System Restore sequence number for this installation.  
MSI (s) (F4:0C) [18:37:49:126]: Unlocking Server  
MSI (s) (F4:0C) [18:37:49:173]: Note: 1: 2205 2:  3: Control   
Action ended 18:37:49: INSTALL. Return value 3.  
...  
MSI (s) (F4:0C) [18:37:49:173]: MainEngineThread is returning 1603  
MSI (s) (F4:78) [18:37:49:173]: RESTART MANAGER: Session closed.  
MSI (s) (F4:78) [18:37:49:173]: RESTART MANAGER: Session closed.  
MSI (s) (F4:78) [18:37:49:173]: No System Restore sequence number for this installation.  
MSI (s) (F4:78) [18:37:49:173]: User policy value 'DisableRollback' is 0  
MSI (s) (F4:78) [18:37:49:173]: Machine policy value 'DisableRollback' is 0  
MSI (s) (F4:78) [18:37:49:173]: Incrementing counter to disable shutdown. Counter after increment: 0  
MSI (s) (F4:78) [18:37:49:173]: Note: 1: 1402 2: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Installer\Rollback\Scripts 3: 2   
MSI (s) (F4:78) [18:37:49:173]: Note: 1: 1402 2: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Installer\Rollback\Scripts 3: 2   
MSI (s) (F4:78) [18:37:49:189]: Decrementing counter to disable shutdown. If counter >= 0, shutdown will be denied.  Counter after decrement: -1  
MSI (s) (F4:78) [18:37:49:189]: Restoring environment variables  
MSI (s) (F4:78) [18:37:49:189]: Destroying RemoteAPI object.  
MSI (s) (F4:24) [18:37:49:189]: Custom Action Manager thread ending.  
MSI (c) (A8:A4) [18:37:49:189]: Back from server. Return value: 1603  
MSI (c) (A8:A4) [18:37:49:189]: Decrementing counter to disable shutdown. If counter >= 0, shutdown will be denied.  Counter after decrement: -1  
MSI (c) (A8:A4) [18:37:49:189]: PROPERTY CHANGE: Deleting SECONDSEQUENCE property. Its current value is '1'.  
Action ended 18:37:49: ExecuteAction. Return value 3.  
Action ended 18:37:49: INSTALL. Return value 3.  
...  
=== Logging stopped: 7/22/2015  18:37:49 ===  
MSI (c) (A8:A4) [18:37:49:189]: Note: 1: 1708   
MSI (c) (A8:A4) [18:37:49:189]: Note: 1: 2262 2: Error 3: -2147287038   
MSI (c) (A8:A4) [18:37:49:189]: Note: 1: 2262 2: Error 3: -2147287038   
MSI (c) (A8:A4) [18:37:49:189]: Product: TestApp 2.0.0 -- Installation failed.  

As I understand the root cause problem is that I do not use "NOT Installed AND NOT UPGRADINGPRODUCTCODE" condition in custom action LaunchApplication.

 <Custom Action="LaunchApplication" After="InstallFinalize">NOT Installed AND NOT UPGRADINGPRODUCTCODE</Custom>

In this case installer during installation of new version removes the old version, and then tries to run custom action LaunchApplication from the old version, but all files are already removed. That's why installation fails.
I added condition "NOT Installed AND NOT UPGRADINGPRODUCTCODE" to LaunchApplication and now it is possible to perform major upgrade of my application.
But I am not sure which condition should I use - "NOT Installed AND NOT UPGRADINGPRODUCTCODE" or "NOT Installed".
I need to run custom action LaunchApplication during first installation and during all major upgrades.

1

1 Answers

0
votes

Not sure this is an answer but there's too much for a comment.

First, do the upgrades with verbose logging, msiexec.exe command with a /L*vx to see what's going on because there are a number of things that don't make sense.

  1. Your custom action is after InstallFinalize, which means it is after the install has completed and committed so it cannot cause the the upgrade to fail.

  2. Your RemoveExistingProducts is before InstallInitialize. This means that it is outside the install transaction that starts at InstallInitialize. It really needs to be just after InstallInitialize to be included in the transation because currently it is independent of your new product install, and so you can get any combination of the remove failing or working and your install failing or working and you can end up with an indeterminate set of products on your system. None, noth or one of them.

  3. What's SELFFOUND? I'd expect an Upgrade element to refer to it but there isn't one. In general you should look at the MajorUpgrade element and set attributes such as AllowSameVersionUpgrades to No if you want to prevent installing a major upgrade with the same version. If SELFFOUND is intended to prevent installing the same MSI file twice, then don't bother because Windows won't let you do that anyway.

So there's not really enough info to see what's going on, but that CA can't be responsible. The most likely explanation is that the first upgrade fails - it removes the older product, then your new install fails, and because the remove is outside the transaction all you see is the remove working and your install failing. When you install again it's a fresh system, that's the main difference. Check the logs!