使用MsiSetExternalUI时,Add / RemovePrograms控制面板中的条目重复

时间:2012-01-25 20:55:08

标签: windows installer windows-installer

我针对Windows XP及更高版本的产品创建了一个设置,使用Windows安装程序(WI)进行安装。生成的.msi文件有一个产品代码,让我们说PC1(实际上是一个guid)和一个升级代码UC1(也是一个guid)。过了一段时间,我为我的产品的新版本创建了一个新的设置。新的.msi文件有一个新的产品代码PC2和相同的升级代码UC1(也称为主要升级)。我的公司想用我们自己的安装程序安装.msi文件。为此,我们基本上使用MsiInstallProduct来安装.msi文件,而整个UI都在我们自己的安装程序中(我们使用MsiSetExternalUI来请求WI向我们发送通知)。我遇到的问题如下:

  • 如果产品的两个版本使用" msiexec / i myapp.msi"安装在同一台机器上然后在"添加/删除程序"中只有一个条目。 "程序和功能"控制面板小程序。或换句话说,在安装新版本期间,将卸载旧版本。

  • 如果两个版本使用MsiInstallProduct以编程方式安装在同一台机器上,则控制面板中将有两个不同的条目。

再一次,只有当我尝试以编程方式安装它时(使用MsiOpenPackage + MsiDoAction或MsiInstallProduct),升级才会发生,我最终在控制面板中输入了两个条目。我还发现如果我在调用MsiInstallProduct或MsiDoAction之前没有使用MsiSetExternalUI设置外部UI回调,那么新安装的升级部分也会按预期工作,CP中没有重复的条目。

我用于MsiSetExternalUI的回调与此MSDN文章中的回调基本相同: http://msdn.microsoft.com/en-us/library/windows/desktop/aa368786(v=vs.85).aspx

我可以做些什么(或者我需要在回调中处理什么)以避免在控制面板中出现重复/多个条目?

谢谢和最诚挚的问候,
利文特

2 个答案:

答案 0 :(得分:0)

回到上面的评论,我对CLIENTUILEVEL进行了谷歌搜索,前几次点击向我表明,具有空值的CLIENTUILEVEL是正常的,并且REMOVE = ALL正在运行。这些评论表明,在日志中稍微有点过时,并找出卸载(删除现有产品)失败的原因。如果您可以给我发一封完整的日志文件(chrpai@iswix.com),我可以帮您查看。

RemoveExistingProduct standard action

Link to article describing how to interpret Windows Installer log files(见评论)

RemoveExistingProducts running but not uninstalling Options

答案 1 :(得分:0)

我在ManagedMsiExec示例项目中遇到了同样的行为:http://blogs.msdn.com/b/delay/archive/2012/01/09/make-things-as-simple-as-possible-but-not-simpler-managedmsiexec-sample-app-shows-how-to-use-the-windows-installer-api-from-managed-code.aspx

在我的情况下,更改我的应用程序的日志记录行为没有帮助。但在(独立地)注意到日志中相同的“CLIENTUILEVEL = REMOVE = ALL”奇怪之后,我找到了一个解决方法,即在调用MsiDoAction之前显式调用MsiSetProperty并将CLIENTUILEVEL设置为0.

在我看来这是Windows Installer本身的一个错误(在RemoveExistingProducts期间错误地设置了CLIENTUILEVEL),但也许还有其他事情我不明白。无论如何,我已经成功应对这一变化,也许其他人也可以。 :)