Wix自定义操作删除与INF文件一起安装的旧版本

时间:2012-01-30 17:46:55

标签: windows wix inf

我正在开发一个使用WIX安装应用程序的项目。其中一个要求是在安装当前版本之前删除旧版本。旧版本不是基于MSI的,它是使用SetupApi创建的(它依赖于inf文件)。

我认为这可以通过自定义动作实现,逻辑如下:

  1. HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \%NAME%中查找“古老”版本,并在可能的情况下提取 UninstallString
  2. 如果设置了该值,则运行将执行该命令的自定义操作,通常它是一个字符串,如 RunDll32 advpack.dll,LaunchINFSection C:\ PROGRA~1 \ PROGRAM \ file.inf,DefaultUninstall
  3. 必须在安装程序之前执行此操作,因为它们具有共享文件和注册表项。如果在MSI安装结束时执行自定义操作,则会中断程序
  4. 我的问题是:

    1. 这是删除旧的基于INF的程序的推荐方法吗?
    2. 有没有办法以静默方式卸载基于INF的程序?否则用户体验将非常糟糕 - 一个人正在安装程序,突然他们看到一个“卸载程序”窗口。这是违反直觉的。 [通过在卸载命令中添加“,3”解决]
    3. 如果您感兴趣,以下是执行上述操作的代码段:

      <Property Id="ANCIENTVERSION">
        <RegistrySearch Id="RegistrySearchAncientVersion" Type="raw"
           Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Program" 
           Name="UninstallString" />
      </Property>
      
      <CustomAction Id="removeAncientVersion"
              Directory="SystemFolder"
              <!--ExeCommand="[ANCIENTVERSION]"  regular uninstall-->
              ExeCommand="[ANCIENTVERSION],3" <!--silent uninstall-->
              Execute="immediate"
              Return="check"/>
      
      <InstallExecuteSequence>
        <Custom Action='removeAncientVersion' After='InstallValidate'>ANCIENTVERSION</Custom>
      </InstallExecuteSequence>
      

1 个答案:

答案 0 :(得分:1)

经过一些研究后,我发现为了运行静默卸载,需要在UninstallString命令行的末尾添加“,3”。我测试了它并且它有效:

定期卸载

RunDll32 advpack.dll,LaunchINFSection C:\PROGRA~1\PROGRAM\file.inf, DefaultUninstall

无声卸载

RunDll32 advpack.dll,LaunchINFSection C:\PROGRA~1\PROGRAM\file.inf, DefaultUninstall,3

至于第一个问题 - 由于卸载机制相当于在添加/删除程序中点击“卸载”,我相信它不会比这更清洁/更好。