1
votes

I'm using wix to create an installer for my application in Visual Studio. I need a post-install executable run after install (which I've got working) and a pre-uninstall executable run before uninstallation. All of these executables require elevated rights to run (my application, the post-install, and pre-uninstall).

I've scoured the web and stack overflow and found many posts related to this, but none of the solutions seem to work. Either the executables simply don't run, or, on uninstall I get error

There is a problem with this Windows Installer package. A program required for this install to complete could not be run. Contact your support personnel or package vendor.

Here is my Directory layout

<Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="ProgramFilesFolder">
            <Directory Id="ROOTDIRECTORY" Name="MyCompany" >
                <Directory Id="FOLDERONE" Name="FolderOne" />
                <Directory Id="UTILITYFOLDER" Name="Utility" />
            </Directory>
        </Directory>
    </Directory>
</Fragment>

And a snippet of my File layout

<Fragment>
    <DirectoryRef Id="UTILITYINSTALLFOLDER">
        <Component Id="cmpPreInstallId" Guid="{56DC3D0A-E887-4A94-95B3-72825310DC5D}">
            <File Id="filPreInstallId" KeyPath="yes" Source="path_to\PreUninstall.exe" />
        </Component>
        <Component Id="cmpPosUninstallId" Guid="{DE1DE45E-4D7C-4884-BA3E-EC078E265B7C}">
            <File Id="filPostUninstallId" KeyPath="yes" Source="path_to\PostInstall.exe" />
        </Component>
        <!-- obviously there are other files/components -->
    </DirectoryRef>
</Fragment>
<Fragment>
    <ComponentGroup Id="UtilityPublishedComponents">
        <ComponentRef Id="cmpPreInstallId" />
        <ComponentRef Id="cmpPosUninstallId" />
    </ComponentGroup>
</Fragment>

And in my Product.wxs

<Product ...>

    <!-- The only way I found that actually worked to run the post install was -->
    <UI>
        <UIRef Id="WixUI_Minimal" />
        <Publish Dialog="ExitDialog"
               Control="Finish"
               Event="DoAction"
               Value="PostInstallExe">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
    </UI>
    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Perform post-install operations." />
    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1"/>
    <Property Id="WixShellExecTarget" Value="[#filPostUninstallId]" />
    <CustomAction Id="PostInstallExe"
                  BinaryKey="WixCA"
                  DllEntry="WixShellExec"
                  Impersonate="yes" />

    <!-- this does not work to run the pre-uninstall -->
    <CustomAction Id="EXECUTE_BEFORE_UNINSTALL"
                  Return="check"
                  Impersonate="yes"
                  Execute="immediate"
                  Directory="UTILITYINSTALLFOLDER"
                  ExeCommand="PreUninstall.exe" />
    <InstallExecuteSequence>
        <Custom Action="EXECUTE_BEFORE_UNINSTALL" Before="RemoveFiles">Installed AND NOT REINSTALL</Custom>
    </InstallExecuteSequence>

    <!-- other stuff plus the feature -->

</Product>

Anyone with experience see where this might be going wrong?

I've tried many variations of the CustomAction return, impersonate, execute, etc

1

1 Answers

0
votes

Finally got it to work, so hopefully this helps someone. Not sure what the issue was ... but here!

<!-- Setup post install operations -->
<CustomAction Id="PostInstall"
              FileKey="key_to_post_install_exe"
              ExeCommand=""
              Execute="deferred"
              Return="check"
              Impersonate="no" />

<!-- Setup pre uninstall operations -->
<CustomAction Id="PreUninstall"
              FileKey="key_to_pre_uninstall_exe"
              ExeCommand=""
              Execute="deferred"
              Return="ignore"
              Impersonate="no" />

<!-- Add pre and post install operations to the installer -->
<InstallExecuteSequence>
  <Custom Action="PostInstall" Before="InstallFinalize">NOT Installed</Custom>
  <Custom Action="PreUninstall" After="InstallInitialize">Installed</Custom>
</InstallExecuteSequence>