2

我正在开发一个使用 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 安装结束时执行自定义操作,它将破坏程序

我的问题是:

  1. 这是删除旧的基于 INF 程序的推荐方法吗?
  2. 有没有办法静默卸载基于 INF 的程序?否则用户体验会很差——一个人正在安装一个程序,突然他们看到一个“卸载程序”窗口。这是反直觉的。[通过在卸载命令中添加“,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>
4

1 回答 1

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

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

于 2012-02-01T14:57:15.067 回答