Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法从WiX中的安装程序运行卸载程序?_Wix_Windows Installer - Fatal编程技术网

有没有办法从WiX中的安装程序运行卸载程序?

有没有办法从WiX中的安装程序运行卸载程序?,wix,windows-installer,Wix,Windows Installer,我有一个基于WiX的应用程序套件安装程序。它取代了一堆旧的安装程序,套件中的每个应用程序都有自己的基于InstallShield的安装程序 我希望WiX安装程序能够找到任何基于InstallShield的旧安装,并运行各自的卸载程序。我试过这个: <Property Id="OLD_APPLICATION_A_UNINSTALLSTRING"> <RegistrySearch Id="OldAppAUninstallString" Root="HKLM" Key="

我有一个基于WiX的应用程序套件安装程序。它取代了一堆旧的安装程序,套件中的每个应用程序都有自己的基于InstallShield的安装程序

我希望WiX安装程序能够找到任何基于InstallShield的旧安装,并运行各自的卸载程序。我试过这个:

<Property Id="OLD_APPLICATION_A_UNINSTALLSTRING">
  <RegistrySearch Id="OldAppAUninstallString" Root="HKLM" 
   Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{$(var.OldAppAInstallerGUID)}"
   Name="UninstallString" Type="raw"/>
</Property>

<InstallExecuteSequence>
  <Custom Action="UninstallAppA" Before="InstallInitialize">
    NOT Installed AND OLD_APPLICATION_A_UNINSTALLSTRING
  </Custom>
</InstallExecuteSequence>

<CustomAction Id="UninstallAppA" Directory="System32"
 ExeCommand="[OLD_APPLICATION_A_UNINSTALLSTRING] /qn" Execute="immediate" Return="check"/>

未安装且旧的\u应用程序\u为\u卸载字符串
这将导致安装失败,错误状态为1618:“另一个安装已在进行中。请在继续此安装之前完成该安装。”只有一个其他安装正在进行,此安装

有没有办法从WiX中的安装程序运行卸载程序


我也有一个引导程序,也许我应该从那里以某种方式运行这些卸载。但我希望尽可能晚地运行它们,以防用户取消安装。如果发生这种情况,那么如果旧的应用程序套件消失了,看起来就不太好了…

在MSI中,有一个互斥锁阻止两个安装事务(执行序列)同时运行,因此会出现错误


您可以使用其他升级元素通过UpgradeCode/Version/Lanugage查找它们,并在安装过程中将它们删除。

您有这样一个示例如何使用MajorUpgrade吗?我对该元素的理解是,它使用其父产品元素的UpgradeCode来查找一个旧产品。我有大约十种不同的InstallShield安装的“升级代码”//GUID需要查找(和卸载)。WiX文档对这个场景没有太多帮助。啊,是的,我的错。MajorUpgrade是一个更高级别的抽象,它做出某些假设,例如使用您自己的升级代码。改为使用升级元素(答案已更新)。您需要10个升级元素,每个元素搜索与10个不同升级代码系列匹配的产品。我还没有让它工作,但您解释了为什么我的解决方案不工作,升级元素似乎是正确的方法。也许我使用了错误的GUID来查找旧的InstallShield安装。我接受这个答案。