2012-01-30 56 views
2

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

我想这可以通过自定义操作来实现,逻辑如下:

  1. 寻找在HKLM \ SOFTWARE “古” 版\微软\的Windows \ CurrentVersion \卸载\%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> 
+0

我想你可以创建一个应用程序,并用你自己的相应INF调用SetupAPI函数。这样你可以禁止默认的进度UI。或者,您可以向用户显示一个对话框,您可以在其中说您将要删除该应用程序的先前版本。 – 2012-02-01 06:36:53

+0

直接调用SetupAPI函数是一个选项 - 但不幸的是,我无法找到有关如何使用SetupAPI执行无提示卸载的任何详细信息。 有关于静默安装的讨论,但我不确定这适用于删除过程。到目前为止,我的实验并不成功。 – Alex 2012-02-01 14:04:44

回答

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 

至于第一个问题 - 因为卸载机制是点击“卸载”中添加相当于/删除程序,我相信它不能得到任何更清洁/更好的。