【发布时间】:2012-01-30 17:46:54
【问题描述】:
我正在开发一个使用 WIX 安装应用程序的项目。要求之一是在安装当前版本之前删除旧版本。旧版本不是基于 MSI 的,它是使用 SetupApi(依赖于 inf 文件)创建的。
我认为这可以通过自定义动作来实现,逻辑如下:
- 在 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%NAME% 中寻找“古老”版本,并尽可能提取 UninstallString 值
- 如果设置了该值,则运行将执行该命令的自定义操作,通常是一个字符串,如 RunDll32 advpack.dll,LaunchINFSection C:\PROGRA~1\PROGRAM\file.inf, DefaultUninstall时间>
- 此操作必须在安装程序之前执行,因为它们具有共享文件和注册表项。如果在 MSI 安装结束时执行自定义操作,则会破坏程序
我的问题是:
- 这是删除基于 INF 的旧程序的推荐方法吗?
-
有没有办法静默卸载基于 INF 的程序?否则用户体验会很差——一个人正在安装一个程序,突然他们看到一个“卸载程序”窗口。这是反直觉的。[通过在卸载命令中添加“,3”解决]
如果您有兴趣,这里是执行我上面描述的代码 sn-ps:
<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>
【问题讨论】:
-
我认为您可以自己创建一个应用程序并使用相应的 INF 调用 SetupAPI 函数。这样您就可以抑制默认进度 UI。或者,您可以向用户显示一个对话框,在其中您说您将删除以前版本的应用程序。
-
直接调用 SetupAPI 函数是一种选择 - 但不幸的是,我无法找到有关如何使用 SetupAPI 进行静默卸载的任何详细信息。有关于静默安装的讨论,但我不确定这是否适用于删除过程。到目前为止,我的实验并不成功。